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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 x;" !  
z:<mgp&/<  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 A,D67G<v`  
iaO;i1K5U  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 uP/PVoKQ  
Vzf{gr?  
V0+D{|thh6  
二、头文件的作用 |$@/ Z +  
'0x`Oh&PK  
加强安全检测 D7cOEL<  
z!27#gbL  
通过头文件可能方便地调用库功能,而不必关心其实现方式 Gs%IZo_  
""l_& 3oz  
]z`Y'wSxd  
三、* , &修饰符的位置 LcCb[r  
+cv7]  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 9'F-D  
6dQa|ACX_  
Icf 4OAx  
四、if语句 Dt?O_Bdv[  
2xRb$QF  
不要将布尔变量与任何值进行比较,那会很容易出错的。 Okm&b g  
QA7SQ cd,  
整形变量必须要有类型相同的值进行比较 e&Z}struE  
_KiaeVE  
浮点变量最好少比点,就算要比也要有值进行限制 INSI$tA~  
-\:#z4Tc  
指针变量要和NULL进行比较,不要和布尔型和整形比较 Q# xeu  
H pXMPHd  
A3ad9?LR[R  
五、const和#define的比较 Z0T{1YEJ  
b3}928!D-@  
const有数据类型,#define没有数据类型 jeF1{%  
?Z%Ja_}8ma  
个别编译器中const可以进行调试,#define不可以进行调试 mMmzi4HL  
M$ g%kqa  
在类中定义常量有两种方式 (;YO]U4  
' 8`{u[:  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; I$0JAy  
7onMKMktM%  
2、 用枚举代替const常量。 Xm`s=5%  
-a(f-  
=1t#$JG  
六、C++函数中值的传递方式 m)9N9Ii#)  
rZ<0ks  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) > kOca  
k7P~*ll$  
void fun(char c) //pass by value Y W_E,A>h  
<$Q\vCR  
void fun(char *str) //pass by pointer Ge$cV}  
;AKtb S;H  
void fun(char &str) //pass by reference |8}f  
,}F2l|x_  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 *>%34m93  
):?ype>  
函数的类型不能省略,就算没有也要加个void p.i$[6M  
T.="a2iS2  
hkSpG{;7  
七、函数体中的指针或引用常量不能被返回 ?^P#P0  
Yf Udpa0  
Char *func(void) m! &bK5+*  
WmLl.Vv=  
{ awuUaE  
Yu=4j9e_mG  
char str[]=”Hello Word”; vfzGRr  
>R3~P~@30  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 _H^Ij  
x-+[gNc 6  
return str; vFY/o,b \  
pW O-YZ#+  
} D4'"GaCv  
mtuq  
函数体内的指针变量并不会随着函数的消亡而自动释放 g(<02t!OT=  
m3XL;1y:a  
B#o(21s  
八、一个内存拷贝函数的实现体 kH*l83  
V[,/Hw~d%  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) \@nmM&7C!4  
yAtM|:qq  
{ ncJ}h\:Sk  
AC3K*)`E  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); (u85$_C  
[YP8z~  
byte *pbTo=(byte*)pvTo; //防止地址被改变 A@*P4E`xp  
Ou/@!Y1  
byte *pbFrom=(byte*)pvFrom; 8 W8ahG}  
6HpSZa  
while (size-- >0) I^/Ugu  
Gdnk1_D>  
pbTo++ = pbForm++; f2[z)j7  
OTd=(dwh  
return pvTo; o1"U'y-9V  
 S]ZO*+  
} VuFM jY  
LfyycC2E  
gwQL9 UYx  
九、内存的分配方式 lJoMJS;S]}  
1YR;dn  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 ^ef:cS$;  
K @"m0  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 &q1(v3cOO  
cRz7.9-<  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 z;1tJ  
$=iz&{9  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 UV)[a%/SB&  
#0`2wuo {  
6k"Wy3/  
十、内存分配的注意事项 : Ey  
Nt67Ye3;  
用new或malloc分配内存时,必须要对此指针赋初值。 = sedkrM  
4nkH0dJQ  
用delete 或free释放内存后,必须要将指针指向NULL _Pa(5-S'KR  
D9e"E1f+"  
不能修改指向常量的指针数据 }r`!p5\$K0  
l#%Y]1 *  
}txHuq1Q.  
十一、内容复制与比较 K"eR 6_ k  
gj\r>~S  
//数组…… ;3Fgy8 T  
2i', e  
char a[]=”Hello Word!”; #^<7VS!x  
h0 Acpd2  
char b[10]; nXK"BYe  
2f`u?T  
strcpy(b,a); gm8L5c V  
s['F?GWg  
if (strcmp(a,b)==0) JO5~Vj_"  
;E:ra_l  
{} ?v#t{e0eQ  
MR%M[SK1  
//指针…… Rb<aCX  
3s\2 9gq  
char a[]=”Hello Word!”; hnL"f[p@gC  
LYGFE jS[  
char *p; V!c{%zd  
 {"y{V  
p=new char[strlen(a)+1]; o; 6\  
Z4}Yw{=f  
strcpy(p,a); &of%;>$>M  
Mp?Ev.  
if (strcmp(p,a)==0) m^U\l9LE  
t?28s/?  
{} 9/D+6hJ]:  
5'\/gvxIC  
a~OCo  
十二、sizeof的问题 INW8Q`[F  
,f$A5RN  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 ~t<BZu  
cG?RisSZ  
char a[]=”Hello World!” e x $d~  
h(d<':|  
char *p=a; zdyS"H}  
6h}f^eJ:K,  
count<<sizeof(a)<<end; //12字节 ^qiTO`lg  
LB? evewu  
count<<sizeof(p)<<endl; //4字节 J\_tigd   
(o{QSk\  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 VyCBJK  
.zlUN0oe  
void fun(char a[1000]) ; z:}OD  
h_?D%b~5  
{ h\C  
|=l;UqB  
count<<sizeof(a)<<endl; //输出4而不是1000 -DX|[70  
>T.U\,om7  
} e.\d7_T+  
H h$D:ZO  
$"J+3mO  
十三、关于指针 fcr\XCG7U  
{qx}f^WV  
1、 指针创建时必须被初始化 +q) ^pCC  
r4Pm i  
2、 指针在free 或delete后必须置为NULL 3?Bq((  
vwZ2kk!|i  
3、 指针的长度都为4字节 n1DD+@  
n0@e%=H)I  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 W)<us?5Ec5  
$4>K2  
char *p=new char[100]; p:k>!8.Qho  
Wh(V?!^@5  
strcpy(p,”Hello World”); 2<fG= I8  
5Tb93Q@c  
delete []p; //注意前面的[]号 }OI;M^5L  
65=i`!f  
p=NULL; N#C,_ k  
#`); UAf  
5、数组指针的内容不能超过数组指针的最大容易。 7O;v5k~iQ  
nW{ ). P  
如: h<6@&yzp  
?t'O\n)M  
char *p=new char[5]; CO0Nq/@  
:v Pzw!  
strcpy(p,”Hello World”); //报错 目标容易不够大 Jmf&&)p  
TaG'?  
delete []p; //注意前面的[]号 [#)-F_S  
|6"zIHvtc  
p=NULL; D"bLJ j/!  
xO'1|b^&  
/=lrdp!a  
十四、关于malloc/free 和new /delete 3Q~ng2Wv%  
puL1A?Y8UM  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 |0B h  
bf'@sh%W  
l 注意:malloc/free是库函数,new/delete是运算符 /AjGj*O  
4ZQX YwfC|  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 /tJJ2 =%l  
Ca*^U-  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 #`<|W5  
QlSZr[^v  
l 两者都必须要成对使用 w \i#  
bxc#bl3  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 IM}#k$vM:  
J ;i/X;^  
n_v|fxF1  
十五、C++的特性 9$)TAI&P  
oslrv7EK  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 IpB0~`7YI  
|mc!v*O  
重载和内联:即可用于全局函数,也可用于类的成员函数; Y2yVl+  
Av _1cvR:  
Const和Virtual:只可用于类的成员函数; o\g",O4-  
Sl   
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 Pp@P]  
w~;1R\?|  
覆盖是指派生类函数覆盖基类函数 %=]~5a9  
A>xFNem  
函数名相同; g.s~Ph-G  
`V$i*{c:#  
参数相同; S)n ~^q  
X@\rg}kP  
基类函数必须有Virtual关键字; .?<,J  
-wW%+wH  
不同的范围(派生类和基类)。 U5Q `r7  
7$\;G82_  
隐藏是指派生类屏蔽了基类的同名函数相同 wX<)Fj'  
bv4lgRE6Y  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 cmZ39pjBJ  
^ bexXYh  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 W.HM!HQp  
,+oQ 5c(f  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 Hb#8?{  
wx>BNlT@?  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 5WP)na6"  
\6T&gX  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 H8mmmt6g  
J3oH^  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: u0A.I_  
TC<_I0jCh  
将void Func(A a) 改为void Func(const A &a)。 y7u"a)T  
=BMON{K  
而void func(int a)就没必要改成void func(const int &a); 2VrF~+  
A]WU*GL2H  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 Zyu4!  
Eii)zo8Xd  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 `$AX!,<!G  
lN<vu#  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; TXv3@/>ZlG  
E"b+Q  
0%<Fc9#  
十六、extern“C”有什么作用? ^}a..@|%W  
jri=UGf  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 gH,^XZe  
P@`@?kMU  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 qdx(wGG  
w +fsw@dK&  
N41)?-7F  
十七、构造函数与析构函数 o 3#qp>R  
:3gtc/pt>  
派生类的构造函数应在初始化表里调用基类的构造函数; 2>Xgo%  
*_}ft-*w  
派生类和基类的析构函数应加Virtual关键字。 /3Zo8.  
?<k s^2D  
不要小看构造函数和析构函数,其实编起来还是不容易。 k^w!|%a[  
nVoL7ew+  
#include <iostream.h> QgqR93Ic  
dAh&Z:86\  
class Base eBFsKOtu  
%|*tL7  
{ sy.FMy+  
_rdEur C6  
public: FMc$?mm  
I% ivY  
virtual ~Base() { cout<< "~Base" << endl ; } mp*&{[XoVC  
Q_$aiE  
}; ]o$aGrZ  
}Y[xj{2$O  
class Derived : public Base  TTZb.  
C*a>B,H  
{ ]u?|3y^ (  
 _/;vsQB  
public: =2F;'T\6  
zVKbM3(^  
virtual ~Derived() { cout<< "~Derived" << endl ; } *P7 H=Yf&  
h64<F3}  
}; !i,Eo-[Z  
vO`~rUA  
void main(void) 93Kd7x-3  
><V<}&:y$(  
{ $M5iU@A  
M+j V`J!  
Base * pB = new Derived; // upcast V^;2u  
oCg|* c|+  
delete pB; JfGU3d*c  
-GJ~xcf0  
} ~2PD%+e7]  
s;Q0  
输出结果为: ++w7jVi9  
 ?12[8   
~Derived ^hr^f;N  
XD%@Y~>+  
~Base mM0VUSy  
S~()A*5  
如果析构函数不为虚,那么输出结果为 wX Z"}uT<}  
G8z.JX-7g  
~Base "m,)3zND3  
R&KFF'%  
&OQ37(<_  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 _JNSl2  
\NU^Jc_k7  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录 或 注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五