社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 3043阅读
  • 1回复

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 +XU$GSw3(  
%0ll4"  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 eZ8Y"i\!y  
{f@xA  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 XPc9z}/(e  
*tq|x[<  
o*O "\/pmF  
二、头文件的作用 OH-~  
F8|5_214'  
加强安全检测 1+16i=BF)  
6T{o3wc;  
通过头文件可能方便地调用库功能,而不必关心其实现方式 L]/\C{}k  
]X >QLD0W  
+(QMy&DtS  
三、* , &修饰符的位置 Q7 0**qm  
>/kPnpJ  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 "6I-]:K-  
P-E'cb%ub  
VurP1@e&  
四、if语句 `&|l;zsS  
'-nuH;r  
不要将布尔变量与任何值进行比较,那会很容易出错的。 Ovaj":L  
3]:p!Y`$  
整形变量必须要有类型相同的值进行比较 By51dk 7  
S5*~r@8h  
浮点变量最好少比点,就算要比也要有值进行限制 c{]r{FAx9o  
&9RW9u "  
指针变量要和NULL进行比较,不要和布尔型和整形比较 p5twL  
x8SM,2ud  
_Cv[`e.  
五、const和#define的比较 *uI hxMX  
vUo.BA#;.b  
const有数据类型,#define没有数据类型 v2Qc}o  
t9f4P^V`  
个别编译器中const可以进行调试,#define不可以进行调试 0aTEJX$iZ  
,<^tsCI  
在类中定义常量有两种方式 4t%:O4 3e  
t]u(jX)  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 3IJI5K_  
T;4gcJPn"M  
2、 用枚举代替const常量。 !7Yt`l$$z  
lt2Nwt0bv  
FkJ>]k  
六、C++函数中值的传递方式 !Z+*",]_  
5ykk11!p$  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) ard3yNQt  
U!;aM*67  
void fun(char c) //pass by value =7J|KoKK  
:C|>y4U&(s  
void fun(char *str) //pass by pointer g'}`FvADi  
u]]5p[ |S  
void fun(char &str) //pass by reference [)J49  
Vlp*'2VO  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 L?D~~Jb  
iZkW+5(  
函数的类型不能省略,就算没有也要加个void ;)= zvr17  
|4p<T! T  
X#Dhk6  
七、函数体中的指针或引用常量不能被返回 ?,i#B'Z^  
sS1J.R  
Char *func(void) o7 @4=m}  
SqA+u/"j2  
{ 1EAVMJ  
*OGXu07 !  
char str[]=”Hello Word”; Gwrx) Mq  
p^zEfLTU  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 %<ptkZK#  
^7s6J {<  
return str; :#W>SO  
zfr(dQ  
} ?%za:{  
QqFfR#  
函数体内的指针变量并不会随着函数的消亡而自动释放 xV n]m9i  
Cs1%g  
Nz>E#.++  
八、一个内存拷贝函数的实现体 a`@<ZsR  
jB/q1vFO  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) X_tW#`  
o+)LcoP u  
{ (;Q <@PZg  
|q!2i  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); Ti@P4:q  
dl7p1Cr  
byte *pbTo=(byte*)pvTo; //防止地址被改变 jK C qH$  
a9@l8{)RX  
byte *pbFrom=(byte*)pvFrom; J,^pt Ql  
K3r>nGLBo  
while (size-- >0) P B6/<n9#  
H:{(CY?t  
pbTo++ = pbForm++; k+Ma_H`  
i:Z.;z$1  
return pvTo; Bn#HJ17/#  
]N(zom_0d  
} Dpp52UnT E  
T`'3Cp$q  
d$?n6|4  
九、内存的分配方式 *l?% o{  
_"w!KNX>(~  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 I|3v&E 1  
T\e)Czz2-  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 s<r.+zqW  
_KkVI7a  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 x4m_(CtK  
|_xiG~  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 "w|k\1D  
IrwF B  
seD+~Y\z  
十、内存分配的注意事项 xX4^nem\G  
z`r4edk3  
用new或malloc分配内存时,必须要对此指针赋初值。 M4hN#0("4  
%C E@}  
用delete 或free释放内存后,必须要将指针指向NULL ubCJZ"!  
aXK%m  
不能修改指向常量的指针数据 7quwc'!  
r+#V{oE_  
= cI\OsV&?  
十一、内容复制与比较 Y`O}]*{>8R  
1\608~ZH  
//数组…… k}0  
"6NNId|Y  
char a[]=”Hello Word!”; M"$RtS|h  
{u=\-|t  
char b[10]; n$![b_)*  
DwrCysIK  
strcpy(b,a); ?e_}X3{  
R?9Plzt5  
if (strcmp(a,b)==0) K{w=qJBM  
k;:u| s8NS  
{} \FY De  
XOU-8;d  
//指针…… eg~^wi  
q}A3"$-F  
char a[]=”Hello Word!”; BK\~I  
"$"mWF-  
char *p; MVL }[J  
tA u|8aL  
p=new char[strlen(a)+1]; B?YfOSF=5  
"vRqtEBO@  
strcpy(p,a); gMK3o8B/  
dv9Pb5i  
if (strcmp(p,a)==0) a5~C:EU0  
.idl@%  
{} 3{L vKe  
+VW]%6 +  
?QIQ,?.  
十二、sizeof的问题 <sFf'W_3{  
x2&! PpM  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 xY'YbHFz  
"N/K*  
char a[]=”Hello World!” 1H[;7@o$e  
QEHZ=Yg%3  
char *p=a; vAhO!5]>\  
gLxy RbVI  
count<<sizeof(a)<<end; //12字节 hE#8_34%s  
_C8LK.M#j  
count<<sizeof(p)<<endl; //4字节 <fxjj  
J&Qy$itqg  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 {}C7VS1  
-Jrc'e4K  
void fun(char a[1000]) 1:s~ ]F@  
;Wh[q*A  
{ 0|Ft0y`+  
!9cPNIi  
count<<sizeof(a)<<endl; //输出4而不是1000 +~{nU'  
^yZSCrPGI  
} u]-El}*[  
K~%5iVO~\  
U"kK]Stk<  
十三、关于指针 ]G&\L~P  
l YA+k5  
1、 指针创建时必须被初始化 %|* y/m  
k#+^=F^)I  
2、 指针在free 或delete后必须置为NULL cCKda3v!O  
*ik)>c_  
3、 指针的长度都为4字节 B=/=U7T  
>Ez}r(QQ^  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 daJ-H  
M6Z`Pwv];  
char *p=new char[100]; acZ|H  
95&sFT C  
strcpy(p,”Hello World”); J 2~B<=V  
4i&!V9@:  
delete []p; //注意前面的[]号 pR7G/]U$A  
ct/THq  
p=NULL; AG%es0D[H  
{cHTg04  
5、数组指针的内容不能超过数组指针的最大容易。 EMH}VigR  
tl^;iE!-  
如: s/^= WV  
DYk->)   
char *p=new char[5]; h4xdE 0  
62'0)Cy^  
strcpy(p,”Hello World”); //报错 目标容易不够大 XxQ2g&USk  
=,Um;hU3r  
delete []p; //注意前面的[]号 Ds5&5&af  
^o<Nz8  
p=NULL; 8(K~QvE~  
]@]"bF!Dn  
B>L^XGq  
十四、关于malloc/free 和new /delete Z{)|w=  
#!j&L6  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 sJYX[  
yf>,oNIAg  
l 注意:malloc/free是库函数,new/delete是运算符 1@@]h!>k:  
g+{MvSj$  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 ?UIb!k>  
1:V/['|*g)  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 LYKm2C*d  
t~#+--(  
l 两者都必须要成对使用 `b$I)UUm  
ViONG]F  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 L7="!I  
r2`?Ta  
aq**w?l  
十五、C++的特性 TK1M mL  
5Z0x2 jV  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 w8zQDPVB%  
N.J:Qn`(  
重载和内联:即可用于全局函数,也可用于类的成员函数; EE{%hGb  
sA j$U^Gp  
Const和Virtual:只可用于类的成员函数; 1x 8]&  
:udZfA\sW  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 a[#BlH  
tjL#?j  
覆盖是指派生类函数覆盖基类函数 wQ95tN  
yZ6X$I:C  
函数名相同; PSvRO% &  
cZi&L p  
参数相同; artS*fv3r  
N4FG_  N  
基类函数必须有Virtual关键字; 'a9.JS[pj  
u(qpdG||7  
不同的范围(派生类和基类)。 !1]xKNp ]  
eVJL|uI|  
隐藏是指派生类屏蔽了基类的同名函数相同 P=g+6-1  
KJ |1zCM  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 *V+fRN4 W  
'/@VG_9L]  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 oOw"k*,h:S  
^ `9OA`2  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 g M.(BN  
iE{SqX  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 3?<vnpN=5d  
{K}+$jzGVt  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 #]a0 51Y  
q\G@Nn^  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: -rrg?4  
gNBI?xs`p  
将void Func(A a) 改为void Func(const A &a)。 EyiM`)!5  
34:=A0z  
而void func(int a)就没必要改成void func(const int &a); DtX{0p<T3  
!o7. L%S  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 Iu]P^8  
HkCme_y"  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 e&kg[jU  
{643Dz<e  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; qyC"}y-  
T!AQJ:;1  
A#{*A  
十六、extern“C”有什么作用? o! N@W  
*0tNun 5=3  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 r>OE[C69  
9)`wd&!  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 TlJF{ <E  
nfU}ECun4  
LNW p$"  
十七、构造函数与析构函数 _7VU ,  
fNumY|%3  
派生类的构造函数应在初始化表里调用基类的构造函数; MDZb|1.AT  
0 $r{h}[^c  
派生类和基类的析构函数应加Virtual关键字。 5VS<I\o}  
R8]bi|e)  
不要小看构造函数和析构函数,其实编起来还是不容易。 IB<ihk  
bjZ?WZr  
#include <iostream.h> Ea 1>]V  
ud1E@4;qf  
class Base T/nRc_I+^B  
6{ Eh={:b  
{ 9lwg`UWl,  
mD:!"h/  
public: ]cK@nq)  
4D5)<3N=d'  
virtual ~Base() { cout<< "~Base" << endl ; } <U";V)  
16U@o>O  
}; %\u>%s <9  
x4(WvQ%O#  
class Derived : public Base ?uLqB@!2  
v,! u{QP  
{ sT ONkd  
hi%>&i*  
public: p_( NLJ%  
MH-,+-Eq  
virtual ~Derived() { cout<< "~Derived" << endl ; } ! `o =2b=N  
>{[J+f{~|  
}; ">7 bnOJ  
A.Njn(z?Lz  
void main(void) j&r5oD;  
ofV{SeD67  
{ /$KW$NH4z  
pbNVj~#6  
Base * pB = new Derived; // upcast 4-AmzU  
Qoc-ZC"<6  
delete pB; TqC"lO>:Q  
p}\!"&,^m  
} !!AutkEg>  
uu:BN0  
输出结果为: =:lacK(0  
o5d)v)Rx=  
~Derived 9 (Z)c  
QGa"HG5NF  
~Base bk|>a=o3  
I[/u5V_b'  
如果析构函数不为虚,那么输出结果为 B7 T+a  
W#$rC<Jh]  
~Base asb") NfIm  
"Y6 f.rB  
V_:/#G]jeG  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 W NCdk$  
L=>N#QR7  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
级别: 经院高中
发帖
302
铜板
1924
人品值
102
贡献值
0
交易币
0
好评度
294
信誉值
0
金币
0
所在楼道
只看该作者 1 发表于: 2006-08-17
我看不懂~```````
物尽天长的日子,希望如同电视剧看了一集又一集,等到剧终了,才发现终结是如此不舍而无奈。
描述
快速回复

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八