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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 Qxq-Mpx{  
L~&" aF/b  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 '[ 0YIn  
>nM%p4E  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 ab4LTF|  
A*i_|]Q  
J?D\$u:  
二、头文件的作用 8x{Hg9  
D=&K&6rr  
加强安全检测 G Y-M.|%  
2w4MJ,Uw  
通过头文件可能方便地调用库功能,而不必关心其实现方式 Gru ALx7  
Ue7 6py9  
4f {+pf^R  
三、* , &修饰符的位置 c<jB6|.=2  
~gddcTp  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 T4GW1NP  
xZ+]QDKC  
r/PKrw sC  
四、if语句 \_U*t!  
UvBnf+,  
不要将布尔变量与任何值进行比较,那会很容易出错的。 (.Xr#;\(  
&HL{LnLP@/  
整形变量必须要有类型相同的值进行比较 KY+]RxX  
jVYH;B%%z  
浮点变量最好少比点,就算要比也要有值进行限制 hk;bk?:m  
HcO5?{2  
指针变量要和NULL进行比较,不要和布尔型和整形比较 Ub)M*Cq0(o  
ps+:</;Z  
xa#gWIP*  
五、const和#define的比较 :hP58 }Q$  
@T7PZB&xnl  
const有数据类型,#define没有数据类型 eP= j.$  
oEIqA  
个别编译器中const可以进行调试,#define不可以进行调试 &t6Tcy  
A.U'Q|  
在类中定义常量有两种方式 =]b9X7}  
sTOFw;v%  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 7$_ :sJ  
M/B/b<['  
2、 用枚举代替const常量。 kl<g;3  
]^ 'ZiyJX  
Qlh?iA  
六、C++函数中值的传递方式 SRWg[H  
j38 6gL  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) xA-jvu9@  
j^ I!6j=ZX  
void fun(char c) //pass by value ke6n/ h5`  
8ds}+TtbY  
void fun(char *str) //pass by pointer s<VJ`Ur  
fIkT"?  
void fun(char &str) //pass by reference VDn:SGj5  
J6auUm` `  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 4Py3I9  
rr )/`Kmv%  
函数的类型不能省略,就算没有也要加个void v, 0<9!'v  
OG}KqG!n  
]]y[t|6  
七、函数体中的指针或引用常量不能被返回 (9'be\  
6t$N78U  
Char *func(void) 8A4TAT4,  
 mn`5pha  
{ vHc#m@4o  
+{*)}[w{x  
char str[]=”Hello Word”; Tk](eQsy.v  
r?$ &Z^  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 ]bu9-X&T&  
+7Rt{C,  
return str; 8!4[#y<  
Tzf$*Uje3  
} _yJ|`g]U3  
nl9kYE [  
函数体内的指针变量并不会随着函数的消亡而自动释放 |D+p$^L  
|0]YA  
D6:DrA:  
八、一个内存拷贝函数的实现体 eI?HwP{m  
&Ea"hd  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) RNe9h lr  
i'iO H|s  
{ `#p< rfe  
=h7[E./U1  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); mF~ys{"t  
pU@YiwP"]x  
byte *pbTo=(byte*)pvTo; //防止地址被改变 cqjl5UB  
4UVW#Rw{  
byte *pbFrom=(byte*)pvFrom; $E@ouX?  
G g(NGT  
while (size-- >0) BjB&[5?z  
?(>k,[n  
pbTo++ = pbForm++; G ~A$jStm  
Q-3r}jJe  
return pvTo; iel-<(~   
s!aO*\[<h  
} %rw}u"3T  
9u?Eb~#$  
V07VwVD  
九、内存的分配方式 re/xs~  
73VQ@J n  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 F:S"gRKz  
'H!V54 \j  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 %6N)G!P  
FN>L7 *,0  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 drbe#FObX  
{hM"TO7\  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 5 >'66gZ  
 w"BIv9N  
&jt02+Hj'  
十、内存分配的注意事项 1y 1_6TZ+  
CX]RtV!  
用new或malloc分配内存时,必须要对此指针赋初值。 ~Po\ En  
]W+)ee|D  
用delete 或free释放内存后,必须要将指针指向NULL  k~{Fnkt  
9uKOR7.zbo  
不能修改指向常量的指针数据 [;*\P\Xih  
|^ ?`Q.|c$  
WFRsSp2  
十一、内容复制与比较 b$dBV}0 L  
1E8$% 6VV  
//数组…… q)vK`\Y  
6={IMkmA  
char a[]=”Hello Word!”; l},dQ4R  
PBCb0[\  
char b[10]; lK "' nLL  
)ni"qv~J  
strcpy(b,a); Y$>+U  
jiqi!*  
if (strcmp(a,b)==0) '^8g9E .4K  
5QKRI)XpZ  
{} [?A&xqO3  
:DDO=  
//指针…… tp7oc_s?.  
oN_S}o  
char a[]=”Hello Word!”; AbL5 !'  
uijq@yo8-  
char *p; 0K&_D)  
$I\))*a  
p=new char[strlen(a)+1]; (qJIu  
_L8Mpx*E  
strcpy(p,a); ]gb _Nv  
3xRM 1GgO  
if (strcmp(p,a)==0) f+{c1fb>s  
km9Gwg/zT  
{} ThjUiuWe  
o^8*aH)I>Y  
Vp|2wlFE-  
十二、sizeof的问题 :8](&B68gE  
c]GQU  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 $$k7_rs  
J>&[J!>r  
char a[]=”Hello World!” Cw6>^  
d,zp `S  
char *p=a; W/b"a?wE{  
KX0<j  
count<<sizeof(a)<<end; //12字节 )C'G2RV  
UAnB=L,.\  
count<<sizeof(p)<<endl; //4字节 ~D<7W4c  
f+*J ue  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 R1I I k  
d-9uv|SJ  
void fun(char a[1000]) ,Y`'myL8W  
<E D8"~_  
{ ^RYn8I  
^wvH,>Yo  
count<<sizeof(a)<<endl; //输出4而不是1000 83mlZ1jQz  
Hlz'a1\:O]  
} }rO?5  
}@3Ud ' Y  
6Hc H'nmeN  
十三、关于指针 ck(CA(_  
i}.{m Et  
1、 指针创建时必须被初始化 bRx2 c  
D+bB G  
2、 指针在free 或delete后必须置为NULL b=6MFPbg  
vpZu.#5c  
3、 指针的长度都为4字节 L~@ma(TV{K  
*ah>-}-  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 kWzuz#  
vp"%IW  
char *p=new char[100]; X=rc3~}f  
^n\9AE3  
strcpy(p,”Hello World”); u5xU)l3  
ZA *b9W  
delete []p; //注意前面的[]号 <_##YSGh,  
FY 1},sq  
p=NULL; w$w>N(e  
!^c:'I>~  
5、数组指针的内容不能超过数组指针的最大容易。 .`oJcJ  
FK4nz2&4  
如: r Iya\z1W  
 ET >S  
char *p=new char[5]; pFpQ\xc9$  
N?MJ#lC F  
strcpy(p,”Hello World”); //报错 目标容易不够大 *u|lmALs  
-/ (DP x  
delete []p; //注意前面的[]号 {0NsDi>(2  
LK'S)Jk  
p=NULL; an*]62l  
"D ts*  
g@S@d&9  
十四、关于malloc/free 和new /delete 4A\BGD*5  
OqfhCNAY  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 %v?jG(o  
]jVIpGM  
l 注意:malloc/free是库函数,new/delete是运算符 [ 4?cM\_u@  
)bB"12Z|8  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 EIq{C-(  
d1srV`  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 Hrd5p+j  
^@|<'g.R-  
l 两者都必须要成对使用 2ru*#Z#(  
^%K1R;  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 FbNH+?  
tJ?qcT?  
8{}Pj  
十五、C++的特性 "4Vi=*2V  
Bo](n*i  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 SeRK7Q&_  
&y#\1K  
重载和内联:即可用于全局函数,也可用于类的成员函数; rE1np^z7  
)1ZJ  
Const和Virtual:只可用于类的成员函数; #hy5c,}>  
Dg9--wI}I9  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 ^D ]7pe  
)V[w:=*  
覆盖是指派生类函数覆盖基类函数 d vg;  
p"hm.=,  
函数名相同; OBKC$e6I  
Ak\D6eHcB  
参数相同; eeI9[lTw  
(]zl$*k  
基类函数必须有Virtual关键字; sx)$=~o  
WryW3];0OR  
不同的范围(派生类和基类)。 z) ]BV=  
gZ `#tlA~  
隐藏是指派生类屏蔽了基类的同名函数相同 C;58z 5*,  
)RAv[U1  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 =FtM;(\  
q_9N+-?{7  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 +YQ)}v  
+ ,vJ7  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 {L-{Y<fke  
M/8#&RycQ  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 8r`VbgI&  
k2_6<v Z  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 ?j&~vy= T  
wa(Wit"-  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如:  |(J ?#?  
^huBqEs  
将void Func(A a) 改为void Func(const A &a)。 oSu|Yn  
Sq?6R}q%  
而void func(int a)就没必要改成void func(const int &a); a!^-~pH:  
?v)"%.  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 DMK"Q#Vw  
.^9/ 0.g8t  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 j-I6QUd  
d 40'3]/{  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; \K_!d]I {  
5x1%oC  
VxPTh\O*[  
十六、extern“C”有什么作用? ?4wehcZz  
; K)?:  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 0+2Matk>.  
)K\k6HC.  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 qs8K jG@  
0()9vTY+  
eLt Cxe  
十七、构造函数与析构函数 6M<mOhp@}n  
6>N u=~  
派生类的构造函数应在初始化表里调用基类的构造函数; 4Ow Vt&  
E3.W#=o  
派生类和基类的析构函数应加Virtual关键字。 *NwKD:o  
.U(SkZ`6  
不要小看构造函数和析构函数,其实编起来还是不容易。 d'g{K]=tF  
&' Nk2{  
#include <iostream.h> !3X%5=#L4  
(PT?h>|St  
class Base K_lCDiqG  
Bu >yRL=*  
{ 2Z IpzH/8  
\ \mO+N47i  
public: %BYlbEx  
ss*2TE7  
virtual ~Base() { cout<< "~Base" << endl ; } Kj<<&_B.H  
1Sc~Vb|>  
}; ^)0{42!]  
kmwrv -W  
class Derived : public Base `w+9j-  
Y;/=3T7An  
{ ?BWvF]p5/  
# V9hG9%8  
public: 3xCA\*  
Uf]Pd)D  
virtual ~Derived() { cout<< "~Derived" << endl ; } 23n8,} H,  
koWb@V]  
}; $d??(   
, LPFb6o  
void main(void) F0ivL`  
A@Yi{&D_Q]  
{ )'I<xx'1  
4z 3$  
Base * pB = new Derived; // upcast ,"MUfZ  
:;#}9g9  
delete pB; 2.&V  
wM&x8 <  
} ?KuJs9SM  
I(kIHjV|  
输出结果为: +fQ$~vr{'  
R^O)fL0_  
~Derived 9 0if:mYA  
N4]6LA6x6  
~Base )I UWM  
#&8pp8wd,}  
如果析构函数不为虚,那么输出结果为 md +`#-D\O  
y2% ^teX k  
~Base ;@-5lCvC(+  
kd4*Zab  
FEi,^V  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 \,#4+&4b  
v5bb|o[{K  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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