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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 #l kv&.)x  
b}DxD1*nsI  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 WEgJ_dB  
&jJj6 +P\  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 $j? zEz  
~gz_4gzb  
@VlDi1  
二、头文件的作用 (~ 6oA f  
!g=2U`j^  
加强安全检测 I<p- o/TP  
Z(F`M;1>xI  
通过头文件可能方便地调用库功能,而不必关心其实现方式 JHN{vB  
XcfvmlBoD-  
8G&'ED_&  
三、* , &修饰符的位置 nksx|i l  
{OA2';3  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ~\;s}Fv.  
JDi\?m d.  
_.b^4^[  
四、if语句 t= =+SHGP  
`cee tr=  
不要将布尔变量与任何值进行比较,那会很容易出错的。 D?yiK=:08`  
X=QaTV  
整形变量必须要有类型相同的值进行比较 s,&tD WU  
sFh mp  
浮点变量最好少比点,就算要比也要有值进行限制 .UJp#/EHs  
v<+5B5"1  
指针变量要和NULL进行比较,不要和布尔型和整形比较 8t4o}3>  
rVo0H.+N)`  
/_yJ;l/K  
五、const和#define的比较 :Fe}.* t  
]iP  +Y  
const有数据类型,#define没有数据类型 v#yeiE4  
TGUlJLT  
个别编译器中const可以进行调试,#define不可以进行调试 S6~&g|T,  
C !a#M{:  
在类中定义常量有两种方式 PNNY_t +I  
:xd)]Ns  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 6|h~pH  
46 p%y  
2、 用枚举代替const常量。 *qM)[XO  
m-%.LDqM  
u">KE6um  
六、C++函数中值的传递方式 fa~4+jx>S  
U]!~C 1cmw  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) s/' ]* n  
v[P $c$Xi  
void fun(char c) //pass by value fpESuVKr  
3<c_`BWu  
void fun(char *str) //pass by pointer )#|I(Gz ^  
^5{M@o  
void fun(char &str) //pass by reference =t,}I\_^c  
C"X; ,F<  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 ?H7YmN  
G a1B&@T  
函数的类型不能省略,就算没有也要加个void 9c `Vrlu  
>P-{2 a,4  
2h:*lV^  
七、函数体中的指针或引用常量不能被返回 WoYXXYP/E  
>)V1aLu=  
Char *func(void) YfB8  
QC/%|M0 {  
{ m]XG7:}V0  
5 5$J% ;&  
char str[]=”Hello Word”; vz{Z tE"  
m :M=De  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 m+Um^:\jX  
{`X O3  
return str; [PRQa[_  
qKL :#ny  
} R]Iv?)Y  
$0(~ID  
函数体内的指针变量并不会随着函数的消亡而自动释放 V~tZNR J-  
CAs8=N#H%  
71)DLGL  
八、一个内存拷贝函数的实现体 Qv v~nGq$  
Aw7oyC!  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) /b ]Yya#  
cN]e{|  
{ "$@Wy,yp  
Imv ]V6"D=  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); J%|n^^ /un  
1-!q,q  
byte *pbTo=(byte*)pvTo; //防止地址被改变 e<.O'!=7Y  
reO^_q'  
byte *pbFrom=(byte*)pvFrom; R WfC2$z  
\DDR l{  
while (size-- >0) ZSs)AB_Pe/  
=zetZJg  
pbTo++ = pbForm++; 0vi)m y;!  
j B.ZF7q  
return pvTo; n#\ t_/\  
N51g<K  
} b@p3iq:  
VH>?%aL  
.UdoB`@!v=  
九、内存的分配方式 =&9x}4`;%  
!%8|R]d  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 +?&|p0  
8M5a&35J"  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ,.Sd)JB'  
:\Pk>a  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 nKR=/5a4Y  
6/4?x)l3-  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 =W*Js%4  
v c r5  
/a'cP  
十、内存分配的注意事项 I7[F,xci  
5:T)hoF@  
用new或malloc分配内存时,必须要对此指针赋初值。 MhaoD5*9  
~WKcO&  
用delete 或free释放内存后,必须要将指针指向NULL 94Hs.S)  
"{1SDbwmMo  
不能修改指向常量的指针数据 $t1XoL  
Z` ;.62S  
6Z:swgi6&  
十一、内容复制与比较 s\Zp/-Q  
:)PAj  
//数组…… D=!e6E<>@  
+^@;J?O  
char a[]=”Hello Word!”; ){_D  
-_4ZT^.Lna  
char b[10]; ]TTQ;F  
?J1x'/G  
strcpy(b,a); _7^4sR8=  
p3f>;|uh_  
if (strcmp(a,b)==0) d^.@~  
S1`;2mAf*  
{} 2)W~7GED  
}BR@vY'd  
//指针…… bAd$ >DI[  
 Ie<`WU K  
char a[]=”Hello Word!”; MT?;9ZV}  
`H#G/zOr  
char *p; )ld !(d=  
(mvzGXNz4  
p=new char[strlen(a)+1]; /8s+eHn&%  
/4Q^L>a  
strcpy(p,a); 8'n xc#&  
Mu~DB:Y9e  
if (strcmp(p,a)==0) PrZs@ Y  
5PCMxjon  
{} jcY:a0[{D  
q|r/%[[!o  
Fh3>y2 `/  
十二、sizeof的问题 D{Rk9MKkE  
>&`S$1 o  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 mv0JD(  
f(}AdW}?  
char a[]=”Hello World!” FK:Tni  
HAHLF+k  
char *p=a; j)vfI>  
6Z,j^: B  
count<<sizeof(a)<<end; //12字节 5|pPzEA>  
a-9Y &#U  
count<<sizeof(p)<<endl; //4字节  > h>  
Zd Li<1P*d  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 1638U 1  
HpQuro'Qh  
void fun(char a[1000]) /2&:sHWW  
chQCl3&e^  
{ Cxt_QyL?  
"y5LojdCs  
count<<sizeof(a)<<endl; //输出4而不是1000 -9(9LU2  
.]IidsgM  
} SZ*Nr=X  
P%nN#Qm  
lZI?k=rWv  
十三、关于指针 m%[Ul@!V  
MD 62ObK!  
1、 指针创建时必须被初始化 = ;!$Qw4  
jJ B+UF=  
2、 指针在free 或delete后必须置为NULL .8I\=+Zi  
T*'?;u  
3、 指针的长度都为4字节 %~$P.Zh  
>3J?O96|f  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 GmJ4AYEP  
Z}E.s@w  
char *p=new char[100]; i`F8kg`_K  
#K[UqJ+x  
strcpy(p,”Hello World”); |;[%ZE"  
5VXI/Lw#  
delete []p; //注意前面的[]号 ,{tK{XpS  
s>VpbJ3S  
p=NULL; <691pk X  
6n  
5、数组指针的内容不能超过数组指针的最大容易。 (C=.&',P  
ohod)8  
如: ]l~TI8gC  
/%P|<[< [  
char *p=new char[5]; x_yQoae  
$^ wqoW%t  
strcpy(p,”Hello World”); //报错 目标容易不够大 "G+g(?N]j  
qVpV ZH!  
delete []p; //注意前面的[]号 F"?OLV1B&  
@S%ogZz*m  
p=NULL; ZjEc\{ s  
uq~Z  
Vp5i i]B4  
十四、关于malloc/free 和new /delete !i`HjV0wS  
x)h|!T=B~  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 :zW I"  
m,TN%*U!  
l 注意:malloc/free是库函数,new/delete是运算符 @Z fQ)q\  
Rx}*I00  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 >*v P*H:P  
7tEkQZMDI  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 aT[qJbp1  
-!~ T$}/F  
l 两者都必须要成对使用 I>(3\z4s  
bu j}pEI  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 ^^O @ [_  
5Wyo!pRi  
zHEH?xZ6sD  
十五、C++的特性 [lmghI!  
WlJ $p$I`  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 zFn!>Tqe  
5Q9nJC{'NN  
重载和内联:即可用于全局函数,也可用于类的成员函数; Tf|?j=f  
V^  
Const和Virtual:只可用于类的成员函数; Xqz\%&G  
*j9hjq0j  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 Exy|^Dr0  
zn=Ifz)#|  
覆盖是指派生类函数覆盖基类函数 YEg(QOn3Q  
19r4J(pV  
函数名相同; `~0^fSww  
3t*e|Ih&j5  
参数相同; 1hz:AUH  
H;eGBVi  
基类函数必须有Virtual关键字; ,k,RXgQ  
e?V7<7$  
不同的范围(派生类和基类)。 TVVr<r  
^iHwv*ss  
隐藏是指派生类屏蔽了基类的同名函数相同 t,f)!D$  
'UW(0 PXw  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 q$<M2  
\$iU#Z  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 _~{Nco7T  
!ULU#2'1  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 eL vbPE_  
)37.H^7  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 ['*{f(AI  
I"4Lma  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 f4h|Nn%;  
2NNAsr}L  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 24}?GO  
Ci}v+  
将void Func(A a) 改为void Func(const A &a)。 ;`{PA !>  
%/K'VE6pb  
而void func(int a)就没必要改成void func(const int &a); fW'@+<b  
/|)VO?*D  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 Ji#"PE/Pt  
\h#,qTE  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 XVlZ:kz  
}:b6WN;c  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; aT]G&bR?  
<8JV`dTywC  
o `]o(OP  
十六、extern“C”有什么作用? "<e<0::  
@AvDV$F  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 `Wes!>Vh!  
cEP!DUo  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 cIm_~HH  
(Ov{gj^  
)t$<FP  
十七、构造函数与析构函数 /YyimG7  
_D{V(c<WD  
派生类的构造函数应在初始化表里调用基类的构造函数; NB["U"1[^E  
`YK2hr  
派生类和基类的析构函数应加Virtual关键字。 j/oM^IY  
=u*\P!$  
不要小看构造函数和析构函数,其实编起来还是不容易。  |>Q ] q  
}k`-n32)|  
#include <iostream.h> *tWZ.I<<  
WT-BHB1  
class Base )*b dG'}  
*Y4[YnkPE  
{ Mdj?;'Yv  
yU e7o4Zm  
public: Rr9K1io$)  
(.CEEWj%{  
virtual ~Base() { cout<< "~Base" << endl ; } 86bRfW'  
)@IDmz>  
}; @y|ZXPC#  
S,=#b 4\#%  
class Derived : public Base pd3=^ Zi  
h.QsI`@f  
{ 3 N5un`K7  
\~LwlOo%R  
public: ??'>kQ4  
hPb erc2  
virtual ~Derived() { cout<< "~Derived" << endl ; } q{fgsc8v\  
0TDc Q  
}; a5)<roWQ  
up# R9 d|  
void main(void) b`lLqV<[cB  
>q}Ns^ .'  
{ S .KZ)  
bv NXA*0  
Base * pB = new Derived; // upcast V!|:rwG2  
PNSV?RT*pG  
delete pB; n^a&@?(+  
_SW_I{fjr  
} Ojh\H  
L.E6~Rv  
输出结果为: a/ k0(  
csEF^T-  
~Derived &D/@H1fBe  
 3ih3O  
~Base 8zOoVO  
&B3[:nS2  
如果析构函数不为虚,那么输出结果为 c,v?2*<  
[i9.#*  
~Base R#n!1~ (  
prdlV)LTpY  
]]EOCGZ"  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 $=IJ-_'o  
F*0rpQ,*  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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