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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 #w[q.+A  
!c3Qcva  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 X}ey0)g%  
loAfFK>g  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 (dw3'W  
hv_pb#1Ks  
0Te)s3X  
二、头文件的作用 S.?\>iH[  
|>m# m*{S  
加强安全检测 ?ZD{e|:u  
rVc zO+E  
通过头文件可能方便地调用库功能,而不必关心其实现方式 NG4eEnic!a  
QqT6P`0u  
&eLQ;<qO*|  
三、* , &修饰符的位置 %m0L!|E  
;RTrRh0v  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 0|qx/xo|-  
]-+.lR%vd9  
D:S6Mu  
四、if语句 Gff[c%I  
hA&j?{  
不要将布尔变量与任何值进行比较,那会很容易出错的。 UGezo3}  
H_xQ>~b  
整形变量必须要有类型相同的值进行比较 ~ Iu21Q(*  
D{3 x}5  
浮点变量最好少比点,就算要比也要有值进行限制 %s&E-*X  
&,6y(-  
指针变量要和NULL进行比较,不要和布尔型和整形比较 t8a@L(J$  
3HDnOl8t  
._F 6-pl  
五、const和#define的比较 ft. }$8vIT  
~L Bq5a  
const有数据类型,#define没有数据类型 VAG+y/q  
zN8&M<mTl  
个别编译器中const可以进行调试,#define不可以进行调试 : p*ojl|  
dcc%G7w  
在类中定义常量有两种方式 >(1_Dn\  
d"e%tsj  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; OL6xMToP  
Xk$l-Zfse  
2、 用枚举代替const常量。 Ot8S'cB1,$  
%o _0M^3W  
g)| ++?  
六、C++函数中值的传递方式 ?AM 8*w  
:w&)XI34  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) ~*Sbn~U  
%I2xK.8=  
void fun(char c) //pass by value &xMJ^Nv  
X?k V1  
void fun(char *str) //pass by pointer 4q 2=:"z4  
M}KM]<  
void fun(char &str) //pass by reference <^X'f  
fuIv,lDA  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 \Z7([Gh  
o\:f9JL  
函数的类型不能省略,就算没有也要加个void 7! A%6  
f 7QUZb\  
eL$U M  
七、函数体中的指针或引用常量不能被返回 Kr}M>hF+|  
c#4L*$ViF  
Char *func(void) B$[%pm`'2  
$y]||tX  
{ ?}lpo; $  
~IJZM`gN  
char str[]=”Hello Word”; >7v.`m6?H  
g  cK"  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 N@du.d:  
1p "EE~ v  
return str; nluyEK  
4\eX=~C>:  
} :pF]TY"K.  
O]r3?=  
函数体内的指针变量并不会随着函数的消亡而自动释放 la"A$Tbu~  
G*w W&R)  
re 1k]  
八、一个内存拷贝函数的实现体 g:3'x/a1  
A>1p]#  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) ]3 8<ly7  
j7HlvoZV  
{ ~RLx;  
))+9 8iU1s  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); <[B[  
=rO>b{,hs  
byte *pbTo=(byte*)pvTo; //防止地址被改变 o:Os_NaD  
{@F["YPxy  
byte *pbFrom=(byte*)pvFrom; 5`{;hFl  
7[.Q.3FL  
while (size-- >0) i11GW  
,5+X%~'  
pbTo++ = pbForm++; j'Q-*-3  
{'Qk>G s  
return pvTo; "i<3}6/*  
MHT,rqG  
} sq (063l  
en#g<on  
)PoI~km  
九、内存的分配方式 Y1ilH-8  
S%gO6&^  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 OFL+Q~~C  
j6 d"8oH _  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 byj mH  
V-U  ^O45  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 lXk-86[M  
2WECQl=r  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 a:%5.!Vd  
hv8[_p`>  
{hq ;7  
十、内存分配的注意事项 ci NTYow  
j[Zni D  
用new或malloc分配内存时,必须要对此指针赋初值。 xW;[}t-QS  
}br<2?y,  
用delete 或free释放内存后,必须要将指针指向NULL o/[yA3^  
8\V>6^3CD$  
不能修改指向常量的指针数据 e]B<\i\T  
'e)ze^Jq  
_wJ#jJz2  
十一、内容复制与比较 y#Sw>-zRq  
0B:{4Lsn&  
//数组…… |3lAye,t)a  
pmD-]0  
char a[]=”Hello Word!”; #LyjJmQ  
*]| JX&  
char b[10]; T2PFE4+Dp  
V5@[7ncVf  
strcpy(b,a); ue:P#] tx  
>W]"a3E  
if (strcmp(a,b)==0) -:p1gg&  
nu%Nt"~[%  
{} Dt'e<d Is  
CZ%"Pqy&1L  
//指针…… SR8Kzk{  
,) jB<`  
char a[]=”Hello Word!”; WHavz0knf[  
5%aKlx9^#  
char *p; jqsktJw#i  
@.@#WHde  
p=new char[strlen(a)+1]; +/lj~5:y  
Q pc^qP^-  
strcpy(p,a); `*9FKs  
*_rGBW  
if (strcmp(p,a)==0) R M+K":p  
0Lz56e'j  
{} AS"|r  
tYNt>9L|  
[>9"RzEl  
十二、sizeof的问题 !4.^@^L|\  
Uk ;.Hrt.  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 [a*>@IR  
]BD5+>;  
char a[]=”Hello World!”  %!h+  
aYCzb7  
char *p=a; (gC^5&11  
V+ ~2q=  
count<<sizeof(a)<<end; //12字节 MCpK^7]k  
$=SYssg7La  
count<<sizeof(p)<<endl; //4字节 ^M5uLm-_s  
P2RL\`<"  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 oOSyOD  
\ iSBLU  
void fun(char a[1000]) ?G<I N)  
v") W@haU  
{ %9)J-B  
%D0Ws9:|  
count<<sizeof(a)<<endl; //输出4而不是1000 $K6`Q4`  
3o/ a8  
} |i}g7  
B&j+fi  
.[85<"C  
十三、关于指针 k6XmBBIj-  
!@1!ld  
1、 指针创建时必须被初始化 -7VV5W  
1c~#]6[  
2、 指针在free 或delete后必须置为NULL e1}0f8%  
 o*1`,n  
3、 指针的长度都为4字节 I _G;;GF  
m 4LM10  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 RA67w&  
> o`RPWs  
char *p=new char[100]; pra&A2Y\  
r:Cid*~m  
strcpy(p,”Hello World”); v!C+W$,T  
Gw,kC{:C  
delete []p; //注意前面的[]号 o[6"XJ  
XYTcG;_z  
p=NULL; HhH'\-[t  
=B%e0M  
5、数组指针的内容不能超过数组指针的最大容易。 FEswNB(]*  
y^BM*CI  
如: !Shh$iz  
r26Wysi~%  
char *p=new char[5]; >maz t=,  
xF+x I6  
strcpy(p,”Hello World”); //报错 目标容易不够大 aV, J_Q6r  
.;6bMP[YA  
delete []p; //注意前面的[]号 K%Ml2V   
g<3>7&^  
p=NULL; 9DKB+K.1  
YHAg4 eb8  
$>m<+nai'  
十四、关于malloc/free 和new /delete ?,>y`Qf*|  
e 3oIoj4o  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 VH65=9z  
KphEw[4/  
l 注意:malloc/free是库函数,new/delete是运算符 DL{a8t1L  
F\<i>LWT'  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 Sp:de,9@  
j`l K}  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 _zwuK1e  
M/;g|J jM  
l 两者都必须要成对使用 .1}(Bywm5  
6 nhB1Aei  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 3W0:0I  
FM];+d0  
b=EZtk6>  
十五、C++的特性 9Ua@-  
/% 1lJD  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 mJT m/C  
8=uljn/  
重载和内联:即可用于全局函数,也可用于类的成员函数; 0[Aa2H*  
h 42?^mV4?  
Const和Virtual:只可用于类的成员函数; ;Yj&7k1  
<0}'#9>O  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 z0Hh8*  
0l*/_;wo  
覆盖是指派生类函数覆盖基类函数 MLX.MUS  
K.Z{4x=0  
函数名相同; |05LHwb>  
@DR&e^Zz  
参数相同; 9hU@VPB~  
=h{2!Ah7 X  
基类函数必须有Virtual关键字; dI|/Xm>  
d0 az#Yg!  
不同的范围(派生类和基类)。 AQZ\Kcr  
} q(0uzaG  
隐藏是指派生类屏蔽了基类的同名函数相同 =QRZ(2Wq  
ZS]e}]Zwp  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 ,55`s#;  
!2}Q9a  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 ,;y^|X  
o 8U2vMH  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 'Ud5;?{  
zFIKB9NUn  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 ]=Q'1%  
Vy $\.2=  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 !5-[kG&  
`R^VK-=C  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: LX'US-B.!  
$'Z!Y;Ue  
将void Func(A a) 改为void Func(const A &a)。 0M p>X  
]gZjV  
而void func(int a)就没必要改成void func(const int &a); {ar }.U  
oGZ9@Y)(T  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 $? Rod;  
q[lqEc  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 pV8,b   
sEa:p: !  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; T}*'9TB  
hV)I C9  
MRc^lYj{  
十六、extern“C”有什么作用? *RO ~%g  
[A47OR  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 sh 1fz 6g  
j06DP _9M  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ?}.(k/  
{U9jA_XX  
Df9}YI ;?  
十七、构造函数与析构函数  Bv3v;^  
"7DPsPs  
派生类的构造函数应在初始化表里调用基类的构造函数; [B[J%?NS  
PZs  
派生类和基类的析构函数应加Virtual关键字。 Z:Wix|,ONS  
yLP0w^Q  
不要小看构造函数和析构函数,其实编起来还是不容易。 M<729M  
dGg+[?  
#include <iostream.h> yY+2;`CH  
Velmq'n  
class Base V4>P8cE  
6`i'  
{ g7pFOcV  
=[,adB  
public: jn[a23;G)  
&qr7yyY  
virtual ~Base() { cout<< "~Base" << endl ; } |oM6(px  
T:-Uy&pBEN  
}; b&ADj8cKC  
* n[6H  
class Derived : public Base ~q/`Z)(yc  
Z` Aiw."|  
{ 6QV/8IX  
,"/_G  
public: R 'F|z{8  
emHi= [!i  
virtual ~Derived() { cout<< "~Derived" << endl ; } HG^8&uh]  
ugCc&~`  
}; FUH1Z+9  
j04Q3d \f  
void main(void) HCP Be2  
q q`Uv U  
{ b"gYNGgX  
*f[`Yv  
Base * pB = new Derived; // upcast ^8 z*f&g  
0e:aeLh  
delete pB; cz0tnF*&  
n_!&Wr^CX  
} !=-l760  
l"- D@]"  
输出结果为: sC#Ixq'ls7  
[)a,rrhj  
~Derived vb%\q sf  
F[+sc Mx!G  
~Base $UH_)Q2#J^  
_WkK%RYV  
如果析构函数不为虚,那么输出结果为 0 cQf_o  
"?Y0Ng[  
~Base c"| ^Lo.  
vEb~QX0~  
<l\FHJhjq  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 AXJC&O}`  
lmod8B  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八