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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 j11\t  
( gO?-0  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 /7*jH2  
lO8.Q"mxo  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 F1R91V|  
5/DTE:M<  
k);z}`7  
二、头文件的作用 HKq 2X4J$  
l9 )iLOj  
加强安全检测 0m)["g4  
E!Hq%L!/  
通过头文件可能方便地调用库功能,而不必关心其实现方式 xq =+M!V  
F/ 2@%,2n  
hSaS2RLF  
三、* , &修饰符的位置 9:A>a3KOH  
'*!R gbj;  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 *jGB/ y  
[6 wI22  
[V{JuG;s  
四、if语句 KoiU\r  
64s+ 0}  
不要将布尔变量与任何值进行比较,那会很容易出错的。 B P"PUl:  
]l+Bg;F#V  
整形变量必须要有类型相同的值进行比较 Xn"n5 =M  
9 f-T>}  
浮点变量最好少比点,就算要比也要有值进行限制 [ar:zl V8  
4DEsB)%X  
指针变量要和NULL进行比较,不要和布尔型和整形比较 cGkl=-oQ'  
R%aH{UhE`  
b@^M|h.Va  
五、const和#define的比较 L;nRI.  
52m^jT Sx  
const有数据类型,#define没有数据类型 ?Li^XONz  
a%tm[Re  
个别编译器中const可以进行调试,#define不可以进行调试 `NXyzT`:K  
dpZ7eJ   
在类中定义常量有两种方式 sxgR;gf6  
_XXK1H x  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 7E Y~5U/4  
\bQ|O7s  
2、 用枚举代替const常量。 7;;W{W%  
ro@Zbm;P  
,M7sOp6}  
六、C++函数中值的传递方式 f Otrn  
|C'w] QYm  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) /2>-h-zBjw  
7zr\AgV9  
void fun(char c) //pass by value U`FybP2R~  
W euV+}\b  
void fun(char *str) //pass by pointer `m3@mJ!>\  
90sMS]a  
void fun(char &str) //pass by reference V==' 7n  
Ms1G&NYP  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 VT3Zo%Xx  
Sx;zvc  
函数的类型不能省略,就算没有也要加个void c/;t.+g  
Lj*F KP\{  
ol!o8M%Q  
七、函数体中的指针或引用常量不能被返回 KblOP{I  
kjaz{&P  
Char *func(void) n#z^uq|v  
|GK [I  
{ ^ eM=h  
1GOa'bxm  
char str[]=”Hello Word”; Cb=r8C  
\^Y#"zXo1  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 Ep5lm zg  
vlyq2>TfR  
return str; (n"  )  
P7egT,Z  
} n,PHfydqX  
]~?k%Mpw  
函数体内的指针变量并不会随着函数的消亡而自动释放 MFW?m,It)  
E>4#j PK  
~pzaX8!  
八、一个内存拷贝函数的实现体 W:(:hT6`j9  
MF 5w.@62X  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) @KOa5-u  
82$By]Y9  
{ eoEb\zJ  
ujz %0Mq;  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); + W@r p#  
Z6D4VZVF  
byte *pbTo=(byte*)pvTo; //防止地址被改变 ^{6Y7T]  
M|n)LyL  
byte *pbFrom=(byte*)pvFrom; %M}zi'qQ?  
rFx2 S  
while (size-- >0) /4_}wi\  
*N>Qj-KAM_  
pbTo++ = pbForm++; =7e8N&-nv  
^]U2Jd  
return pvTo; !-N!8 0  
"3\RJ?eW:S  
} 7e8hnTzl8<  
EHzZ9zH\  
'/sc `(`:0  
九、内存的分配方式 m9L+|r  
H ~ks"D1  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 M<ad>M  
l$zNsf.  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ,1~Zqprn  
//J:p,AF  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 ]G1j\wnF  
t<`ar@}  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 HhqqJEp0  
DVB:8"Bu  
(S2<6Nm8  
十、内存分配的注意事项 $hKgTf?  
\&TTe8  
用new或malloc分配内存时,必须要对此指针赋初值。 E32z(:7M  
ise@,[!  
用delete 或free释放内存后,必须要将指针指向NULL SbGp  
V >['~|  
不能修改指向常量的指针数据 _I8-0DnOM  
*kKGsy  
9txZ6/  
十一、内容复制与比较 Ys<wWfW  
QlXy9-oJ"  
//数组…… Rp@u.C <  
htF&VeIte  
char a[]=”Hello Word!”; (vI7qD_  
Ce0I8B2y  
char b[10]; wz, \zh  
wR;l"*j  
strcpy(b,a); 8p5'}Lq  
VqbiZOZ@  
if (strcmp(a,b)==0) D>|:f-Z6Z  
AGv;8'`  
{} .s!:p pwl  
v,M2|x\r}  
//指针…… t[Q^Xp  
"q(&<+D@  
char a[]=”Hello Word!”; 'P~*cr ?A  
{'b8;x8h  
char *p; O Z#?  
`3+U6>U [  
p=new char[strlen(a)+1]; ^M80 F7  
t%TZu>(1O  
strcpy(p,a); ^#=L?e  
H!Od.$ZIX  
if (strcmp(p,a)==0) 8odVdivh  
xO.7cSqgw  
{} $(NfHIX  
~Fx[YPO,  
uZYeru"w  
十二、sizeof的问题 <]9MgfAe  
lyi}q"Kn*;  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 !e7vc[N  
)a}5\V  
char a[]=”Hello World!” )R|7> 97  
a>kD G <.A  
char *p=a; jqLyX  
RhJ<<T.2  
count<<sizeof(a)<<end; //12字节 D3K`b4YV  
6 %=BYDF  
count<<sizeof(p)<<endl; //4字节 JxvwquI  
=3T?U_u@  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 }+lxj a]C  
Q0--.Q=:Y  
void fun(char a[1000]) :D,YR(])  
ew"Fr1UGYZ  
{ 7&QVw(:)M  
uqyf3bK  
count<<sizeof(a)<<endl; //输出4而不是1000 ry T8*}o  
[a`i{(!  
} 5{5ABV  
x'KsQlI/  
OP&[5X+Y  
十三、关于指针 D!P?sq_5r  
[yyV`&  
1、 指针创建时必须被初始化 o2|(0uN'  
MvW>ktkU  
2、 指针在free 或delete后必须置为NULL 5^Y/RS i  
Ax%BnkU  
3、 指针的长度都为4字节 NV gLq@F  
};j&)M  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 nZT@d;]U9  
"5YdmBy  
char *p=new char[100]; LBE".+  
k|_2aQ02  
strcpy(p,”Hello World”); "4`%NA  
<oO,CXF  
delete []p; //注意前面的[]号 7X|r';"?i  
j{^(TE  
p=NULL; p3S c4  
[s/@z*,M1  
5、数组指针的内容不能超过数组指针的最大容易。 Z])_E 6.  
n,F00Y R  
如: Chua>p!$g  
O)Qz$  
char *p=new char[5]; @( t:E`8  
z(WpOD   
strcpy(p,”Hello World”); //报错 目标容易不够大 e ?YbG.(E9  
y#0w\/<  
delete []p; //注意前面的[]号 uaKB   
3wE8y&  
p=NULL; -b$OHFL  
Q#N+5<]J)#  
1+jYpYEQW  
十四、关于malloc/free 和new /delete .#@Dn(  
m\f_u*  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 (*ng$z Z$  
V\"5<>+O  
l 注意:malloc/free是库函数,new/delete是运算符 [!le 9aNg  
jE#8&P~  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 CwvNxH#LVu  
/RM-+D:Y  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 W,~1KUTc  
s2v*  
l 两者都必须要成对使用 b8>9mKs  
4I*Mc%dD  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 w#T,g9  
 62jA  
C6w{"[Wv=X  
十五、C++的特性 f 99PwE(=  
<<6w9wNon  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 G!8pF  
?nW#qy!R  
重载和内联:即可用于全局函数,也可用于类的成员函数; As|/ O7%  
sQZ8<DpB  
Const和Virtual:只可用于类的成员函数; f>dkT'4  
%?hLo8  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 6W=:`14  
"^z=r]<5  
覆盖是指派生类函数覆盖基类函数 2[po~}2-0  
_|ib@Xbin  
函数名相同; =LxmzQO#  
}NCvaO  
参数相同; W~3tQ!  
BUinzW z{a  
基类函数必须有Virtual关键字; mj=|oIMwT  
BA-nxR  
不同的范围(派生类和基类)。 14!J\`rI  
=on!&M  
隐藏是指派生类屏蔽了基类的同名函数相同 GiXde}bm  
fZ}Y(TG/  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 %>2t=)T  
?MM3LA! <  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 df *#?Ok  
.4> s2  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 &.hRVW(  
|"qB2.[  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 ~C'nBV  
FH8mK)  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 #<Nvy9  
NCnId}BT  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: hxVM]e[  
WN +Jf  
将void Func(A a) 改为void Func(const A &a)。 _|3TC1N$n  
ACO4u<M)  
而void func(int a)就没必要改成void func(const int &a); VtiqAh}4  
 IB{ZE/   
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 WV1 Z  
|HG b.^f?  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 @z)tC@  
""3m!qn#  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; ^YJA\d@  
e[mhbFf-  
,'CWt]OS'  
十六、extern“C”有什么作用? 7&V^BW  
|.O!zRm  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 h5rP]dbhXU  
R.IUBw5;/  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 J xm9@,  
07Q[L'}y@  
FJ~_0E#L  
十七、构造函数与析构函数 :$i:8lz  
MW$H/:3  
派生类的构造函数应在初始化表里调用基类的构造函数; @:+n6  
ef}E.Bl  
派生类和基类的析构函数应加Virtual关键字。 |sqo+E  
?lDcaI>+n  
不要小看构造函数和析构函数,其实编起来还是不容易。 S~Iw?SK3  
^[}0&_L w  
#include <iostream.h> 0j!ke1C&C  
8V|jL?a~  
class Base ;Z1U@2./  
(SsH uNt.  
{ !Vr45l  
=j+oKGkoCa  
public: Ge:-|*F  
6~h1iY_~  
virtual ~Base() { cout<< "~Base" << endl ; } M1 ]6lg[si  
YD46Z~$  
}; "Dl9<EZ  
{IPn\Bka  
class Derived : public Base ;q,)NAr&  
`x$}~rP&)!  
{ 'CX.qxF1;p  
 n22hVw  
public: xcZ%,7  
M&djw`B  
virtual ~Derived() { cout<< "~Derived" << endl ; } s>@#9psm  
2Cd --W+=  
}; T dP{{&'9  
3H'nRK},  
void main(void) FK@ f'  
AIl$qPKj&  
{ oIvnF:c  
lii ]4k+z  
Base * pB = new Derived; // upcast x1:Pj  
52MCUl  
delete pB; 7t-*L}~WA  
`@$"L/AJ  
} B}q  
?$J7%I@  
输出结果为: |c oEBFG  
MeI2i  
~Derived &@W4^- 9  
2&gVZz  
~Base !/4 V^H  
rX!+@>4_L  
如果析构函数不为虚,那么输出结果为 I#S~  
!q-:rW? c  
~Base 762o~vY6$  
yxCM l.  
n4vXm  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 3j+=3n,  
y4/>Ol]  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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