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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别  :oN$w\A  
Xu[(hT6  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 3fdx&}v/  
TAd~#jB9  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 j*XhBWE?  
^"  
lxVA:tz0  
二、头文件的作用 DERhmJ;>H  
V$OZC;4  
加强安全检测 tV'>9YVdG  
Ja`xG{~Y7i  
通过头文件可能方便地调用库功能,而不必关心其实现方式 Pjvzefp  
=eHoJq  
WciL zx/  
三、* , &修饰符的位置 _/\U  
kuX{2h*`  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 vGIe"$hNh  
#?^%#"~4H  
sFrerv&0  
四、if语句 v-utDQT3  
eI#b%h  
不要将布尔变量与任何值进行比较,那会很容易出错的。 *IGCFZbp41  
X`s6lV%\  
整形变量必须要有类型相同的值进行比较 / %9DO  
dm:2:A8^  
浮点变量最好少比点,就算要比也要有值进行限制 CW+]Jv]"  
c04;2gR  
指针变量要和NULL进行比较,不要和布尔型和整形比较 !:^?GN#~x  
o1k X`Eu  
C)z?-f  
五、const和#define的比较 R?Ou=p .  
S A\_U::T  
const有数据类型,#define没有数据类型 n mN3Z_  
pl4:>4l/  
个别编译器中const可以进行调试,#define不可以进行调试 ey/=\@[p  
Uv|?@zy#  
在类中定义常量有两种方式 K'@lXA:  
lK2=[%,~  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; iTu~Y<'m  
FPC^-mD  
2、 用枚举代替const常量。 Hgk@I;  
*~%QXNn`  
+YFAZv7`  
六、C++函数中值的传递方式 &`LR{7m  
,bRYqU?#0  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) \; FE@  
j0.E!8Ae{  
void fun(char c) //pass by value 7 ~9Lj  
']__V[  
void fun(char *str) //pass by pointer t wr-+rm2  
a)qlrtCl  
void fun(char &str) //pass by reference k )=Gyv<  
i[O{ M`Z%  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 "IA :,j.#g  
Wi"3kps q  
函数的类型不能省略,就算没有也要加个void {+CBThC  
1x3>XN]a  
FE4P EBXvu  
七、函数体中的指针或引用常量不能被返回 \<kQ::o1y  
,w|Or}h]7  
Char *func(void) Lyy:G9OV  
9lR-  
{ T/nG\WZbZn  
~LU$ no^  
char str[]=”Hello Word”; {9;x\($&a  
r-'CB  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 Lz:Q6  
"59"HVV  
return str; iu.$P-s  
`s|^  
} '&<saqA  
Dk#4^`qp1  
函数体内的指针变量并不会随着函数的消亡而自动释放 3ahbv%y  
l", X  
VxqoE]Dh  
八、一个内存拷贝函数的实现体 Prqr,  
HvJ-P#  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) f|NWn`#bY  
3( o~|%  
{ ^"GDaMF  
C)(/NGf  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); -40s  
[+(fN  
byte *pbTo=(byte*)pvTo; //防止地址被改变 eQ80Kf~  
/?B%,$~  
byte *pbFrom=(byte*)pvFrom; .gs:.X)TG9  
w1:%P36H  
while (size-- >0) dCO7"/IHW  
Nf1&UgX  
pbTo++ = pbForm++; <uXQT$@?  
3!Cab/T  
return pvTo; (P|k$S?m  
6e4A| <  
} ur JR[$p  
q?=_{oH9  
"VI2--%v3  
九、内存的分配方式 ~ea&1+Z[3  
@tVl8]y  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 iXD=_^^o .  
*zl-R*bM$  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 dhmrh5Uf  
l *]nvd_  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 ?(E?oJ)(  
CW'<Nh  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 o!sHK9hvJ)  
3 adF) mh  
x%OJ3Qjj=  
十、内存分配的注意事项 NUM+tg>KM  
Igb%bO_  
用new或malloc分配内存时,必须要对此指针赋初值。 Bs';!,=  
Dfw%Bu  
用delete 或free释放内存后,必须要将指针指向NULL F0tx.]uS  
)O$T; U  
不能修改指向常量的指针数据 m?]= =9  
A}MF>.!}C  
OJ,Z  
十一、内容复制与比较 <59G  
1)!?,O\ey  
//数组…… u=& $Z  
+W#["%kw  
char a[]=”Hello Word!”; f1X]zk(=W  
M(#]NTr ~4  
char b[10]; z]n&,q,5g  
"fWm{;  
strcpy(b,a); BBHoD:l  
?RU_SCp-  
if (strcmp(a,b)==0) V u1|5  
z.0!FUd  
{} f\c%G=y  
AN4(]_ ]  
//指针…… e*hCf5=-  
Rkh ^|_<!  
char a[]=”Hello Word!”; ({9P, D~2  
R~d{Yv  
char *p; 2br~Vn0N  
8Lh[>|~=  
p=new char[strlen(a)+1]; "Tc[1{eI  
g<5G#  
strcpy(p,a); =8 01nZJ  
oxJ#NGD  
if (strcmp(p,a)==0) <:I]0|[  
=(W l'iG   
{} am# (ms  
u%rB]a$/  
A\T9>z^k  
十二、sizeof的问题 /V f L(  
V(<(k,8=  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 :?z E@Ct  
$Y<(~E$FX  
char a[]=”Hello World!” VQHQvFRZ)  
T[]kun  
char *p=a; "MU)8$d  
g%2twq_  
count<<sizeof(a)<<end; //12字节 i=j4Wg,{J  
e3x;(@j  
count<<sizeof(p)<<endl; //4字节 | sZu1K  
*tL1t\jY  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 8b:\@]g$  
tqT-9sEXX.  
void fun(char a[1000]) egy#8U)Z  
iYl$25k/1  
{ k80!!S=_>  
HK!Vd_&9,  
count<<sizeof(a)<<endl; //输出4而不是1000 eKek~U&  
V'XvwO@  
} BRGTCR  
~AG."<}  
~[9(}UM  
十三、关于指针 a@U0s+V&a0  
XIJ{qrDr  
1、 指针创建时必须被初始化 @AAkEWo)_  
"f3KE=cUm  
2、 指针在free 或delete后必须置为NULL Rhil]|a/  
W(&9S[2  
3、 指针的长度都为4字节 V0'_PR@;  
rCFTch"  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ]6 vqgu  
I6,sN9` K  
char *p=new char[100]; O.~@V(7ah  
'P5|[du+  
strcpy(p,”Hello World”); 6 &)fZt  
b1`(f"&l  
delete []p; //注意前面的[]号 2gbMUdpp  
Il9pL~u  
p=NULL; @C fxPA  
"J CvsCe  
5、数组指针的内容不能超过数组指针的最大容易。 Nd.Tda!Kg  
.4-I^W"1  
如: ua!g}m~  
ViG4tb  
char *p=new char[5]; ljo^ 2  
'L0{Ed+9  
strcpy(p,”Hello World”); //报错 目标容易不够大 W!G2$e6  
 zOnQ656  
delete []p; //注意前面的[]号 OY/sCx+c  
r` T(xJ!)  
p=NULL; 63?fn~0\  
bs_"Nn?  
wh<s#q`  
十四、关于malloc/free 和new /delete &]2z)&a  
044*@a5f  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 #815h,nP+  
fjAJys)Q  
l 注意:malloc/free是库函数,new/delete是运算符 Nl^{w'X0h  
ToHCS/J59  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 6!}tmdzR  
G;%Pf9 o26  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 S6sw)  
c=T^)~$$  
l 两者都必须要成对使用 y'<juaw  
7gV"pa  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 YJ`[$0mam  
+{j? +4(B  
Pe !eID8  
十五、C++的特性 RJ_ratKN*g  
'sL>U$(  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 ZN2g(  
y^gazr"  
重载和内联:即可用于全局函数,也可用于类的成员函数; !(hP{k ^g  
q(Y<cJ?X  
Const和Virtual:只可用于类的成员函数; d/GP.d  
qYW{$K  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 Lj$yGdK<  
r'p;Nj.  
覆盖是指派生类函数覆盖基类函数 {37DrSOa  
Xz=MM0o  
函数名相同; PZF>ia}  
.6[xX?i^T  
参数相同; 7"r7F#D=G  
! G%LYHx  
基类函数必须有Virtual关键字; W9?Yzl  
,XW6W&vR;  
不同的范围(派生类和基类)。 @\_ tS H  
*_$%Tv.]  
隐藏是指派生类屏蔽了基类的同名函数相同 q0 :Lb  
S zOB{  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 9jiZtwRpk  
)@3ce'  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 &tKs t,UR8  
-pj&|< h+9  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 MjG=6.J|`  
I<.3"F1}  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 O!z H5  
,SJB 3if  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 ;0}$zy1EZ  
J W&/l  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: UUv&X+ Y  
o:#MP(h,N  
将void Func(A a) 改为void Func(const A &a)。 FpfOxF6A3  
O!sZMGF$p  
而void func(int a)就没必要改成void func(const int &a); q+t*3;X.  
K2L+tw  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。  KEsMes(*  
>E?626*  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 -<}_K,Ky`  
A75IG4]  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; !:`QX\Ux  
L1.<LB^4'  
~LHG  
十六、extern“C”有什么作用? @g""*T1:$  
br<,?  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 .0#?u1gXsX  
9wC q  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 bR49(K$~  
iO3@2J  
sxl29y^*  
十七、构造函数与析构函数 F)lDK.  
d/- f]   
派生类的构造函数应在初始化表里调用基类的构造函数; pF#nj`L  
j,Qp*b#Qo  
派生类和基类的析构函数应加Virtual关键字。 WU{G_Fqaz  
 HlPf   
不要小看构造函数和析构函数,其实编起来还是不容易。 +K;(H']Z<-  
4'?kyTO~  
#include <iostream.h> g-meJhX%  
MaXgy|yB1  
class Base n'1pNL:  
[st4FaQ36  
{ LnxJFc:1K  
me$ 7\B;wy  
public: ,K6s'3O(LW  
xg/3*rL  
virtual ~Base() { cout<< "~Base" << endl ; } L=VJl[DL  
tV@!jaj\  
};  B@A3T8'  
%[-D&flKC  
class Derived : public Base :|M0n%-X  
F.?^ko9d  
{ d5\w'@Di  
W'-B)li   
public: pqBd#  
w=s:e M@  
virtual ~Derived() { cout<< "~Derived" << endl ; } !BP/#  
vR3'B3y  
}; x;99[C!$  
hoD (G X  
void main(void) tVvRT*>Wb  
9h<];  
{ BYyR-m  
sikG}p0mx<  
Base * pB = new Derived; // upcast CQW#o_\  
|#LU"D  
delete pB; D4ESo)15'  
7;) T;X  
} p2GkI/6)uu  
kKr7c4q  
输出结果为: r;g[<6`!S  
!<Ma9%uC{  
~Derived )AEJ` xC  
|`1lCyV\tE  
~Base y$Sn3_9 V  
4%LGP h  
如果析构函数不为虚,那么输出结果为 [ p$f)'  
NGOc:>}k>  
~Base `|P fa  
[`BMi-WQ  
uPr'by  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 zt/b S/  
1N{}G$'Go  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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