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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 [b?[LK}.  
rIhe}1  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 H6vO}pq) r  
y.6Yl**l  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 gz~)v\5D/  
%8]~+ #]p  
EQvZ(-_;4  
二、头文件的作用 ?j:g.a+U  
+vSp+X1E  
加强安全检测 \G~<O071  
fJdTVs@  
通过头文件可能方便地调用库功能,而不必关心其实现方式 ^h5h kIx0  
'ZXd |WI  
*;0Ods+IcY  
三、* , &修饰符的位置 ,QZNH?Cp/  
xV+cX*4h  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 q Q/<\6Sl  
*@-a{T}  
1oSU>I_i  
四、if语句 VS\+"TPuH  
l.Yq4qW  
不要将布尔变量与任何值进行比较,那会很容易出错的。 C"[d bh!  
]T<\d-!CZN  
整形变量必须要有类型相同的值进行比较 t91z<Y|  
5_yu4{@;y  
浮点变量最好少比点,就算要比也要有值进行限制 Z< 4Du  
+W}dO#  
指针变量要和NULL进行比较,不要和布尔型和整形比较 dSkx*#FEE  
-nL!#R{e  
X[;-SXq  
五、const和#define的比较 d+iV19#i  
S4!}7NOh  
const有数据类型,#define没有数据类型 #sJL"GB  
~1g)4g~  
个别编译器中const可以进行调试,#define不可以进行调试 /f Ui2[y  
SbX#$; ks~  
在类中定义常量有两种方式 *vS)aRK  
}n;.E&<[  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 1m\ihU  
EA=EcUf'  
2、 用枚举代替const常量。 Pgh)+>ON  
11Y4oS  
s<b(@L 1  
六、C++函数中值的传递方式 9_&N0>OF  
U3rpmml  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) RGC DC*\  
L8.u7(-#  
void fun(char c) //pass by value zYZ^/7)  
^3 6oqe{  
void fun(char *str) //pass by pointer hI}rW^o^  
Q!`  
void fun(char &str) //pass by reference 0WO-+eRB/  
%&\DCAFk  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 X6 SqOb\(a  
Z-;I,\Y%  
函数的类型不能省略,就算没有也要加个void (! "+\KY  
i^_?C5  
r(i!".Z  
七、函数体中的指针或引用常量不能被返回 ?'%9  
sNbCOTow  
Char *func(void) qV&ai{G:  
_fmOTz G  
{ 9zac[t no  
vIpitbFC  
char str[]=”Hello Word”; \ x>#bql+  
227 Z6#CF!  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 3Jj 3!aDB  
^oH!FN`;{  
return str; Fb^f`UI  
yh{Wuz=T  
} 3+tr_psH  
m`B .3  
函数体内的指针变量并不会随着函数的消亡而自动释放 US2Tdmy@05  
&?(472<f**  
daN#6e4Z+;  
八、一个内存拷贝函数的实现体 NU |vtD  
[D= KI&@&O  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) GGF;4  
"Wz74ble  
{  FtmI\,  
+~l`rJ  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); @(I)]Ca%O  
snti*e4"V  
byte *pbTo=(byte*)pvTo; //防止地址被改变 Rf0F`D k  
}&qr"z4  
byte *pbFrom=(byte*)pvFrom; 0OF]|hH  
nA 5-P}  
while (size-- >0) LAcK%  
Y>a2w zr  
pbTo++ = pbForm++; MB3 0.V/\  
,?(IRiq%  
return pvTo; Wt $q{g{C  
%o4HCzId<  
} \L4+Dv<z  
/aX#j`PrH  
|\] _u 3  
九、内存的分配方式 vm4q1!!(  
/Z m5fw9  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 YdiXj |k+  
HP G*o  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 UukHz}(E  
~RIn7/A  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 1EcXvT=  
n1+,Pe*)  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 bP3S{Jt-|  
^_o9%)RL(  
F]k$O$)0  
十、内存分配的注意事项 zbyJ5~  
xjO((JC  
用new或malloc分配内存时,必须要对此指针赋初值。 s\dhQZw3  
$bo 5:c  
用delete 或free释放内存后,必须要将指针指向NULL /Q*cyLv  
m~U2 L  
不能修改指向常量的指针数据 eHQ3K#M#  
oNa*|CSE>  
& GM&,  
十一、内容复制与比较 vddh 2G  
BBUXoz  
//数组…… "F8A:tR  
8"2X 8C8  
char a[]=”Hello Word!”; .p d_SQ~  
L7 f'  
char b[10]; Wzx Dnd<B  
50J"cGs~  
strcpy(b,a); Q?"-[6[v  
XF=GmkO  
if (strcmp(a,b)==0) Fm,} sP"Qx  
f[$9k}.  
{} dab[x@#r>  
;zZGV4Qc~  
//指针…… {<}kqn83sT  
Ow7}&\;^-  
char a[]=”Hello Word!”; UB&)U\hn  
(y;8izp9!  
char *p; 2O~I.(9(  
XkJzt  
p=new char[strlen(a)+1]; qGgqAF#B  
l: X]$2;  
strcpy(p,a); oN/T>&d  
8E9W\@\  
if (strcmp(p,a)==0) 2(Ez H  
=|G l  
{} glvt umv  
#6 yi  
A! j4;=}  
十二、sizeof的问题 ?]bZ6|;2  
I%q&4L7pj  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 d,0Yi u.p  
r\sQ8/  
char a[]=”Hello World!” l<l6Ey(  
eE'2B."F  
char *p=a; "0yO~;a  
kb>/R/,9  
count<<sizeof(a)<<end; //12字节 beM}({:`  
]\Tcy[5  
count<<sizeof(p)<<endl; //4字节 !b+/zXp3I  
L8zY?v(bG  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 K[( h2&  
&v#*  
void fun(char a[1000]) z9#iU>@  
1*!`G5c,}  
{ *0aU(E #  
6 NJ5v +  
count<<sizeof(a)<<endl; //输出4而不是1000 "77 j(Vs9  
`1$7. ydQ  
} R;*3";+v|:  
N>$Nw<wV  
t6)wR  
十三、关于指针 !pNY`sw}  
ZxRD+`  
1、 指针创建时必须被初始化 1Lf:TQB  
[|\JIr=of5  
2、 指针在free 或delete后必须置为NULL k^IC"p Uc  
Jm+hDZrW  
3、 指针的长度都为4字节 .CL\``  
6jRUkI-!  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ~Z'3(n*9  
|<n+6  
char *p=new char[100]; K8l|qe  
U_UX *  
strcpy(p,”Hello World”); W&U Nk,  
\HzI*|*A  
delete []p; //注意前面的[]号 fi2@`37PM  
<R.5 Ma  
p=NULL; N:y3tpG  
m-Uq6_e  
5、数组指针的内容不能超过数组指针的最大容易。 LI&+5`  
3PEv.hGx  
如: ZMHb  
cI O7RD$8  
char *p=new char[5]; [7~ !M*o9  
JRm:hf'  
strcpy(p,”Hello World”); //报错 目标容易不够大 hK+Iow-  
P>dMET  
delete []p; //注意前面的[]号 8W]6/st?]  
pOCLyM9c  
p=NULL; ,4-)  e  
)k.[Ve  
XZv(B^  
十四、关于malloc/free 和new /delete ~7W?W<  
IQS:tL/  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 N%A[}Y0;MW  
\V|\u=@H  
l 注意:malloc/free是库函数,new/delete是运算符 :/BU-SFK^  
.]qj];m  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 Wh:SZa|  
['MG/FKuv  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 McgTTM;E  
%r0yBK2uOp  
l 两者都必须要成对使用 _91g=pM   
t]~L o3  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 `5[d9z/6  
HXTBxh  
(I d]'w4  
十五、C++的特性 af61!?K  
ey@]B5  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 3%] %c6  
"r!O9X6  
重载和内联:即可用于全局函数,也可用于类的成员函数; ngprTMO$&  
Cg/L/0Ak  
Const和Virtual:只可用于类的成员函数; M1^?_;B  
1nb]~{l  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 W>Eee?  
:A\8#]3  
覆盖是指派生类函数覆盖基类函数 GqXnOmk  
8,pnm  
函数名相同; oZxC.;xJ  
wuCiO;w  
参数相同; %nQii? 1`i  
I @TR|  
基类函数必须有Virtual关键字;  `Nn=6[]  
`H6-g=C  
不同的范围(派生类和基类)。 epsh&)5a*  
`9BZ))Pg  
隐藏是指派生类屏蔽了基类的同名函数相同 ;*^2,_  
QFMR~6 ?  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 0b%"=J2/p.  
{3F;:%$`c  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 45` i  
~Ts^z(v~D2  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 vt@5Hb)  
w Q /IT}-  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 6? I,sZW  
?AC flU_k  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 Umx~!YL!  
hh/C{ l  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: kH'LG!O  
I8;xuutc  
将void Func(A a) 改为void Func(const A &a)。 QOA7#H-m9  
36mp+}R#  
而void func(int a)就没必要改成void func(const int &a); We&~]-b AW  
U~8;y'  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 2Wwzcvs@  
@v^;,cu'8  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 -`nQa$N-  
 xE.K  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; NUBf>~_}  
-j1?l Y  
Vmq:As^a  
十六、extern“C”有什么作用? \$GM4:R D  
mw2/jA7  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 ]X y2km]  
q1!45a  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 {cmY`to  
<d89eV+  
~9%L)nC2'  
十七、构造函数与析构函数 _m.u@+g  
DX>Yf}  
派生类的构造函数应在初始化表里调用基类的构造函数; VfWU-lJ  
/J''`Tf  
派生类和基类的析构函数应加Virtual关键字。 LpCJfQ  
g\_J  
不要小看构造函数和析构函数,其实编起来还是不容易。 DFDlp  
a;a^- n|D  
#include <iostream.h> !'|^`u=eL  
cP#vzFB0>  
class Base >&pB&'A a  
cAFYEx/(  
{ SU>2MT^  
/4Ud6gscf  
public: 1dDK(RBbQ  
AA=zDB<N  
virtual ~Base() { cout<< "~Base" << endl ; } wq K:=  
L=g(w$H  
}; @JB9qT  
HRQ3v`P.  
class Derived : public Base G8bc\]  
{}gx;v)  
{ BwpEIV@b]  
9)P-<  
public: :wWPEhK  
lICpfcc(+  
virtual ~Derived() { cout<< "~Derived" << endl ; } `"@Pr,L   
l9Xz,H   
}; MTI[Mez  
}eKY%WU>O  
void main(void) TS2zzYE6Z  
;iA6[uz  
{ )W,tL*9[  
ZC7ZlL _  
Base * pB = new Derived; // upcast 0iS"V^aH  
vs=8x\W  
delete pB; *vFXe_.  
B\WIoz;'  
} O4`am:@  
3m;*gOLk6  
输出结果为: ?7;_3+T#  
0eJqDCmH  
~Derived "~V|p3  
w?eJVi@w{  
~Base eMT}"u8$A  
JSp V2c5Q  
如果析构函数不为虚,那么输出结果为 4Ny lc.2mi  
6KH&-ffd  
~Base lftT55Tki  
z5njblUz  
KOv?p@d  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 @wVq%GG}  
IA6,P>}N  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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