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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 VO++(G)  
1Kwl_jf  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 .%~ L  
"@`M>)*o  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 0ZPPt(7  
*4A.R&Vu  
I+u=H2][2  
二、头文件的作用 [-Q"A 6!Zd  
B}r@xz  
加强安全检测 D.$EvUSK<.  
/R@(yT=t  
通过头文件可能方便地调用库功能,而不必关心其实现方式 <|.S~HLTQ  
Y^3tk}yru  
X3 a:*1N  
三、* , &修饰符的位置 b/ZX}<s(1=  
?nU V3#6{  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 7"8HlOHA  
]T zN*6o  
}yB@?  
四、if语句 !j7b7<wR  
i_gS!1Z2  
不要将布尔变量与任何值进行比较,那会很容易出错的。 f_;3|i  
SOP= X-6f  
整形变量必须要有类型相同的值进行比较 Wy4v~]xd%  
9(u2jbA  
浮点变量最好少比点,就算要比也要有值进行限制 'HOcK8}b  
E*RP8  
指针变量要和NULL进行比较,不要和布尔型和整形比较 ?]5wX2G^|J  
/0@}7+&  
_);1dcnR  
五、const和#define的比较 :4)mv4Q  
=PO/Q|-v?  
const有数据类型,#define没有数据类型 :q6hT<f;  
_>3GNvS  
个别编译器中const可以进行调试,#define不可以进行调试 G?jY>;P)  
(v(_ XlMK  
在类中定义常量有两种方式 `bt]v$  
X*FK6,Y|(  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; : PQA9U|  
*OsXjL`f  
2、 用枚举代替const常量。 O#u)~C?)8  
'OF)`5sj  
/vU9eh"%  
六、C++函数中值的传递方式 qn4Dm ^  
B=n]N+  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) W>1\f0'  
rEddX  
void fun(char c) //pass by value S93NsrBbY  
C"0gAN  
void fun(char *str) //pass by pointer eb( =V *  
0} P&G^%"  
void fun(char &str) //pass by reference !pDS*{)E  
D0"+E*   
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 CsuSg*#X+  
pRt )B`#  
函数的类型不能省略,就算没有也要加个void 45ct*w  
G%'h'AV"  
q:?g?v  
七、函数体中的指针或引用常量不能被返回 0imz }Z]  
uy`U1>  
Char *func(void) U?>zq!C&R  
bF B;N+>  
{ xn6E f"  
QjZ}*p  
char str[]=”Hello Word”; NWoZDsu  
+S3'ms  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 %81tVhg  
`_<AZ{&&  
return str; qTffh{q V  
dB_\,%vAd  
} ]FFU,me2  
%lV>Nc|iz=  
函数体内的指针变量并不会随着函数的消亡而自动释放 .h7b 4J  
sav2.w  
MfYe @ ;m  
八、一个内存拷贝函数的实现体 );,#H`'  
fcV/co_S6  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) =Oo*7|Z  
K-vso4@BJ  
{ }i/{8Ou W  
- MBK/  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); =}Cb?C[;  
} 8r+&e  
byte *pbTo=(byte*)pvTo; //防止地址被改变 d628@~ Ekn  
 *riGi  
