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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 m!LJK`gA  
hreG5g9{  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 ay`A Gr  
]GH_;  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 U{?#W  
dk[MT'DV  
/P koqA,  
二、头文件的作用 Kk|4  
Uf\,U8UB  
加强安全检测 c6~<vV'}  
P`TJqJiY~  
通过头文件可能方便地调用库功能,而不必关心其实现方式 -]!zj#&  
kDWMget$  
.F^372hH3  
三、* , &修饰符的位置 J[{?Y'RUM  
'8V>:dy>  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 k#DMd9  
8/BWe ;4  
ukwO%JAr  
四、if语句 ?CSv;:  
-4LckY=]1  
不要将布尔变量与任何值进行比较,那会很容易出错的。 0$:jZ/._  
\?~cJMN  
整形变量必须要有类型相同的值进行比较 r31)Ed$  
+XoY@|Djd  
浮点变量最好少比点,就算要比也要有值进行限制 L,_Z:\^  
"[`/J?W  
指针变量要和NULL进行比较,不要和布尔型和整形比较 CA]u3bf~  
[/GCy0jk  
|$G|M=*LN  
五、const和#define的比较 ,ocAB;K  
@G?R (  
const有数据类型,#define没有数据类型 g\Akf  
A?4s+A@Eg  
个别编译器中const可以进行调试,#define不可以进行调试 D]NJ ^.X  
|?<^4U8  
在类中定义常量有两种方式 Sgq" 3(+%,  
|h^]`= 3  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; SI9PgC  
u`Abko<D  
2、 用枚举代替const常量。 PS'SIX  
BI:O?!:9)  
qt`HP3J&  
六、C++函数中值的传递方式 YES-,;ZQ'  
{pz7ADK<  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) ,KFF[z  
f(E[jwy  
void fun(char c) //pass by value -h%1rw  
W,bu=2K6  
void fun(char *str) //pass by pointer h%8C_m A  
s7"5NU-  
void fun(char &str) //pass by reference Kdr} 7#c  
$8WeWmY  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 *yqke<o9)  
Mt\.?V:  
函数的类型不能省略,就算没有也要加个void L17{W4  
}dpE>  
K8 Hj)$E61  
七、函数体中的指针或引用常量不能被返回 N?><%fra  
,)PpE&  
Char *func(void) gVI T6"/  
"w{$d&+?ag  
{ m_h$fT8 _  
Q9{f'B  
char str[]=”Hello Word”; v{pW/Fu~  
&x)nK  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 :uB(PeAv*  
*QA{xvT  
return str; 9\!=i  
oq[r+E-]$@  
} W<T Ui51Y  
x{9$4d  
函数体内的指针变量并不会随着函数的消亡而自动释放 +c' n,O~3  
&?Z<"+B8S  
Kj/Lcx;bh  
八、一个内存拷贝函数的实现体 z LZ HVvL3  
~WKWx.ul  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) <{IeCir  
iM M s3  
{ FYIz_GTk  
Wn&9R j  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); (&Mv!6]  
_*-b0}T   
byte *pbTo=(byte*)pvTo; //防止地址被改变 6f)7*j~  
OlX#1W]  
byte *pbFrom=(byte*)pvFrom; WXd#`f%  
&Xh=bM'/%m  
while (size-- >0) DWupLJpk;c  
C=(~[Y  
pbTo++ = pbForm++; 't+'rG6x  
`$XgfMBf |  
return pvTo; t|C?=:_  
>OKc\m2%Q  
} !im%t9  
00pe4^U  
V$bq|r  
九、内存的分配方式 YM#J_sy@J.  
5MK.>3fE  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 .p%V]Ka  
F&HvSt}l5  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 \_MWZRMc5  
BO0Y#fs  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 ~h$ H@&5  
zz #IY'dwT  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 !eP0b~$/^J  
rge s`&0  
_ME?o  
十、内存分配的注意事项 ;iz3Bf1o  
ekd;sEO  
用new或malloc分配内存时,必须要对此指针赋初值。 ?ZYj5[op,H  
j-v/;7s/B  
用delete 或free释放内存后,必须要将指针指向NULL {BZ0x2  
;ZTh(_7  
不能修改指向常量的指针数据 Yu:($//w  
dTqL[?wH?  
jF-0fK;)*  
十一、内容复制与比较 (I;lE*>  
2[Xe:)d  
//数组…… |;R-q8  
`+(4t4@ew  
char a[]=”Hello Word!”; 0oo_m6ie&  
Ryn@">sVI  
char b[10]; `[~LMV&2U  
j#${L6  
strcpy(b,a); Pt7C/ qM/  
|T{ZDJ+  
if (strcmp(a,b)==0) W3&~[DS@~  
:-~x~ah-  
{} p7[&H/  
1~[GGl  
//指针…… Ca0t}`<S  
wD SSgk  
char a[]=”Hello Word!”; 10*^  
V,eH E5C  
char *p; ~TjTd  
mWuhXY^Q  
p=new char[strlen(a)+1]; .&/A!3pW  
4}Hf"L[ l  
strcpy(p,a); I bE Nq  
+'UxO'v3]  
if (strcmp(p,a)==0) uR82},r$m  
94.M 8  
{} /_r{7Gq.  
 3,Bm"'b6  
rm,h\  
十二、sizeof的问题 >c.HH}O0W  
E /V`NqC  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 #e6x_o|  
? \NT'CG  
char a[]=”Hello World!” F-Ywl)  
s$VLVT*6  
char *p=a; Do;rY\sY  
v9Ez0 :)  
count<<sizeof(a)<<end; //12字节 ;T WYO  
RueL~$*6.~  
count<<sizeof(p)<<endl; //4字节 k? =_p6>  
iD2>-yf  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 6 i]B8Ziq{  
<(Ktf0'__  
void fun(char a[1000]) J+*n}He,  
Zy > W2(<  
{ G)\6W#de4  
t8-LPq  
count<<sizeof(a)<<endl; //输出4而不是1000 H$]FUv8  
2LH.If  
} /f -\ 3  
vC5y]1QDd  
ow,=M%x"0  
十三、关于指针 F6)/Iiv  
Y--Uo|H  
1、 指针创建时必须被初始化 3/2G~$C  
Y ptP_R:2p  
2、 指针在free 或delete后必须置为NULL -Tr*G4  
+4k7ti1Qb  
3、 指针的长度都为4字节 lF!Iu.MM 9  
o^~KAB7  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ,Mw;kevw  
lDhuL;9e  
char *p=new char[100]; X7& ^"|:  
&(HIBF'O  
strcpy(p,”Hello World”); Oe}6jcb6&  
v"G)G)*z  
delete []p; //注意前面的[]号 J2~oIe2!+  
Zw"K69A)  
p=NULL; ~gvw6e*[  
dz Z75  
5、数组指针的内容不能超过数组指针的最大容易。 0CRk&_ht  
]AzDkKj  
如: >pn5nn1a  
>R}p*=J  
char *p=new char[5]; `.a~G y  
]pP [0 S  
strcpy(p,”Hello World”); //报错 目标容易不够大 SV96eYT<  
tB7g.)yZb  
delete []p; //注意前面的[]号 4Fpu68y  
2DTBL:?`  
p=NULL;  MUd 9R  
EAM2t|M G.  
=HkB>w)h  
十四、关于malloc/free 和new /delete uKocEWB=/F  
w>ap8><4  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 l TRQ/B  
)~l`%+  
l 注意:malloc/free是库函数,new/delete是运算符 OwM.N+ z#T  
t!,GI&  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 Lcpz(W ^  
Fz4g:8qdA  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 THbV],RhJ  
=Wj{J.7mf]  
l 两者都必须要成对使用 2{E"#}/  
>'X[*:Cx  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 <ny)yK  
tX#8 G09G+  
wNgS0{}&`  
十五、C++的特性 `vPc&.-K  
7xmif YC  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 AH#eoKu  
P@z,[,sy"$  
重载和内联:即可用于全局函数,也可用于类的成员函数; ~'9>jpnw  
zU)Ib<$  
Const和Virtual:只可用于类的成员函数; +Ks! 9d*k<  
D,H v(6({  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 ?yq1\G)]  
"2'pS<|  
覆盖是指派生类函数覆盖基类函数 xi =\]  
xiW;Y{kZ  
函数名相同; .oNs8._:  
M[@=m[#a  
参数相同; Y@Zv52,  
Z/S7ei@56  
基类函数必须有Virtual关键字; (7qdrAeP  
71# ipZ  
不同的范围(派生类和基类)。 _s_%}8o  
hi30|^l-  
隐藏是指派生类屏蔽了基类的同名函数相同 0ThX1)SH  
NdW2OUxw"  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 RN%*3{-  
NJ;D Qv  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 x(Us O}  
&7YTz3aj  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 L/VlmN_v>s  
?<iinx   
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 jxU z-U-  
mXH\z  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 m*d {pX  
azxGUS_i<  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 8a^E{x@HT  
fgW>U*.ar  
将void Func(A a) 改为void Func(const A &a)。 /*+P}__k  
Oz[]]`C1  
而void func(int a)就没必要改成void func(const int &a); g(i_di  
<=D\Ckmb  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 GYX/G>-r  
J\BTrN7  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 Me HlxI  
LtxeT .  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; ?4kM5NtP  
)NoNgU\7!  
3:XF7T  
十六、extern“C”有什么作用? "lFS{7  
b6FC  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 JFyw,p&xB  
8+>r!)Q+  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 7Z#r9Vr  
1gA9h-'w  
ne=?'e4  
十七、构造函数与析构函数 Y~P1r]piB  
"h-G=vo,kl  
派生类的构造函数应在初始化表里调用基类的构造函数; ]5V=kNu i  
29xm66  
派生类和基类的析构函数应加Virtual关键字。 |# _F  
J-6l<%962%  
不要小看构造函数和析构函数,其实编起来还是不容易。 *?2aIz"  
JH4hy9i  
#include <iostream.h> +:a#+]g  
W:s>?(6?  
class Base 3y[6n$U&  
3tO=   
{ 0^H"eQO  
[9wuaw"~[Z  
public: ; i)NP X  
%j.B/U$  
virtual ~Base() { cout<< "~Base" << endl ; } A5UZUU^  
I`$"6 Xy  
}; kqebU!0-  
> FVBn;1  
class Derived : public Base s?fO)7ly  
q X"Pg  
{ 88@" +2  
+N|}6e  
public: { ]*#WU  
 {"RUiL^  
virtual ~Derived() { cout<< "~Derived" << endl ; } .T2P%Jn.  
%4=r .9  
}; % `4\ 8H`  
$ $=N'Q  
void main(void) M$jU-;hRH  
qZV.~F+  
{ 8h.Dc&V  
hT=6XO od4  
Base * pB = new Derived; // upcast Smt&/~7D%  
L@|xpq  
delete pB; lpy( un  
=tKb7:KU  
} ?;bsg 9  
[P3].#"]M=  
输出结果为: W$>AK_Y}  
QY^v*+lr\  
~Derived F> H5 ww9E  
~S85+OJ;M  
~Base u ? }T)B  
# :)yh]MP  
如果析构函数不为虚,那么输出结果为 WZ A8D0[  
l0v]+>1i:  
~Base ?V{AP&#M$x  
1MPn{#Ff  
@V7HxW7RX  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 (6Y.|u]bq  
=o+js;3  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八