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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 D5$| vv1  
zya2 O?s  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 %Gc)$z/Wd  
#CTeZ/g  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Xcw 6mpLt  
U C..)9  
`FHKQS5  
二、头文件的作用 ?my2dd,|  
)=5 ,S~IT  
加强安全检测 rPUk%S  
J e.%-7f  
通过头文件可能方便地调用库功能,而不必关心其实现方式 DtglPo_(  
-a`P W  
&[qJ=HMm I  
三、* , &修饰符的位置 tr@)zM GB  
wHE1Jqpo  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 Ta NcnAY>9  
m ^ '!  
B*&HQW *u  
四、if语句 ihBIE  
RZbiiMC>  
不要将布尔变量与任何值进行比较,那会很容易出错的。 *RJiHcII  
~jDf,a2  
整形变量必须要有类型相同的值进行比较 5h@5.-}  
_qvzZ6  
浮点变量最好少比点,就算要比也要有值进行限制 UJ7{FN=@t  
cllnYvr3  
指针变量要和NULL进行比较,不要和布尔型和整形比较 :7[4wQDt4  
f <pJ_  
r O-=):2  
五、const和#define的比较 K_o[m!:jU  
u5rHQA0%  
const有数据类型,#define没有数据类型 YlJ_$Q[  
ZIs=%6""&  
个别编译器中const可以进行调试,#define不可以进行调试 Apbgm[m|{  
RhD   
在类中定义常量有两种方式 >bbvQb +j  
P&5kO;ia  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; Yx':~  
nNpXkI:  
2、 用枚举代替const常量。 PsO>&Te2  
3e ?J#;  
g66x;2Q  
六、C++函数中值的传递方式 EWK?vs  
Zr|z!S?aSC  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) &h'NC%"v  
M~P h/  
void fun(char c) //pass by value 5nS}h76mZ  
H{ I,m-  
void fun(char *str) //pass by pointer DT[WO_=  
o|Kd\<rY  
void fun(char &str) //pass by reference bA02)?L  
\%Lj !\  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 @YHt[>*S  
Hd89./v`:  
函数的类型不能省略,就算没有也要加个void Mt\.?V:  
`9mc+  
3_N1y  
七、函数体中的指针或引用常量不能被返回 k~IRds@G  
}dpE>  
Char *func(void) 0s .X  
1BOv|xPjZ  
{ EFz Pt?l  
8)XAdAr  
char str[]=”Hello Word”; ,)PpE&  
;uN&yj<}a  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 mu$rG3M  
fR#W#n#m  
return str; 6wH:jd9,  
U$ Od)  
} o(eh.  
NuR3]Ja\0  
函数体内的指针变量并不会随着函数的消亡而自动释放 tOxTiaa=  
04#<qd&ob@  
Tl L\&n.$  
八、一个内存拷贝函数的实现体 j|%>NB ):  
3,)[Q?nKD  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) *QA{xvT  
~ugH2jiB  
{ Y lhKP;  
bA\(oD+:  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); 5`Y>!| Ab  
46gDoSS  
byte *pbTo=(byte*)pvTo; //防止地址被改变 u-@;Q<v$  
NS){D7T  
byte *pbFrom=(byte*)pvFrom; z C 7b  
7}puj%JS /  
while (size-- >0) tu6<>  
<6.?:Jj  
pbTo++ = pbForm++; 4P}d/w?'KL  
y/;DA=  
return pvTo; dZuPR  
Mw|lEctN0  
} hp$1c  
p Cgm!t?/  
0y3C />a  
九、内存的分配方式 DqA$%b yyE  
FYIz_GTk  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 GC7W7B  
yi*EE%  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 hCob^o  
g"v6UZ\  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 _*-b0}T   
+zZ]Txb(  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 5#mHWBGd7  
&Y1RPO41J  
z-^/<u1p  
十、内存分配的注意事项 ta0;:o?/d  
;jh.\a_\  
用new或malloc分配内存时,必须要对此指针赋初值。 `. 3{  
;E0x#JUrw  
用delete 或free释放内存后,必须要将指针指向NULL {hVc,\A  
:eFyd`Syw  
不能修改指向常量的指针数据 ~~}8D"  
]T._TZ"  
&neB$m3y  
十一、内容复制与比较 i4lB ]k  
8 @r>`c  
//数组…… <vd}oiB@  
?d_vD@+\  
char a[]=”Hello Word!”; EpK7VW  
/$^SiE+N  
char b[10]; Z_s]2y1  
F%$l cQ04%  
strcpy(b,a); F`CDv5  
Sobp;OZ5  
if (strcmp(a,b)==0) 3:bP>l!  
m@"p#pt(_  
{} Kh{_BdN  
(5kL6d2  
//指针…… &/?OP)N,}  
BiA^]h/|  
char a[]=”Hello Word!”; ~!6 I.u  
r{wf;5d(  
char *p; BC R]K  
qdo_YPG  
p=new char[strlen(a)+1]; !'Ww%ZL\   
.J?RaH{i  
strcpy(p,a); A>6_h1  
Awe'MGp%  
if (strcmp(p,a)==0) x\pygzQ/  
:=\`P  
{} d?><+!a  
|nY+Nen7  
G0(A~Q"  
十二、sizeof的问题 e}iv vs2  
$]MOAj"LH  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 U04)XfO;]  
!, {-q)'D  
char a[]=”Hello World!” -BH T'zq1S  
\~.elKw<U  
char *p=a; n<Ki.;-ZE  
j.:f =`xf  
count<<sizeof(a)<<end; //12字节 40$9./fe)  
g_)i)V  
count<<sizeof(p)<<endl; //4字节 rd^j<  
=z'533C  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 9#a/at]  
$x2G/5?  
void fun(char a[1000]) mxICQ>s b  
1-PFM-  
{ W=4|ahk$  
Lbu,VX  
count<<sizeof(a)<<endl; //输出4而不是1000 Vk%W4P"l  
j#${L6  
} &Q t1~#1  
R^rA.7T  
PMe3Or@  
十三、关于指针 =cxG4R1x  
Vu,:rPqI  
1、 指针创建时必须被初始化 :AyZe7:(D  
<Ys7`e6eY  
2、 指针在free 或delete后必须置为NULL cq9d;~q  
*oAnG:J+M  
3、 指针的长度都为4字节 (qDJgf4fgn  
p<&dy^mS  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 N|w;wF!3  
Rk}=SB-  
char *p=new char[100]; `tm(3pJ  
Y^gIvX  
strcpy(p,”Hello World”); ]#dZLm_  
q,]57s  
delete []p; //注意前面的[]号 MT<3OKo?:  
0p=  
p=NULL; X:W}S/  
r]&&*:  
5、数组指针的内容不能超过数组指针的最大容易。 <n0j'P>1  
:KsBJ>2ck  
如: 4}Hf"L[ l  
Co`:D  
char *p=new char[5]; bj FND]p?w  
$B`bsJ  
strcpy(p,”Hello World”); //报错 目标容易不够大 )T@+"Pw8t  
\p\rPf Y{>  
delete []p; //注意前面的[]号 dq3"L!0u  
%Gm4,+8P3o  
p=NULL; WiFZY*iu5  
>k(AQW5?  
y|Y hDO  
十四、关于malloc/free 和new /delete =GLMdhD]  
%j?7O00 @  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 >c.HH}O0W  
||.Ve,<:  
l 注意:malloc/free是库函数,new/delete是运算符 #}xPOz7:  
rH[Eh8j,  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 A{Q~@1  
#b{;)C fL  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 CxVrnb[`q  
q,(hs]\@  
l 两者都必须要成对使用 / !A&z4;D  
bfA9aT  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 2^&5D,}0  
Zh_ P  
< !]7Gt  
十五、C++的特性 AI2>{V  
VM"*@T  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 UFUm-~x`  
rE\.[mFI  
重载和内联:即可用于全局函数,也可用于类的成员函数;  34~[dY  
cS"PIelR  
Const和Virtual:只可用于类的成员函数; PSa"u5O  
 U66oe3W  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 K|.!)L  
.,SWa;[iB  
覆盖是指派生类函数覆盖基类函数 \K(# r=  
m`8tHHF  
函数名相同; G)\6W#de4  
KT8]/T`U  
参数相同; &qZ:"k  
|*zvaI(}  
基类函数必须有Virtual关键字; YQ5d!a.  
[R Hji47  
不同的范围(派生类和基类)。 YR$d\,#R  
BU;E6s>P  
隐藏是指派生类屏蔽了基类的同名函数相同 |C;*GeyS;J  
ZAMS;e+e  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 Ib$?[  
vjD||!g'  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 pw1&WP&?3  
D i #Em[  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 5[$jrG\!  
q=cH ^`<.  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 WhR'MkfL  
AN-;*n<'  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 #[Vk#BIiv8  
ZNG{:5u,  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: cKKl\g@}  
vF,iHzv  
将void Func(A a) 改为void Func(const A &a)。 WTcrfs)T  
*=X$j~#X  
而void func(int a)就没必要改成void func(const int &a); "/zIsn7  
<+oTYPgD9  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 Tl9;KE|  
RN%*3{-  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 NJ;D Qv  
x(Us O}  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; G-)Q*p{i|  
JP t=~e(  
;m+*R/  
十六、extern“C”有什么作用? c9eLNVM  
mXH\z  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 m*d {pX  
-Pr1 r  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 & bwhD.:=  
5Cp6$V|/kv  
,y+}0q-Ou  
十七、构造函数与析构函数 POtj6 ?a  
vncak  
派生类的构造函数应在初始化表里调用基类的构造函数; :|\{mo1NB  
[a<u cJ  
派生类和基类的析构函数应加Virtual关键字。 12yr_   
avb'J^}f  
不要小看构造函数和析构函数,其实编起来还是不容易。 5VU 5kiCt  
a}Dx"zl;  
#include <iostream.h> cF[L6{Oe  
;w/|5 ;{A;  
class Base FG^ Jh5  
JYt)4mOo  
{ 6i6m*=h  
V5MLzW\8  
public: Gd:TM]rJ  
[=})^t?8  
virtual ~Base() { cout<< "~Base" << endl ; } ID-Y*  
V6:S<A  
}; ,[ UqUEO  
6z6\-45  
class Derived : public Base T=EHue$  
o1m+4.-  
{ tJ{3Z}K  
U.fL uKt  
public: |4J ;s7us  
)O xsasn)M  
virtual ~Derived() { cout<< "~Derived" << endl ; } M x/G^yO9  
>tmv3_<=  
}; + [JvpDv%  
e5g# a}  
void main(void) xnuu#@f  
<6 HrHw_  
{ H{}Nr 4  
M+7&kt0;  
Base * pB = new Derived; // upcast 9h Jlc  
kBh*@gf  
delete pB; EO&PabZWR  
8=GgTpO5  
} eHQS\n  
#2/2X v  
输出结果为: St1Ny,$yU  
6n|R<DO%\  
~Derived ^\ N@qL  
 {"RUiL^  
~Base gMGX)Y ,=/  
Oc Gg'R7  
如果析构函数不为虚,那么输出结果为 qG]G0|f  
s=Cu-.~L  
~Base ?M}W ;Z  
4Y2!q$}I+  
Q7!";ol2  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 U#qs^f7R  
R{3?`x!fY  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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