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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 :LE0_ .  
3=[#(p:  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 W&M=%  
|gXtP-  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 N$'/J-^  
2!-?  
oJ\)-qSf  
二、头文件的作用 (CUrFZT$  
1Yr&E_5/  
加强安全检测 z+@ CzHCN  
yH`4 sd  
通过头文件可能方便地调用库功能,而不必关心其实现方式 * SAYli+@  
bx!uHL=  
9NUft8QB  
三、* , &修饰符的位置 \R"}=7  
Lj]I7ICNh  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 .&z/p3 1  
T6/d[SH>  
T >pz/7gb  
四、if语句 (I<]@7>  
3k%fY  
不要将布尔变量与任何值进行比较,那会很容易出错的。 woSO4e/  
)gX7qQ  
整形变量必须要有类型相同的值进行比较 z@70{*  
0^%\! Xxq  
浮点变量最好少比点,就算要比也要有值进行限制 3K{XT),  
';H"Ye:D=7  
指针变量要和NULL进行比较,不要和布尔型和整形比较 O &/9wi>!q  
:ik$@5wp  
 L#  
五、const和#define的比较 yQP!Vt^  
aJ!(c}N~97  
const有数据类型,#define没有数据类型 xXa* d  
eA4dDKX+  
个别编译器中const可以进行调试,#define不可以进行调试 J A=9EnTU  
#sHA!@ |  
在类中定义常量有两种方式 m7~<z>5$  
_'eG   
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; |)%]MK$;  
[{s 1= c  
2、 用枚举代替const常量。 4[\$3t.L  
iCz0T,  
q,e{t#t  
六、C++函数中值的传递方式 nqp:nw  
/mdPYV  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) jCJbmEfo9@  
<5 Ye')+  
void fun(char c) //pass by value B~%'YQk  
O?p8Gjf  
void fun(char *str) //pass by pointer [ H~Yg2O  
th!$R  
void fun(char &str) //pass by reference bHJKX>@{  
>rbHpLm1`  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 8Ce|Q8<8]  
ujlIWQU2mo  
函数的类型不能省略,就算没有也要加个void $`KddW0_  
Mx-? &  
,H_b@$]n8  
七、函数体中的指针或引用常量不能被返回 P4\{be>e  
"PFczoRZ  
Char *func(void) >M}\_c=  
| c:E)S\  
{ EnM }H9A  
 9S<87sO  
char str[]=”Hello Word”; dz3KBiq  
xH,D bAC;  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 9+z5 $  
RFsd/K;Zp  
return str; TT85G&#  
%VV\biO]  
} Vxr_2Kra  
4$5d*7  
函数体内的指针变量并不会随着函数的消亡而自动释放 Dw%V.J/&o  
2 }9of[  
S":55YQev!  
八、一个内存拷贝函数的实现体 y v$@i A  
Fwu:x.(  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) iRbTH}4i  
fbl8:c)I  
{ qI]PM9  
r8R]0\  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); YmBo/IM  
# NoY}*  
byte *pbTo=(byte*)pvTo; //防止地址被改变 AX`>y@I  
8+7n"6GY2/  
byte *pbFrom=(byte*)pvFrom; gs xT  
Q3@MRR^tY  
while (size-- >0) X0QY:?  
!!{!T;)l  
pbTo++ = pbForm++; _f"HUKGN  
/~8<;N>,+  
return pvTo; aEO``W  
QNN*/n  
} 3?}\Hw  
?g ~w6|U(r  
UQ7E7yY#  
九、内存的分配方式 FnZMW, P  
=XRTeIZ  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 &Zzd6[G+  
o@6hlLr  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 N7wKaezE  
Zb \E!>V  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 vU4Gw4  
tRUGgf`  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 fGwRv% $^  
W[$GB_A)  
p)x*uqSd  
十、内存分配的注意事项 H'2J!/V  
ZaNZUVBh  
用new或malloc分配内存时,必须要对此指针赋初值。 kVqRl%/3Tb  
f;PPB@ :`$  
用delete 或free释放内存后,必须要将指针指向NULL p aQ"[w  
b}f#[* Z  
不能修改指向常量的指针数据 We8n20wf<  
@W_=Z0]  
/'[m6zm]  
十一、内容复制与比较 |v Gb,&3  
(Yv)%2  
//数组…… LH:M`\(DL1  
tx+KxOt9Y  
char a[]=”Hello Word!”; Dc1tND$X3g  
2 cB){.E  
char b[10]; <P%<EgOE  
FX->_}kL=  
strcpy(b,a); 2!w5eWl,  
i"B q*b@  
if (strcmp(a,b)==0) 9s.x%m,  
1"hd5a  
{} hoj('P2a#n  
|}?o=bO  
//指针…… L[j73z'  
Vgj&h dbd  
char a[]=”Hello Word!”; A>bpP  
un&Z' .   
char *p; ( !THd  
'XbrO|%  
p=new char[strlen(a)+1]; E7CeE6U  
I6.!0.G  
strcpy(p,a); bV3az/U  
I7S#vIMXR.  
if (strcmp(p,a)==0) "3?N*,U_  
@W|N1,sp  
{} 8Qo~zO  
yF _@^V  
m|CB')  
十二、sizeof的问题 u2FD@Xq?  
<=yqV]JR  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 &az :YTq  
t_+Xt$Q7C  
char a[]=”Hello World!” ='\Di '*  
-|FSdzvg  
char *p=a; @[2Go}VF  
b3vPGR  
count<<sizeof(a)<<end; //12字节 fOHgz ,x=  
)-u0n] ,  
count<<sizeof(p)<<endl; //4字节 `pTCK9  
 gZg5On  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 iC.k8r+~  
