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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 ?\,;KNQr  
T+Re1sPr?  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 &D M3/^70  
+:@^nPfHy  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 P?V+<c{  
5Jo'h]  
s?}qia\~m  
二、头文件的作用 5z0Sns  
A^,u l>!  
加强安全检测 ,JdBVt  
XA#qBxp/h  
通过头文件可能方便地调用库功能,而不必关心其实现方式 Xw9]WJc  
]2m=lt1  
Z0Sqw  
三、* , &修饰符的位置 Z~Q5<A9Jz  
1R8tR#l  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 !O"2)RU1  
[]@@  
y`zdI_!7  
四、if语句 0J'^<G TL  
sZ=!*tb-  
不要将布尔变量与任何值进行比较,那会很容易出错的。 0x~+=GUN  
o(e(| k {  
整形变量必须要有类型相同的值进行比较 ]~]TZb  
_DSDY$Ec  
浮点变量最好少比点,就算要比也要有值进行限制 Zuzwc[Z1  
VgXT4gO!  
指针变量要和NULL进行比较,不要和布尔型和整形比较 (nLzWvN  
m#BXxS#B<_  
EwzcB\m  
五、const和#define的比较 3\Xk)a_  
}Y7P2W+4?  
const有数据类型,#define没有数据类型 _qPKdGoM  
]zj#X\  
个别编译器中const可以进行调试,#define不可以进行调试 7fypUQ:y  
t8RtJ2;  
在类中定义常量有两种方式 eg*aVb  
)8^E{w^D}  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; T^^7@\vDI  
=M?+KbTJ3  
2、 用枚举代替const常量。 bMc[0  
Z#u{th  
q'S[TFMNE  
六、C++函数中值的传递方式 +I uu8t  
}OIe!  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) t"Du  
<UO[*_,\  
void fun(char c) //pass by value ^E/6 vG  
OH>Gc-V  
void fun(char *str) //pass by pointer vUbgSI  
SN"Y@y)=  
void fun(char &str) //pass by reference Mo3%OR  
^/?7hbr  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 |s/Kb]t  
r(wf>w3  
函数的类型不能省略,就算没有也要加个void 40=u/\/K  
4PD5i  
)kjQ W&)g  
七、函数体中的指针或引用常量不能被返回 bJPKe]spJ=  
fPTLPcPP  
Char *func(void) TqN@l\  
k+[oYd  
{ r ts2Jk7f  
4j0;okQWV'  
char str[]=”Hello Word”; 8cZ[Kl%  
FP&Ykx~  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 lGahwn:  
O6$,J1 2l  
return str; S ^~"#   
, SUx!o  
} 7)D[}UXz  
b' ^<0c  
函数体内的指针变量并不会随着函数的消亡而自动释放 E2}X[EoBF  
KJ/Gv#Kj  
&jEw(P&_  
八、一个内存拷贝函数的实现体 5xKod0bA  
pFMJG<W9,  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) OD[=fR|cp  
|a])o  
{ O=}  
p5rq>&"  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); 93Gj#Mk  
IIMf\JdM  
byte *pbTo=(byte*)pvTo; //防止地址被改变 < (9 BO&  
%ho?KU2j  
byte *pbFrom=(byte*)pvFrom; LR.]&(kyd  
ghW`xm87  
while (size-- >0) _)pOkS  
*eXs7"H  
pbTo++ = pbForm++; OSuQ7V  
KgYQxEbIW  
return pvTo; 3bGU;2~}  
/AX)n:,  
} CEkf0%YJ  
p);[;S  
d\Up6F  
九、内存的分配方式 jK\kASwG  
SefF Ci%4  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 yo_zc<  
J s33S)  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 i0\]^F  
rvhMu}.  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 ZX-A}  
{7X9P<<L7  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 jEx8G3EL  
'p!&&.%  
4+>~Ui_#  
十、内存分配的注意事项 pIrL7Pb0  
o4a@{nt^,  
用new或malloc分配内存时,必须要对此指针赋初值。 !+Cc^{  
TG?>;It&  
用delete 或free释放内存后,必须要将指针指向NULL R'F\9eyA  
?^:5`  
不能修改指向常量的指针数据 }|/<!l+;$  
e GAto  
3`3my=   
十一、内容复制与比较 qMVuBv  
TRgj`FG  
//数组…… lM#/F\  
X pK eN2=p  
char a[]=”Hello Word!”; FN26f*/  
p;zT #%  
char b[10]; It'kO jx]  
/3Y"F"`M.  
strcpy(b,a); ~_CZ1  
HYdt3GtJ?  
if (strcmp(a,b)==0) wE9z@\z]  
 R'_F9\  
{} m/g[9Y  
mm!JNb9(  
//指针…… NU.4_cixb  
,{ 0&NX  
char a[]=”Hello Word!”; 3# 0Nd"/0  
P _Gu~B!Y  
char *p; /&=y_%VR  
UY *Z`$  
p=new char[strlen(a)+1]; ze8MFz'm  
'g<FL`iP  
strcpy(p,a); AKLFUk  
Y!c7P,cZ+3  
if (strcmp(p,a)==0) `} 'o2oZnG  
%dd B$(  
{} Xa'b @*o&  
&F0>V o  
P 2x.rukT|  
十二、sizeof的问题 xOxyz6B\  
+:C.G[+  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 )ARV>(  
FgP{  
char a[]=”Hello World!” +*qTZIXj  
Y,4?>:39J  
char *p=a; K.?S,qg  
%gqu7}'  
count<<sizeof(a)<<end; //12字节 Ql}#mC.>/  
sx[mbKj<  
count<<sizeof(p)<<endl; //4字节 ZI :wJU:f  
D_z&G)  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 Ba%b]vp  
`ST;";7!  
void fun(char a[1000]) N4yQ,tG>aa  
LmROG-9  
{ >6(e6/C-9  
\Z/0i|  
count<<sizeof(a)<<endl; //输出4而不是1000 {oo(HD;5  
iqd7  
} 2mthUq9b*  
Hb$wawy<  
J rYL8 1  
十三、关于指针 cKwmtmwB  
nl-tJ.MU"  
1、 指针创建时必须被初始化 L6=5]?B=  
d\ 7OtM  
2、 指针在free 或delete后必须置为NULL 8f&#WIZ  
uF*tlaV6  
3、 指针的长度都为4字节 :G<~x8]k0  
gHvkr?Cg  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 wD pL9q  
lz#@_F|.*  
char *p=new char[100]; Hg(nC*#/Q  
Es:oXA  
strcpy(p,”Hello World”); EF6"PH+J@  
m FC9\   
delete []p; //注意前面的[]号 @G>&Gu;5  
Oh1a'&  
p=NULL; i@YM{FycX  
&xFs0R i(  
5、数组指针的内容不能超过数组指针的最大容易。 j{%'A  
8;,(D# p  
如: `C*psS  
ARB^]  
char *p=new char[5]; 3=lQZi<]%  
cn$0^7?  
strcpy(p,”Hello World”); //报错 目标容易不够大 p!LaR.8]  
u&Xn#f h  
delete []p; //注意前面的[]号 ^12}#I  
+\B.3%\-  
p=NULL; +227SPLd  
!?{%9  
C #@5:$  
十四、关于malloc/free 和new /delete S)@) @3  
TGG-rA6@Lx  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 Bp=BRl  
Y]}>he1/5  
l 注意:malloc/free是库函数,new/delete是运算符 M ~6k[ew  
+oa>k 0  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 <;E>1*K}8  
Z#_VxA>]v  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 $olITe"$g  
G9c2kX.Bf  
l 两者都必须要成对使用 +,0 :L :a  
^;mGOjS  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 rx(z::  
Et"B8@'P  
]K>x:vMKH  
十五、C++的特性 4 eP-yi  
u*!/J R  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 upF^k%<y:  
Dj{t[z]$k  
重载和内联:即可用于全局函数,也可用于类的成员函数; A|0\ct  
b0Fr]oGp  
Const和Virtual:只可用于类的成员函数; nTXM/  
F='rGQK!1  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 BxXP]od  
7|7sA'1 cM  
覆盖是指派生类函数覆盖基类函数 C@FX[:l@-  
|^kfa_d  
函数名相同; 8`  f=E h  
P'CDV3+  
参数相同; -]vPF|  
c9xc@G!  
基类函数必须有Virtual关键字; ,W&::/2<7  
RVe UQ%  
不同的范围(派生类和基类)。 5Og=`T  
A^hFRAg4  
隐藏是指派生类屏蔽了基类的同名函数相同 hQDZ%>  
hX sH9R  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 VZ$FTM^b8  
%N-f9o8  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 Mhj.3nN  
km#Rh^  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 oSqkAAGz\  
79Si^n1\  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 K9N\E"6ZP  
`!iVMTp  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 G~Mxh,aD$>  
.R>4'#8q  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: J |TA12s  
SXfAw)-n  
将void Func(A a) 改为void Func(const A &a)。 ){{]3r  
Snf1vH  
而void func(int a)就没必要改成void func(const int &a); sa>}wz<o  
ZA/:\6gm  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 xp"5L8:C  
JRl`evTS  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 lCMU{)  
q`DilZ]S  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; h$y0>eMWs  
s+yX82Y  
 } h0 )  
十六、extern“C”有什么作用? Qh. : N  
a6fqtkZ x  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 00)=3@D  
jZvQMW  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 /5c;,.hm1R  
]f"l4ay@M  
$s-HG[lX[  
十七、构造函数与析构函数 \+B+M 7  
]@MBE1M  
派生类的构造函数应在初始化表里调用基类的构造函数; C 9:5c@G  
a\m@I_r.N  
派生类和基类的析构函数应加Virtual关键字。 27!9LU  
#=B~} _  
不要小看构造函数和析构函数,其实编起来还是不容易。 &7\q1X&Rr  
>B9|;,a  
#include <iostream.h> w\z6-qa  
^Q$U.sN? R  
class Base MHVHEwr.{  
e+5]l>3)f  
{ K6Gri>Um  
fhZD#D  
public: ;0f?-W?1  
M4:}`p=  
virtual ~Base() { cout<< "~Base" << endl ; } iB,Nqs3 i*  
u.s-/ g  
}; 9e|]H+y  
^"!j m  
class Derived : public Base ]M;aVw<!  
ywRw i~  
{ .(8sa8{N  
]7`)|PJ  
public: -gpF%g`H  
eQUm!9)  
virtual ~Derived() { cout<< "~Derived" << endl ; } *[eh0$  
,mE*k79L6  
}; )Ekp <2B:0  
AW+ q#Is  
void main(void) <"" fJ`7  
D<2|&xaR  
{ .l->O-=  
G=lket6  
Base * pB = new Derived; // upcast _lE0_X|d  
xN +j]L C  
delete pB; dm&vLQVS  
7]~65@%R-&  
} .WR+)^&zz  
+h$) l/>:  
输出结果为: A:3:Cr  
9aE!! (E  
~Derived ~fE6g3  
Zw[A1!T,  
~Base BQ ol>VRu  
t6u01r{~`  
如果析构函数不为虚,那么输出结果为 }!-K)j.  
C>vp oCA  
~Base P2S$Dk_<\X  
av&4:O!  
K 0i[D"  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 D4x~Vk%H  
Ifm|_  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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