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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 Lp \%-s#5s  
lA4Bq  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 ;z9(  
NVnKgGlHgd  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 /HNZwbh]uJ  
"9[K  
>4d2IO1\  
二、头文件的作用 MwxfTH"wi  
z]k=sk  
加强安全检测 Ne]/ sQ0  
; y#6Nx,:  
通过头文件可能方便地调用库功能,而不必关心其实现方式 -=E/_c;  
yG0Wr=/<?  
mI=^7 'Mk  
三、* , &修饰符的位置 b'$j* N  
;8~`fK  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 XR^VRn6O  
A a2*f[  
r +] J {k  
四、if语句 EX>|+zYL  
P,"z  
不要将布尔变量与任何值进行比较,那会很容易出错的。 S^ ?OKqS  
;G.m;5A  
整形变量必须要有类型相同的值进行比较 %r5&CUE5?  
`4cs.ab  
浮点变量最好少比点,就算要比也要有值进行限制 r'hr 'wZ  
#R|M(Z">q  
指针变量要和NULL进行比较,不要和布尔型和整形比较 laM0W5  
g1\4Jb  
u[U~`*i*rA  
五、const和#define的比较 do{#y*B/g!  
nzDS  
const有数据类型,#define没有数据类型 I~S`'()J  
6|#^4D)  
个别编译器中const可以进行调试,#define不可以进行调试 f8! PeQ?  
l;L&ijTQD  
在类中定义常量有两种方式 oll~|J^sg  
)_T[thf]  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; Sv-}w$  
2 G_*Pqc  
2、 用枚举代替const常量。 a#1LGH7E8  
`sN3iD!@R  
 ew4IAF  
六、C++函数中值的传递方式 @hm %0L  
TE*$NxQ 2  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) 0+8ThZ?n  
%_1~z[Dv  
void fun(char c) //pass by value /-$`GT?l  
Fm-W@  
void fun(char *str) //pass by pointer 3h"; 2  
O6;>]/`  
void fun(char &str) //pass by reference m7kDxs(KO  
U:MkA(S%c  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 <_ */  
_\"P<+!  
函数的类型不能省略,就算没有也要加个void N{/q p  
X3]E8)645N  
yQhrPw> m  
七、函数体中的指针或引用常量不能被返回 !j4C:L3F  
P1 (8foZA  
Char *func(void) > Q@*o  
m[oe$yH  
{ N>Y`>5  
F4 Ft~:a  
char str[]=”Hello Word”; U3lr<(r*  
|i?AtOt@f  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 p`1d'n[  
|gxU;"2`5~  
return str; 2{p`"xX  
\\hZlCV,  
} M)EKS  
=Mn! [  
函数体内的指针变量并不会随着函数的消亡而自动释放 uh#PZ xnP  
P>pkLP} Vo  
#Opfc8pm'  
八、一个内存拷贝函数的实现体 2t[c^J  
Z6>:k,-Ot  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) )\^o<x2S  
:v{ $]wg  
{ #TW$J/Jb  
ADv a@P  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); M|d[iaM,  
8)"KPr63M  
byte *pbTo=(byte*)pvTo; //防止地址被改变 YhLtf(r  
6{lWUr  
byte *pbFrom=(byte*)pvFrom; o;];ng  
r.i.w0B(  
while (size-- >0) lu(G3T8  
(P`{0^O"}  
pbTo++ = pbForm++; 8ZG'?A+{  
#4na>G|  
return pvTo;  TWx<)  
YXI DqTA+  
} FN,0&D}`  
?]9uHrdsN}  
.[ 1A  
九、内存的分配方式 Q=PaTh   
U"m!f*a  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 kP;:s  
:jp?FF^j;  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 6-KC[J^Xo  
wmo'Pl  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 QwT ]| 6>  
bk6$+T=>  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 +o'. !sRH  
oN `tZ;a  
Z7.)[ ;  
十、内存分配的注意事项 E 3I'3  
-'}iK6  
用new或malloc分配内存时,必须要对此指针赋初值。 /WHhwMc!  
p Hg8(ru|  
用delete 或free释放内存后,必须要将指针指向NULL lh#GD"^(w&  
wkJB5i^<w  
不能修改指向常量的指针数据 B.P64"w  
Qgx~'9   
,s)~Y p?<  
十一、内容复制与比较 @{CpC  
e#nTp b  
//数组…… !@YYi[Gk  
iT5H<uS  
char a[]=”Hello Word!”; TS[Z<m  
b$$XriD]  
char b[10]; wd#AA#J;*  
/XMmE  
strcpy(b,a); GrQl3 Xi  
8V|-BP5^  
if (strcmp(a,b)==0) jQ^Ib]"K  
HJcZ~5jf  
{} >8 JvnBFx=  
Bp/8 >E O`  
//指针…… GzB%vsv9 5  
"V^jAPDXb  
char a[]=”Hello Word!”; %[Ds-my2  
I^ >zr.z A  
char *p; &9ZIf#R  
H~G=0_S  
p=new char[strlen(a)+1]; CqX%V":2  
 aZ0H)  
strcpy(p,a); \!^o<$s.G  
Aj`4uFhiL  
if (strcmp(p,a)==0)  C|lMXp\*  
unX^MPpw  
{} }jk^M|Z"Oz  
>{??/fBd-  
>b$<lo  
十二、sizeof的问题 ;< ][upn  
dY|jV}%T  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 hqds T  
_ x'StD  
char a[]=”Hello World!” +nZG!nP  
#-f^;=7  
char *p=a; 5-3gsy/Mo  
^7''x,I  
count<<sizeof(a)<<end; //12字节 .XE]vo  
?#[K&$}  
count<<sizeof(p)<<endl; //4字节 l2v}PALs  
3AL.UBj&}  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 $I/p6  
Y$Ke{6 4  
void fun(char a[1000]) /vV 0$vg  
.Lp-'!i  
{ e=R} 4`  
.cabw+& 7  
count<<sizeof(a)<<endl; //输出4而不是1000 <5#e.w  
:_H88/?RR  
} *&PgDAQ  
n^%u9H  
vJ'ho  
十三、关于指针 s6]f#s5o  
bc"N  
1、 指针创建时必须被初始化 POG5x  
+O H."4Z  
2、 指针在free 或delete后必须置为NULL V& nN/CF  
.=FJ5?:4i%  
3、 指针的长度都为4字节 #Nd+X@j  
z7_./ksQ  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 B>mQ\Q  
<>:kAT,sP  
char *p=new char[100]; M@K[i*e  
5a~1RL  
strcpy(p,”Hello World”); I|5OCTu  
={Hbx> p  
delete []p; //注意前面的[]号 aF=VJ+5  
o MAK[$k;  
p=NULL; =ht@7z8QM  
EAkP[au.  
5、数组指针的内容不能超过数组指针的最大容易。 L!G3u/  
\[&]kPcDl  
如: ')aYkO{%sb  
X<{m;T `  
char *p=new char[5]; &Xav$6+Z1J  
Ll`apKr  
strcpy(p,”Hello World”); //报错 目标容易不够大 $d=lDN  
z W _'sC  
delete []p; //注意前面的[]号 YH>n{o;- ?  
tc',c},h~,  
p=NULL; k);!H+  
3YRzBf:h  
r__M1 !3  
十四、关于malloc/free 和new /delete %Fv)$ :b  
#?*jdN:  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 hMQ aT-v  
@RP|?Xc{?  
l 注意:malloc/free是库函数,new/delete是运算符 smU+:~  
z)B=<4r  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 >gE_?%a[  
R[c_L=  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 x,%&[ 6(  
S@#L!sT`u  
l 两者都必须要成对使用 3C2 >   
WKf~K4BL>  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 -UVWs2W'$  
8\9EDgT  
7,zARWB!?  
十五、C++的特性 4Rn i7qH  
}NXESZYoi  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 2~<0<^j/]  
{V8Pn2mlo  
重载和内联:即可用于全局函数,也可用于类的成员函数; y ^\8x^Eg  
UQ)}i7v  
Const和Virtual:只可用于类的成员函数; }0( Na  
SD&[K 8-i2  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 f- <6T  
2YyZiOMSc  
覆盖是指派生类函数覆盖基类函数 ?q P }=nJ  
:9b RuUm  
函数名相同; >g&`g}xZQ  
qHCs{ u  
参数相同; X3[!xMij  
)R4<* /C:w  
基类函数必须有Virtual关键字; :m\KQ1sq  
u_B SWhiW  
不同的范围(派生类和基类)。 [XXN0+ /  
W<Lrfo&=Y]  
隐藏是指派生类屏蔽了基类的同名函数相同 g$b*#  
UVK"%kW#(  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 pA'A<|)K0  
4_<Uk  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 sfa'\6=O  
qpl5n'qHUc  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 3_$eQ`AAA  
Ub,unU  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 "}! rM6 h  
F 4/Uu"J:  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 R=PzR;8  
d3GK.8y_z  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: meR2"JN'  
M lFvDy  
将void Func(A a) 改为void Func(const A &a)。 jGn^<T\  
nlW&(cH  
而void func(int a)就没必要改成void func(const int &a); 7o. 'F  
3U)8P6Fz  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 "tM/`:Qp  
Be+:-t)  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 l i-YkaP  
O 0#Jl8  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 9f,:j  
gEP E9ew  
%S.U`(.  
十六、extern“C”有什么作用? m+vEs,W.  
i7V~LO:gq  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 Ao T7sy7  
p( *3U[1  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 Q8?D}h  
EcIQ20Z_-  
\]xYV}(FO  
十七、构造函数与析构函数 W1 Qc1T8  
>nQ yF  
派生类的构造函数应在初始化表里调用基类的构造函数; {M/c!  
Oq6n.:8g"  
派生类和基类的析构函数应加Virtual关键字。 T;@>O^  
]'(7T#  
不要小看构造函数和析构函数,其实编起来还是不容易。 rzDJH:W{2  
4&e@>  
#include <iostream.h> ?LI9F7n  
BA,6f?ktXS  
class Base s.'\&B[  
RWFf-VA?  
{ G:`Jrh  
D}sGBsOW  
public: Cw $^w  
\F~Cbj+'Nu  
virtual ~Base() { cout<< "~Base" << endl ; } G4' U;  
Jr)`shJ"  
}; Q/)ok$A&  
f)Q]{cb6  
class Derived : public Base 'hO;sL  
`aL|qyrq#  
{ KVxb"|[  
4rG 7\  
public: .To:tN#  
sdYj'e:N  
virtual ~Derived() { cout<< "~Derived" << endl ; } JWHt|zB g  
$3[\:+  
}; aLt{X)?  
<0)ud)~u  
void main(void) *)1Vs'!-  
g ypq`F  
{ 7CM03R[P  
o!`O i5  
Base * pB = new Derived; // upcast ><Z3<7K9  
n~u3  
delete pB; {$YD-bqY  
ih |Ky+!  
} F LI8r:  
p''"E$B/(  
输出结果为: +\GZ(!~  
lk1Gs{(qhH  
~Derived @B[Cc`IN"  
\&&(ytL  
~Base ) Zo_6%  
9,f<Nb(\  
如果析构函数不为虚,那么输出结果为 L8wcH  
@[tV_Z%,b  
~Base 8sIA;r%S  
Q4Fq=kTE  
UvJuOh+  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 RS `9?c:  
U q w}4C/0  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
10+5=?,请输入中文答案:十五