'g@Yra&09  
void fun(char a[1000]) @[=K`n:n_  
(v@)nv]U  
{ ,$,c<M  
KJs/4oR;  
count<<sizeof(a)<<endl; //输出4而不是1000 )5j1;A:gr  
drM@6$k  
} oPbxe  
f ecV[  
7gx 7NDt  
十三、关于指针 $ Ith8p~  
^'Z?BK  
1、 指针创建时必须被初始化 } vzNh_  
C3hQT8~  
2、 指针在free 或delete后必须置为NULL 4[.DQ#r  
p-S&Wq  
3、 指针的长度都为4字节  45qSt2  
G9YfJ?I  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 f)b+>!  
CD"D^\z  
char *p=new char[100]; 89kxRH\IhG  
;Pd nE~  
strcpy(p,”Hello World”); &hSABtr}  
- Mubq  
delete []p; //注意前面的[]号 5j{jbo =!  
W74Y.zQ  
p=NULL; M];?W  
P\nz;}nv  
5、数组指针的内容不能超过数组指针的最大容易。 h;lg^zlTb  
YTk"'q-  
如: W[R^5{k`  
"dItv#<:}  
char *p=new char[5]; ^{m&2l&87  
:,f~cdq=  
strcpy(p,”Hello World”); //报错 目标容易不够大 ;dR4a@  
DDwj[' R  
delete []p; //注意前面的[]号 t!285J8tn  
kgZiyPcw  
p=NULL; YPU*T&~  
ox&PFI0Gn  
4owM;y  
十四、关于malloc/free 和new /delete Ht,dMt>:  
hh1 ?/  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 |l#<vw wE  
\$B%TY  
l 注意:malloc/free是库函数,new/delete是运算符 qrw"z iW  
ih[!v"bv  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 ~B2,edkM  
;iq58.  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 xk/osbKn  
3&tJD  
l 两者都必须要成对使用 c*~ /`lG  
#=81`u  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 ]aDU*tk  
?\.DG`Zxc  
=U- w!uW  
十五、C++的特性 zcrM3`Zh  
#JD:i%  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 /]@1IC{Lk  
a:V2(nY  
重载和内联:即可用于全局函数,也可用于类的成员函数; 5nA *'($j  
*)| EWT?,  
Const和Virtual:只可用于类的成员函数; IBn+4 2V  
oWP3Y.  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 ~B704i  
j YVR"D;  
覆盖是指派生类函数覆盖基类函数 JsA.j qkB  
cmu|d  
函数名相同; ,jc')#]9B  
- fx?@  
参数相同; &&s3>D^Ta  
f$|AU- |<  
基类函数必须有Virtual关键字; Ix59(g  
~ _G W  
不同的范围(派生类和基类)。 |~d8j'rt  
/T\'&s3D+  
隐藏是指派生类屏蔽了基类的同名函数相同 .VG5 / 6zp  
vS1#ien#  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 02RZ>m+  
H~ `JAplr  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 ^lP;JT?  
U-6pia /o  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 xro%AM  
g[%^OT#  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 u$%;03hJ  
S@^o=B]]  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 >&Ios<67g  
OC5\3H  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: nb|KIW  
,CED%  
将void Func(A a) 改为void Func(const A &a)。 7ZR0cJw;  
P~^VLnw  
而void func(int a)就没必要改成void func(const int &a); Iss)7I  
0vjlSHS;`.  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 .kf FaK  
C>=[fAr mO  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 ?"Ec#,~  
5fjL  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; bZ-_Q  
gCjW !t  
/<e<-C*d&<  
十六、extern“C”有什么作用? 5==hyIy  
DV!10NqUr  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 @lhjO>@#I  
pW,)yo4  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 7 /7,55  
$TZjSZ1w  
#e*jP&1S  
十七、构造函数与析构函数 9=5xt;mEs}  
/!A?>#O&.  
派生类的构造函数应在初始化表里调用基类的构造函数; O]cuJp  
{W11+L{8  
派生类和基类的析构函数应加Virtual关键字。 aUYq~E tj  
]*v [6 +  
不要小看构造函数和析构函数,其实编起来还是不容易。 o$rA;^2X  
Y=$PsDh!  
#include <iostream.h> }v4T&/vt-  
I3^}$#>  
class Base VOkSR6  
Gv\:Agi  
{ I ]HP  
*/)O8`}2  
public: )[np{eF.k  
{7Qj+e^  
virtual ~Base() { cout<< "~Base" << endl ; } yLgv<%8f  
oU)Hco"_k  
}; 5i1E 5@~  
(,XbxDfM  
class Derived : public Base VBq|j"o0"  
N_liKhq  
{ k esuM3  
ttd ^jT  
public: aESlb H  
\u$[$R5  
virtual ~Derived() { cout<< "~Derived" << endl ; } FnWN]9  
%/}46z9\  
}; mzm{p(.  
von<I  
void main(void) ,vcd>"PK  
y{g"w  
{ wmDO^}>ZP  
TMw6 EM  
Base * pB = new Derived; // upcast xtFGj,N  
5MHc gzyp  
delete pB; c1sVdM}|  
G/N1[)  
} Msst:}QY  
]S+KH \2  
输出结果为: Y_= ]w1  
}'WEqNuE  
~Derived sL4j@Lt  
xRbtiFk9H  
~Base yN{TcX  
Csf!I@}Z  
如果析构函数不为虚,那么输出结果为 M97MIku~9  
vX}#wDNP  
~Base F S!D  
*nx$r[Mqj  
V{C{y5  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 5*\]F}  
t|?eNKVV9'  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五