byte *pbFrom=(byte*)pvFrom; kWoy%?|RRa  
<(^-o4Cl  
while (size-- >0) ^2=Jv.2{|  
]%mg(&p4  
pbTo++ = pbForm++; WP}__1!%u  
?]P&3UU>0z  
return pvTo; {/ty{  
Zr$PSp}  
}  OSSMIPr  
VQ}=7oe%q  
,'ndQ{\9  
九、内存的分配方式 XeZv%` ?  
PE4{;|a }  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 C?E;sRr0  
f$H"|Mb e  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 FE_n+^|k<  
F.@yNr"  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 y ruN5  
Wt4!XV  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 uIWCVR8`Y  
1) @Wcc.  
*nH?o* #  
十、内存分配的注意事项 69IBG,N'  
:$9 4y{  
用new或malloc分配内存时,必须要对此指针赋初值。 }4bwLO  
Qs,LK(1  
用delete 或free释放内存后,必须要将指针指向NULL w5&UG/z%l  
q.g!WLiI  
不能修改指向常量的指针数据 M8g=t[\  
*XNvb ^<  
 c<4pu  
十一、内容复制与比较 bAW;2 NB  
H=wmN0s{<  
//数组…… K IqF"5  
g8vN^nQf[  
char a[]=”Hello Word!”; gzC\6ca  
%K%8 ~B  
char b[10]; [[bMYD1eO  
- 6  
strcpy(b,a); @A yC0}  
mFo6f\DHr`  
if (strcmp(a,b)==0) Z NuyGo;  
7p~@S4  
{} 2&=;$2?}  
]jy6C'Mp  
//指针…… QU417EV'  
 w[VWk  
char a[]=”Hello Word!”; sA` bPhk  
N>gv!z[E  
char *p; Ii4 Byyfx  
; 4S#6#  
p=new char[strlen(a)+1]; ;JAe=wt^'I  
3J [P(G>Q  
strcpy(p,a); ;w@:  
~ xXB !K~C  
if (strcmp(p,a)==0) >j$f$*x  
s2d;601*b  
{} 9@:&E  
uQ&xoDCB  
-gC=%0sp\  
十二、sizeof的问题 .JH3,L"S^  
!>2s5^JI9  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 -R:1-0I$  
 [bv.`  
char a[]=”Hello World!” 0"<g g5  
KK7Y"~ 9&-  
char *p=a; 3[8'pQ!&  
<xc"y|7X  
count<<sizeof(a)<<end; //12字节 q WP1i7]=/  
Y$'fds4P  
count<<sizeof(p)<<endl; //4字节 sG^b_3o)A  
:v&GA s6H  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 _ b#9^2o  
ZPMX19  
void fun(char a[1000]) (zTr/  
u}u2{pO!  
{ 3K54:  
; /EH@V|  
count<<sizeof(a)<<endl; //输出4而不是1000 R?I(f(ib   
Q <78< #I  
} gp$+Qd  
.$?s :t  
g3Ff<P P  
十三、关于指针 RtF_p {s  
b@5bN\"x$  
1、 指针创建时必须被初始化 a+J :1'  
V{a7@_y  
2、 指针在free 或delete后必须置为NULL .Sb|+[{  
Ebp8})P/~  
3、 指针的长度都为4字节 I5 [r-r  
A$^}zP'u0<  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 G19FSLrtA  
_c%~\LOk  
char *p=new char[100]; g fO.Ky6  
U); ,Opr  
strcpy(p,”Hello World”); N|Rlb5\  
O9g{XhMv>f  
delete []p; //注意前面的[]号 b z<wihZj  
xu_Tocvop  
p=NULL; "qwRcuHY  
iRPd=)  
5、数组指针的内容不能超过数组指针的最大容易。 @++ X H}  
SX*os$  
如: _ sM$O>  
tCA |sN  
char *p=new char[5]; {_Ke'" k  
d5bj$oH  
strcpy(p,”Hello World”); //报错 目标容易不够大 :*4yR46  
/V3*[  
delete []p; //注意前面的[]号 Z1q '4h=F.  
*]F3pP[  
p=NULL; 3>?ip;  
J7mT&U&Ru  
2t[inzn=E  
十四、关于malloc/free 和new /delete WL$WWA08_  
6 rmK_Y  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 d eTUfbd'  
qjTz]'^BpM  
l 注意:malloc/free是库函数,new/delete是运算符 Pyk~V)~M  
ku`'w;5jT  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 v< ;, x  
sPbtv[bC  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 rWa7"<`p  
m*["  
l 两者都必须要成对使用 M0_K%Z(zaR  
%L~X\M:Qk  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 `W|2Xi=^5  
"7gS*v,r  
;'cv?3Y  
十五、C++的特性 Lu-owP7nB  
@NX^__ sa  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 #JTi]U6`  
U:8^>_  
重载和内联:即可用于全局函数,也可用于类的成员函数; 6G1Z"9<2*  
@dcW0WQ\  
Const和Virtual:只可用于类的成员函数; qf7.Sh  
C'mmo&Pd  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 s-k-|4  
eW\_9E)cY  
覆盖是指派生类函数覆盖基类函数 ir/2/ E  
~\XB'  
函数名相同; d9sgk3K  
WhK?>u  
参数相同; -?@ $`{-K  
@Z.Ne:*J  
基类函数必须有Virtual关键字; iiRK3m  
Fbk<qQH  
不同的范围(派生类和基类)。 y(N-1  
BPi>SI0  
隐藏是指派生类屏蔽了基类的同名函数相同 R2M,VK?Wx  
8f29Hj+  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 E1VCm[j2  
?F`lI""E  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 H&%=>hyX  
fpoH7Jd V  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 J-u,6c  
t,MK#Ko  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 i|=}zR  
j*+r`CX  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 r$0=b -  
TTqOAo[-Z  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: E\'_`L  
xaS kn  
将void Func(A a) 改为void Func(const A &a)。 $H5PB' b  
`D#l(gZ  
而void func(int a)就没必要改成void func(const int &a); SHwl^qVk[  
q2,@>#  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 +ES.O]?>  
9|'bPOKe  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 VgoQz]z  
E$Ge# M@dM  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; Y*"%;e$tg  
iUl{_vb  
XFBk:~}sI  
十六、extern“C”有什么作用? oWJ}]ip  
ifBJ$x(B.  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 6aK%s{%3s  
hefV0)4K  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 _X@:- _  
MjG .Ili$m  
5^%^8o  
十七、构造函数与析构函数 O<%U*:B  
0<>iMrD  
派生类的构造函数应在初始化表里调用基类的构造函数; gXf_~zxS  
sIELkF?.  
派生类和基类的析构函数应加Virtual关键字。 ClfpA?vv  
?xeq*<qfI  
不要小看构造函数和析构函数,其实编起来还是不容易。 2TAy'BB;)  
_q8s 7H  
#include <iostream.h> FtF!Dtv  
kfmIhHlYQ  
class Base ^5GS !u"  
t_j.@|/FZ  
{ ;$0za]x  
Sb{S^w\m0  
public: )6AOP-M.9  
W<9G wMU  
virtual ~Base() { cout<< "~Base" << endl ; } T!;<Fy"p  
G\P*zz Sq  
}; SQt$-<>4\  
s&fU|Jk8  
class Derived : public Base ,e>ugI_;*  
ViVYyA  
{ gi"v$ {R  
4CN8>J'-  
public: ~ 4&_$e!  
Cg&1  
virtual ~Derived() { cout<< "~Derived" << endl ; } wOa_"  
,*C^ixNE  
}; M{(Y|3W  
|\}f)Xp-  
void main(void) ? 8~$du$  
}f({03$  
{ tG#F7%+E  
Kfj*#) SZ  
Base * pB = new Derived; // upcast 525xm"Bs  
fnXl60C%  
delete pB; uM4,_)L  
0 TS:o/{(a  
} bUqO.FZ[  
AV8TP-Ls+  
输出结果为: *:d_~B?Tn  
:A 1,3g  
~Derived `rs1!ZJ,  
tPp }/a%D  
~Base +osY iP5  
'.^JN@  
如果析构函数不为虚,那么输出结果为 Fx.uPY.a  
Q!|71{5U  
~Base / Sp+MB9  
pkM32v-  
!BQ!] u  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 ;eA~z"g  
j}ruXg  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
10+5=?,请输入中文答案:十五