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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 ]9pK^<  
t n>$5}^;  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 =TE6R 0b  
/n"Ib )M  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 b<u   
CuR.a  
Wz`MEyj  
二、头文件的作用 Hw-,sze j"  
0sD"Hu  
加强安全检测 [yF>W$Bn%  
ep>*]'  
通过头文件可能方便地调用库功能,而不必关心其实现方式 7`9J.L&,;  
WyF1Fw  
_e E(P1  
三、* , &修饰符的位置 1\X1G>60m  
s G!SSRL@  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 N<}{oIsZ+  
s,!+wHv_8  
!vH7vq  
四、if语句 [7]Kvb2t  
mI_ ?hl?Pv  
不要将布尔变量与任何值进行比较,那会很容易出错的。 iaPrkMhd  
wi-O}*O   
整形变量必须要有类型相同的值进行比较 :OT~xU==H  
7A@]t_83Y  
浮点变量最好少比点,就算要比也要有值进行限制 qq9fZZb  
@*`9!K%  
指针变量要和NULL进行比较,不要和布尔型和整形比较 =87.6Ai  
6`Zx\bPDm  
EZlcpCS  
五、const和#define的比较 )u)]#z  
e@}zp  
const有数据类型,#define没有数据类型 ~M7 J{hK  
!#wd~: H  
个别编译器中const可以进行调试,#define不可以进行调试 x%Ivd  
B U |]4  
在类中定义常量有两种方式 o&g-0!"  
5Arx"=c  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; \3a(8Em  
'mx_]b^O  
2、 用枚举代替const常量。 U{6i5;F#H  
c((^l&  
Vj(}'h-c\  
六、C++函数中值的传递方式 " lar~  
1#9qP~#]'{  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) kq xX!  
4Y2l]86  
void fun(char c) //pass by value -L<''2t  
NZ`Mq  
void fun(char *str) //pass by pointer XMzL\Edo  
>T: Yp<  
void fun(char &str) //pass by reference %P05k  
6P@3UQ)}s  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 s wgn( -  
G$FNofQx  
函数的类型不能省略,就算没有也要加个void tai  
Hry*.s -  
)xwWig.  
七、函数体中的指针或引用常量不能被返回 DY<Br;  
.b'hVOs{  
Char *func(void) #Q320}]{  
DWT4D)C,U  
{ OJ0Dw*K<  
KFd !wZ @e  
char str[]=”Hello Word”; 7[aSP5e>T  
lrQ +G@#  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 PO9<g% qTf  
c@iP^;D  
return str; qo{2 CYG\+  
29#&q`J  
} PgZeDUPP  
wa/ :JE  
函数体内的指针变量并不会随着函数的消亡而自动释放 g!%C_AI   
G,,c,  
lB_&Lq 8G  
八、一个内存拷贝函数的实现体 @w:6m&KL9  
NgH"jg-  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) *p )1c_  
p<%76H A  
{ U)mg]o-VE  
=<~/U?  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); `}uOl C]I  
3e~X`K1Q<  
byte *pbTo=(byte*)pvTo; //防止地址被改变 2Hltgt,  
e]N?{s   
byte *pbFrom=(byte*)pvFrom; G;r-f63N  
^ ]Mlkd:  
while (size-- >0) } ti+tM*  
Z[+H$=$%  
pbTo++ = pbForm++; :i'jQ<|wZN  
~]t/|xep  
return pvTo; ODE9@]a  
F=}-ngx8&  
} nU]4)t_o\  
 =FZt  
