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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 $x%3^{G  
_6Ex}`fyJ  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 h~\bJ*Zp  
]t4 9Efw  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 \W^+aNbv=8  
PxqRb  
lQ t&K1m  
二、头文件的作用 +y}4^3Vx^  
J~\`8cds  
加强安全检测 Muhq,>!U  
+x?_\?&Ks  
通过头文件可能方便地调用库功能,而不必关心其实现方式 ]yR0"<W^xO  
\&|zD"*  
^:c:~F6J  
三、* , &修饰符的位置 M=HP!hn  
QvPG 6A]T  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 K5oVB,z)  
Jl,mYFEZ  
>Ei-Spy>Xl  
四、if语句 oH[4<K>  
kO1.27D  
不要将布尔变量与任何值进行比较,那会很容易出错的。 "CS {fyJ  
Iy2KOv@a5  
整形变量必须要有类型相同的值进行比较 9PpPAF  
N[(ovr  
浮点变量最好少比点,就算要比也要有值进行限制 {95z\UE}  
gEejLyOag  
指针变量要和NULL进行比较,不要和布尔型和整形比较 Hg~O0p}[  
n'dxa<F2|  
M-  f)\`I  
五、const和#define的比较 zsQhydTR  
~Sr`Tlp  
const有数据类型,#define没有数据类型 P^1+;dL,D  
2J^jSgr50d  
个别编译器中const可以进行调试,#define不可以进行调试 (l|:$%[0  
FIB 9W@oao  
在类中定义常量有两种方式 ` 0YI?$G1  
n+C,v.X  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; W6b5elH@  
r306`)kX  
2、 用枚举代替const常量。 (#4   
Z#n!=k TTm  
b r"4 7i  
六、C++函数中值的传递方式 D@M ZTb  
!9$xfg }  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) UuNcBzB2d  
z}Qt6na]-  
void fun(char c) //pass by value pH?tr  
QQ+?J~  
void fun(char *str) //pass by pointer gC}r$ZB(  
+m> %(?=A  
void fun(char &str) //pass by reference YKjm_)8]w  
uP'x{Pr)  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 ur'a{BI2R  
8P wobln  
函数的类型不能省略,就算没有也要加个void 1gq(s2izy  
1^bI9 /  
D6 2xC5  
七、函数体中的指针或引用常量不能被返回 0?D`|x_  
JN{.-k4Ha  
Char *func(void) ~*Fbs! ;,  
`iX~cUQ  
{ E^I|%F  
MEOVw[hO  
char str[]=”Hello Word”; +Om(&\c(6  
qO yg&]7  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 s!\:%N  
1-@[th  
return str; *x^W`i   
8 |2QJ  
} v&[Ff|>  
93z oJiLRf  
函数体内的指针变量并不会随着函数的消亡而自动释放 JEF2fro:Z  
F`l r5  
a$ f$CjQ  
八、一个内存拷贝函数的实现体  V~V_+  
+w~ <2Kt8  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) xWY%-CWY.  
lyBae?%&  
{ [25[c><:w"  
5*.JXx E;U  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); S>W_p~ @  
Ap&Bwo 8b  
byte *pbTo=(byte*)pvTo; //防止地址被改变 ?Y:>Ouv*z'  
|hsg= LX  
byte *pbFrom=(byte*)pvFrom; 5iE-$,7#L  
)aW;w|#n  
while (size-- >0) WoP5[.G  
o6JCy\Bx  
pbTo++ = pbForm++; ]8)nIT^EP  
` XAlzI  
return pvTo; [TUy><Z  
sW'SR  
} (vX+ Yw  
Ks|qJ3;  
D%L}vugxK  
九、内存的分配方式 ]L/h,bVI1  
9i hB;m'C)  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 ,+0#.N s$  
,{"%-U#z  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 > /,7j:X  
?P<8Zw  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 FsZW,  
xcBV,[E{  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 I[mlQmwsL.  
=og5Mh,  
U?vG?{A  
十、内存分配的注意事项 XH9Y|FX%#  
YNEPu:5J  
用new或malloc分配内存时,必须要对此指针赋初值。 05]y*I  
yV;_]_EO  
用delete 或free释放内存后,必须要将指针指向NULL x+?P/Ckg  
vuL;P"F4&  
不能修改指向常量的指针数据 uB;\nj5'D  
uBdS}U  
${(c `X  
十一、内容复制与比较 >A'Q9Tia;  
'@~\(SH  
//数组…… @|3PV  
r&$r=f<  
char a[]=”Hello Word!”; SSoD}N  
wH?r522`c  
char b[10]; kU*Fif  
IP#w  
strcpy(b,a); 0keqtr  
w(>mP9Cb  
if (strcmp(a,b)==0) ]3u$%v c  
&bh%>[  
{} \FE  
+(a}S$C  
//指针…… UEm~5,>$0  
=f{)!uW<4  
char a[]=”Hello Word!”; <B+xE?v4  
#Cj$;q{!  
char *p; >gj%q$@  
C rA7lu'  
p=new char[strlen(a)+1]; 8`I/\8;H'p  
.ty^k@J|]  
strcpy(p,a); Mg7nv\6  
#$W bYL|  
if (strcmp(p,a)==0) -XbO[_Wf  
*x0nAo_n  
{} APne!  
EZ  N38T  
.}xF2'~E/  
十二、sizeof的问题 Ym]Dlz,o  
JDa=+\_  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 }3^b1D>2O  
W*S !}ZT`  
char a[]=”Hello World!” :)djHPP*  
('9LUFw\  
char *p=a; E/<5JhI9~  
RV%aFI )  
count<<sizeof(a)<<end; //12字节 o?9k{  
&,4 3&pFU  
count<<sizeof(p)<<endl; //4字节 S yf0dp3  
?;q  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 {9/ayG[98  
Ts~MkO  
void fun(char a[1000]) W-72&\7  
31FQ=(K  
{ BGe&c,feIc  
}@ +{;"  
count<<sizeof(a)<<endl; //输出4而不是1000 qGH s2Og  
.lcI"%>  
} kS\A_"bc  
9rd7l6$R"  
{I]X-+D|_  
十三、关于指针 Q\!0V@$  
KX|7mr90K  
1、 指针创建时必须被初始化 Ah|,`0dw  
zG[GyyAQ  
2、 指针在free 或delete后必须置为NULL =Nc}XFq  
?6m6 4{M  
3、 指针的长度都为4字节 Lwy9QZL  
McXid~  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 3ZAPcpB2  
jTDaW8@L  
char *p=new char[100]; pOe"S  
j;3hQOl  
strcpy(p,”Hello World”); R Cgn\  
R cz;|h8  
delete []p; //注意前面的[]号 K]<49`MX  
t9!8Bh<  
p=NULL; *h H\H  
+V N&kCx)  
5、数组指针的内容不能超过数组指针的最大容易。 4ox[,  
2v;F@fUB.  
如: [1 ?  
,[Bv\4Ah  
char *p=new char[5]; Bq20U:f  
A-8[8J  
strcpy(p,”Hello World”); //报错 目标容易不够大 `Tt;)D  
)J['0DUrZK  
delete []p; //注意前面的[]号 rEM#J"wF  
$;1TP|  
p=NULL; WZ3GI l  
A<+veqb4  
}H>}v/  
十四、关于malloc/free 和new /delete h VQj$TA  
\?|FB~.Ry  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 E\X:VQ9  
1&wI*4  
l 注意:malloc/free是库函数,new/delete是运算符 ) vKZs:  
Q;'{~!=  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 l1EI4Y9KG  
+ROwk  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 YyF=u~l  
`u *:wJsv  
l 两者都必须要成对使用 TsvF~Gdp  
@_+B'<2  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 y1FE +EX[  
LRuB&4r8  
5i$iUDuT>(  
十五、C++的特性 g~A~|di|  
 ^O9_dP:  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 Kb/w+J S  
Pr!H>dH8o  
重载和内联:即可用于全局函数,也可用于类的成员函数; `E4+#_ v  
qkg`4'rLg  
Const和Virtual:只可用于类的成员函数; 1 po.Cmx  
t}!Y}D  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 {zri6P+s  
pI>[^7  
覆盖是指派生类函数覆盖基类函数 ?Tr]zxtd  
.}O _5b(  
函数名相同; VY@6!9G  
l?UFe$9(  
参数相同; IGtpL[.;/  
soTmKqj E  
基类函数必须有Virtual关键字; ^`MGlI}   
f\{ynC2m  
不同的范围(派生类和基类)。 -%g$~MZ?'  
5g$]ou  
隐藏是指派生类屏蔽了基类的同名函数相同 Fr,qVYf  
O\"k[V?.V  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 zo^34wW^  
p1blPBlp  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 |@+/R .l  
S]O0zv^}  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 $BPTk0Y  
lDV}vuM<4  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 {?zBc E:  
9 :ubPqt  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 EV$$wrohQ`  
^qro0]"LD  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: L2j7w006  
>p[skN   
将void Func(A a) 改为void Func(const A &a)。 lO>9Q]S<  
-fA1_ ?7S  
而void func(int a)就没必要改成void func(const int &a); DMcH, _(  
k-zkb2  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 q9^6A90  
JJ+A+sfdk  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 y;r{0lTB  
`> :^c  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; Vp.&X 8  
!UV1OU  
I\,m6 =q  
十六、extern“C”有什么作用? t 5{Y'  
a#k=! W  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 )v+R+3<  
&>T7]])  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 dYn<L/#  
*wd@YMOP  
xaSg'8-  
十七、构造函数与析构函数 .Z0$KQ'iy  
a*g7uaoP  
派生类的构造函数应在初始化表里调用基类的构造函数; T0Kjnzs  
naHQeX;  
派生类和基类的析构函数应加Virtual关键字。 O #  
! /qQ:k-.  
不要小看构造函数和析构函数,其实编起来还是不容易。 W~QH"Sq  
]w+n39da  
#include <iostream.h> G)S (a4  
ayR;|S  
class Base  !=f$ [1  
ylo/]pVs  
{ @7fx0I'n  
f-BEfC,}'  
public: UgBD| ~zu  
@_L:W1[  
virtual ~Base() { cout<< "~Base" << endl ; } wyVQV8+&>  
A;'*>NS  
}; 'ZUB:R@[  
p[J 8 r{'  
class Derived : public Base VOY#Y*)g  
(=/%_jj  
{ Q6e;hl  
O5lP92],  
public: *Bj7\8cKC  
nB+UxU@  
virtual ~Derived() { cout<< "~Derived" << endl ; } p#  4@  
'/[9Xwh9  
}; Shm$>\~=  
"+@>!U  
void main(void) [Up0<`Q{I_  
Z6F^p8O-  
{ D rMG{Yiu  
}iZ>Gm '5  
Base * pB = new Derived; // upcast s&gzv=v  
ifYC&5}SI  
delete pB; ,m08t9F  
ee7{5  
} 4P(ysTuM  
%dN',  
输出结果为: ZnVx 'Y  
VY#:IE:T  
~Derived ;#>,eD2u  
Onqd2'%<  
~Base sgRD]SF  
^-Knx!z  
如果析构函数不为虚,那么输出结果为 K5ywO8_6`  
3SU:Xd(\o  
~Base yOQEF\  
\dG#hH4ZD  
M.loG4r!  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 u]Eyb),Gy  
*@C]\)  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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