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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 qche7kg!a  
]j(Ld\:L  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 dRTpGz  
<pUc( tPoz  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 j MA%`*r  
_[ `"E'  
98WJ"f_ #  
二、头文件的作用 !v3wl0  
,-BZsZ0~  
加强安全检测 yAc}4*;T/  
UOI Z8Po  
通过头文件可能方便地调用库功能,而不必关心其实现方式 <7X+-%yb;  
Rh7=,=u  
tQ4{:WPG  
三、* , &修饰符的位置 y] ~X{v  
T0}P 'q  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ~0n9In%  
!i6 aA1'  
j0jam:.p  
四、if语句 PvdR)ZE m  
!Jo.Un7  
不要将布尔变量与任何值进行比较,那会很容易出错的。 *Xd_=@L&B  
O0"&wvR+5  
整形变量必须要有类型相同的值进行比较 o-t!z'\lO  
yDw^xGws  
浮点变量最好少比点,就算要比也要有值进行限制 "?sLi  
5{6ebq55"  
指针变量要和NULL进行比较,不要和布尔型和整形比较 nzu 3BVv  
H %PIE1_  
;:gx;'dm5  
五、const和#define的比较 Eb9M;u  
)5bdWJ>l  
const有数据类型,#define没有数据类型  ,#-^  
O4 Y;  
个别编译器中const可以进行调试,#define不可以进行调试 Va'K~$d_  
iAW oKW  
在类中定义常量有两种方式 sfNAGez  
m;I;{+"u  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; <kor;exeJ  
%u|qAF2uS  
2、 用枚举代替const常量。 ~LzTqMHM  
>:P3j<xTv  
RwwX;I"o%  
六、C++函数中值的传递方式 :Zd# }P  
wwmODw<tT  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) DSHpM/7  
5 *>3(U  
void fun(char c) //pass by value L9U<E $%#  
l+ <x  
void fun(char *str) //pass by pointer ]t3 NA*mM  
#Ryu`b  
void fun(char &str) //pass by reference c5rQkDW  
IA;KEGJ  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 =U".L  
]QU52R@M  
函数的类型不能省略,就算没有也要加个void Onoi6^G  
^q$vyY   
Jq`fD~(7  
七、函数体中的指针或引用常量不能被返回 V1;Qt-i  
,K6]Q|U@r  
Char *func(void) OiY2l;68  
0?t!tugG  
{ ArU>./)Q  
BmUzsfD  
char str[]=”Hello Word”; Xl*-A|:j  
ig/716r|  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 Gb \ 7W  
|@-WC.  
return str; @;,O V&XYn  
jIc;jjAF  
} @]#+`pZ4A  
~K],hi^<P  
函数体内的指针变量并不会随着函数的消亡而自动释放 9e :E% 2  
C12 7he  
l7J_s?!j  
八、一个内存拷贝函数的实现体 p N]Hp"v  
2i(|?XJ^  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) qc'tK6=jp  
v981nJ>w,  
{ a\m10Ih:  
 2 5ZGuM  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); Da-(D<[0  
.Um%6a-  
byte *pbTo=(byte*)pvTo; //防止地址被改变 1I^Sv  
(\/HGxv  
byte *pbFrom=(byte*)pvFrom; v|,Hd  
v V^GIWK  
while (size-- >0) q%:Jmi>  
pmW=l/6+V3  
pbTo++ = pbForm++; Ft.BfgJ$  
Sc~kO4  
return pvTo; sqZHk+<%  
A#  M  
} S s`0;D1  
e<^4F%jSK  
kyo ,yD  
九、内存的分配方式 V!U[N.&$  
Yg]f2ke  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 G[>-@9_b  
2aje$w-  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 i)(Q Npv  
Ju9v n44  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 'qd")  
]VYl Eqe  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 S8)awTA9  
 B-gr2-  
tl^[MLQa  
十、内存分配的注意事项 &s<  
E0DEFB  
用new或malloc分配内存时,必须要对此指针赋初值。 eXaDx%mM  
Rt:PW}rFf  
用delete 或free释放内存后,必须要将指针指向NULL -<O:isB   
zuPH3Q={  
不能修改指向常量的指针数据 \%Smp2K  
M{4_BQ4$  
G<dXJ ]\\  
十一、内容复制与比较 #dfW1@m  
er#=xqUY  
//数组…… X0$_KPn  
1a!h&!$9  
char a[]=”Hello Word!”; T+ t-0k  
tQ}gBE63  
char b[10]; z*[Z:  
B&$89]gs|  
strcpy(b,a); >PJ-Z~O'   
5k(#kyP  
if (strcmp(a,b)==0) fIcv}Y  
E0pQRGPA  
{} 5y'Yosy:  
l&A`  
//指针…… :gVjBF2  
(os7Q?  
char a[]=”Hello Word!”; ]\ezES  
3U`.:w`  
char *p; E{ ,O}  
an2Tc*=~l(  
p=new char[strlen(a)+1]; XHg %X  
Q}T9NzOH%  
strcpy(p,a); rN~`4mZ  
By_Ui6:D  
if (strcmp(p,a)==0) QaO`:wJj  
DRIv<=Bt  
{} %dU}GYL_  
N9ufTlq s  
y b G)=0  
十二、sizeof的问题 i=a LC*@  
@6!JW(,]\  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 `+o.w#cl  
=KZ4:d5  
char a[]=”Hello World!” Vel;t<1  
u@E M,o  
char *p=a; {EUH#':  
D.6dPzu`  
count<<sizeof(a)<<end; //12字节 xVyUUzXs  
| <*(`\ 'w  
count<<sizeof(p)<<endl; //4字节 !%X`c94  
.'1j5Y-l`N  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 z Y|g#V-  
"p{ '984r<  
void fun(char a[1000]) ;Z_C3/b  
9wAc&nl-Y  
{ \PONaRK|[z  
@^%_ir(  
count<<sizeof(a)<<endl; //输出4而不是1000 v^pP& <G  
kI'A` /B l  
} `[\phv  
J4g;~#_19  
"/fs%F  
十三、关于指针 `[&2K@u  
N96BWgT  
1、 指针创建时必须被初始化 z{d5Lrk  
wVOL7vh  
2、 指针在free 或delete后必须置为NULL ,]mwk~HeF  
=R.9"7~2x  
3、 指针的长度都为4字节 ks;wc"k"  
$rEd5W&d!  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 jZ!JXmVV  
eLny-.i ,7  
char *p=new char[100]; }6> J   
z)>{O3  
strcpy(p,”Hello World”); Y(zN  
7]j-zv  
delete []p; //注意前面的[]号 )''wu\7A)'  
YoJ'=z,e  
p=NULL; !f-o,RJ  
m[j3s=Gr  
5、数组指针的内容不能超过数组指针的最大容易。 Z5L1^  
ELF`u WG E  
如: bl?%:qb.V  
)X;cS} yp  
char *p=new char[5]; )<F\IM  
}Xi#x*-D  
strcpy(p,”Hello World”); //报错 目标容易不够大 i_Z5SMZ  
t`,IW{  
delete []p; //注意前面的[]号 Z D%_PgiT  
q'U5QyuC  
p=NULL; mN 6`8 [  
}%ThnFFBw  
Y0\\(0j64  
十四、关于malloc/free 和new /delete I JY5wP1"  
i q:Q$z&  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 5]l7Z35  
PAU+C_P  
l 注意:malloc/free是库函数,new/delete是运算符 @a\SR'8  
vCSB8R  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 FT>~ES]cQd  
aX)./  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 JvL'gJ$70  
D!a5#+\C  
l 两者都必须要成对使用 q{/Jw"e  
l6c%_<P|  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 uO(guA,C  
U/!&KsnT  
_|B&v  
十五、C++的特性 m`IQ+, e  
/^ 3oq]  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 kO_XyC4(  
N"RYM~c7  
重载和内联:即可用于全局函数,也可用于类的成员函数; K]!u@I*K"  
;nKHm  
Const和Virtual:只可用于类的成员函数; B8AzN9v&"N  
F ssEs!#  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 #pQ"+X  
Df~p 'N-$  
覆盖是指派生类函数覆盖基类函数 *P R_Y=v%  
.l=*R7~EU  
函数名相同; S<!_ uq  
|zq!CLjD@  
参数相同; G+ v, Hi1  
]Y&)98  
基类函数必须有Virtual关键字; |;9 A{#zM  
QlYs7zZ  
不同的范围(派生类和基类)。 C!{AnWf  
| 58 !A]  
隐藏是指派生类屏蔽了基类的同名函数相同 YB B$uGA  
G7A bhb,  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 ob0 8xGj  
V<2fPDZ  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 w;@25= |  
!x$ :8R  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 JkDPuTXD  
#;LMtDaL  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 xGEmrE<;  
^ ]qV8  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 OZ'.}((?n  
M2E87w  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: vk)0n=  
0 \Yx.\X,  
将void Func(A a) 改为void Func(const A &a)。 =ym  
4^[}]'w  
而void func(int a)就没必要改成void func(const int &a); aaz"`,7_  
+'['HQ)  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 \q|7,S,5  
(#B^Hyz!  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 6{+_T  
P% +or*  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; Wda\a.bXT  
P"9@8aLB  
0L0Jc,(F+  
十六、extern“C”有什么作用? 3Wb2p'V7$?  
+*_fN ]M  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 KT];SF ^Y  
]bN&5.|  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ,t%CK!8  
?S@R~y0K  
}-{b$6]  
十七、构造函数与析构函数 ;4kx>x*H  
te;Ox!B&  
派生类的构造函数应在初始化表里调用基类的构造函数; )y`TymM[F  
oB0 8  
派生类和基类的析构函数应加Virtual关键字。 ] `B,L*m6  
r'd:SaU+  
不要小看构造函数和析构函数,其实编起来还是不容易。 <,@H;|mZ  
&*aer5?`  
#include <iostream.h> y Tw',N{  
7.$]f71z  
class Base 1]>$5 1Q  
eyf4M;goz}  
{ 4Hml.|$  
OgKWgvy  
public: 'je8k7`VA  
b ~/Wnp5  
virtual ~Base() { cout<< "~Base" << endl ; } AJ\VY;m7F  
(L y%{ Y  
}; P(pd0,%i;a  
]HyHz9QkL  
class Derived : public Base G}P)vfcH  
MOP]\ypn  
{ U6juS/  
}O.LPQ0  
public: VR4E 2^  
dv^e 9b|  
virtual ~Derived() { cout<< "~Derived" << endl ; } :/@k5#DY  
BH&/2tO%  
}; X:G& 5  
QJ a4R  
void main(void) hGed/Yr  
dd \bI_  
{ [xtK"E#  
8Wdkztp/S  
Base * pB = new Derived; // upcast Ii~; d3.  
0{0;1.ZP  
delete pB; }c` ?0FQ  
(B>)2:T1  
} TRgY:R_  
^e?$ ]JiA!  
输出结果为: F2bm+0vOJ  
3VcT7y*{P  
~Derived $R%+*  
UsLh)#}h  
~Base "JzfL(yt  
S9G8aea/  
如果析构函数不为虚,那么输出结果为 BgJkrv7~  
%"l81z  
~Base [as-3&5S  
oMh~5 W  
0\5M^:8i3  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 g|ql 5jW  
Zk]k1]u*5  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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