?Uz7($}  
九、内存的分配方式 'J*)o<%  
tTa" JXG  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 L\p@1N?K  
uYk4qorA  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 mG;Gt=4  
B/@9.a.c  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 z>_jC+  
b.Wf*I?  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 SVvR]T&_  
?9<byEO%M  
{-X8MisI  
十、内存分配的注意事项 P=ARttT`(  
%DJxUuh  
用new或malloc分配内存时,必须要对此指针赋初值。 K&{*sa r  
3'(w6V  
用delete 或free释放内存后,必须要将指针指向NULL @r.u8e)l  
XsE] Z4  
不能修改指向常量的指针数据 h9Zf4@w  
[]e*Io&[  
\A-w,]9^V  
十一、内容复制与比较 +jk_tPSe  
n[2[V*|mI  
//数组…… S].=gR0:  
oe1Dm   
char a[]=”Hello Word!”; !wl3}]q  
(bP\_F5D  
char b[10]; e%#8]$  
/W !A^  
strcpy(b,a); n~/#~VTVe  
w`~j(G4N  
if (strcmp(a,b)==0) x@EEMO1_"  
G[V?# 7.  
{} Epm'u[wV  
;jb+x5t  
//指针…… e<|'   
enu",wC3  
char a[]=”Hello Word!”; [&mYW.O<  
J(&a,w>p  
char *p; kzs}U'U  
UYu 54`'kg  
p=new char[strlen(a)+1]; -:txmM T  
@=jcdn!\M  
strcpy(p,a); LGb.>O^  
E%L]ifA9!  
if (strcmp(p,a)==0) ,nMc. G3  
$~,]F  
{} x+h7OvW{  
H^s@qh)L  
>j]*=&,7  
十二、sizeof的问题 |qra.\  
IyE9G:fY  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 $;<h<#_n;  
; *G[3kk  
char a[]=”Hello World!” TI -#\v9  
XK:KWqW  
char *p=a; 2fc8w3  
wzAp`Zs2Dm  
count<<sizeof(a)<<end; //12字节 7S<Z&1(  
?3tR(H<  
count<<sizeof(p)<<endl; //4字节 A/NwM1z[o)  
"yMr\jt~-  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 38P_wf~ \  
p-U'5<n  
void fun(char a[1000]) Xg#g`m%(M  
eW*nRha  
{ >mI-h  
dy u brIG  
count<<sizeof(a)<<endl; //输出4而不是1000 rn1FCJ<;H  
l'N>9~f  
} '{EBK  
tYt/m6h  
qIQvix$8  
十三、关于指针 _\ n'uW$  
,cm;A'4]  
1、 指针创建时必须被初始化 DBi3 j  
v ~73  
2、 指针在free 或delete后必须置为NULL 5Am*1S^  
$UlA_l29  
3、 指针的长度都为4字节 x@ bZ((w  
WU1 I>i  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 F' ZLN]"{  
fU~>A-P  
char *p=new char[100]; {p UOu8`Z  
c4CBpi?}  
strcpy(p,”Hello World”); ,*.C''  
-W>zON|l  
delete []p; //注意前面的[]号 lkp!S3,  
IsO'aFK)ln  
p=NULL; AX8;x1t^.  
gDnG!i+  
5、数组指针的内容不能超过数组指针的最大容易。 m^_)aS  
aisX56Lc  
如: %@(6,^3%i  
$Vp&Vc8  
char *p=new char[5]; r2QC$V:0  
<u44YvLBm  
strcpy(p,”Hello World”); //报错 目标容易不够大 $i@5'[jA  
?|^1-5l3  
delete []p; //注意前面的[]号 ;D]TPBE  
(JFa  
p=NULL; GMOv$Tn-_L  
{U=za1Ga  
uXeBOLC  
十四、关于malloc/free 和new /delete j^Zp BNL  
Jg k@ti.}Z  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 yB}y'5  
X4i$,$C  
l 注意:malloc/free是库函数,new/delete是运算符 -GP+e`d  
A"eT @  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 +XWXHt  
L.!:nu]rV  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 c[ff|-<g  
ZvNXfC3Ia  
l 两者都必须要成对使用 oq]KOj[  
5n.4>yOY  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 c#9 zw[y-L  
^f!d8 V  
cJ:BEe  
十五、C++的特性 =KT7ZSTV  
r3Z-mJ$:  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 :[(X!eP  
z[qM2  
重载和内联:即可用于全局函数,也可用于类的成员函数; hFa\x5I5  
@]*z!>1  
Const和Virtual:只可用于类的成员函数; 0e8)*2S  
m{Q{ qJ5>  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 6?}8z q[  
6@o_MtI  
覆盖是指派生类函数覆盖基类函数 Jb$PlOQ  
UDyvTfh1X  
函数名相同; y9\s[}c_  
1aYO:ZPy  
参数相同; XrSqU D  
oB9Fas!N  
基类函数必须有Virtual关键字; !9iVe7V  
8qBRO[  
不同的范围(派生类和基类)。 *JO"8iLw  
*/\dH<  
隐藏是指派生类屏蔽了基类的同名函数相同 Y,&)%Eo<  
TUk1h\.q  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 e@Mm4&f[p  
kF\ QO [  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。  %gf8'Q  
D@j `'&G  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 2+?M(=4  
+F0M?,  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 isDr|g$S  
@w|~:>/g  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 k'u2a  
8taaBM`:  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: OY@/18D<>  
f:HRrKf9  
将void Func(A a) 改为void Func(const A &a)。 zfxxPL'  
KD#ip3  
而void func(int a)就没必要改成void func(const int &a); Zo&U3b{Dy  
Cjwg1?^RZ  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 F!Nx^M1  
h7%<  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 A).wjd(_,  
7qnw.7p  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; >+G=|2  
HF0J>Clq  
cZHlW|$R  
十六、extern“C”有什么作用? 7, O_'T &  
]C'r4Ch^  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 .-<o[(s  
,NVQ C=  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 Y%Saz+  
b ~F8 5U2  
DuCq16'0T  
十七、构造函数与析构函数 s3t{freM  
)FgcNB1|7  
派生类的构造函数应在初始化表里调用基类的构造函数; T@f$w/15  
&}*[-z  
派生类和基类的析构函数应加Virtual关键字。 3lLO.  
! WQEv_G@  
不要小看构造函数和析构函数,其实编起来还是不容易。 B?Pu0 _|s  
EpPKo  
#include <iostream.h> 0] 5QX/I  
Z}XA (;ck  
class Base jgukW7H  
1k;X*r#  
{ HPu nNsA  
k2O==IG]6  
public: h( Iti&  
QhN5t/Hr  
virtual ~Base() { cout<< "~Base" << endl ; } Knn$<!>  
M<Eg<*  
}; cp]\<p('A  
edbzg #wy  
class Derived : public Base iao_w'tJ  
Y2Y/laD  
{ ?L7z\b"_~  
q?JP\_o:  
public: hXZk$a'  
S{&;  
virtual ~Derived() { cout<< "~Derived" << endl ; } ^F_c'  
7eZ,; x  
}; +jQW6k#  
.p <!2   
void main(void) X(N!y"z  
Pq !\6s@  
{ ALPZc:  
UKn>.,  
Base * pB = new Derived; // upcast BK6oW3wD/  
*\-6p0~A  
delete pB; Lw2EA 5  
dTS 7l02  
} CSIW|R@   
[&"`2n  
输出结果为: $Z$BF  
o5A@U0c_  
~Derived T&cf6soo  
1XL^Zhr  
~Base MT}9T  
;5dJ5_}  
如果析构函数不为虚,那么输出结果为 s}X2*o`,  
05$CIS>!  
~Base >'7Icx  
8,=,'gFO  
#sN]6  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 #8rLB(  
>pUR>?t"  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
10+5=?,请输入中文答案:十五