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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 ~Kda#=  
?H1I,]Di  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 fV*x2g7w  
9,Zg'4",d  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 #6'oor X  
Vnuz! 6.  
%j=dKd>  
二、头文件的作用 d.tjLeY  
p?X.I]=vRv  
加强安全检测 +B^ / =3P  
N kp>yVj  
通过头文件可能方便地调用库功能,而不必关心其实现方式 B, nCx=\S  
gT-'#K2qT  
bs U$mtW  
三、* , &修饰符的位置 1C+Y|p?KA  
|J2_2a/"  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 a*hOT_;#  
5%D:w S1  
h>= e<H?f  
四、if语句  bW<_K9"  
[CBA Lj5  
不要将布尔变量与任何值进行比较,那会很容易出错的。 yXS ~PG  
k\|G%0Jw  
整形变量必须要有类型相同的值进行比较 ,eOOV@3C  
>i~W$; t  
浮点变量最好少比点,就算要比也要有值进行限制 `,H\j?  
5%(J+d  
指针变量要和NULL进行比较,不要和布尔型和整形比较 NuI9"I/  
uS bOGhP  
H,txbJ  
五、const和#define的比较 w/KHS#~  
1g9Q vz3  
const有数据类型,#define没有数据类型 W%b<(T;  
%1SA!1>j  
个别编译器中const可以进行调试,#define不可以进行调试 aq~hl7MTj  
8#'<SB  
在类中定义常量有两种方式 hXM8`iFW5  
-h^FSW($-R  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; Tn2Z{.q$  
@gENv~m<OI  
2、 用枚举代替const常量。 q7mqzMDk  
& S_gNa  
ZH/^``[.  
六、C++函数中值的传递方式 {"!V&}  
+l@H[r;$  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) B)/X:[  
kW\=Z 1\#  
void fun(char c) //pass by value ?XL[[vyr  
Ya*lq! u  
void fun(char *str) //pass by pointer G& cm5  
G U~?S'{  
void fun(char &str) //pass by reference @!fy24R]D  
0#F3@/1h  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 *D #H-]9  
A?|KA<&m#u  
函数的类型不能省略,就算没有也要加个void \+fP&  
^ $Q',  
<F+S}!q  
七、函数体中的指针或引用常量不能被返回 mfFC@~|g  
#9}KC 9f  
Char *func(void) mu)?SGpyE  
" jn@S-  
{ 7oA$aJQ  
"UKX~}8T  
char str[]=”Hello Word”; n|lXBCY7K  
h'^7xDw  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 2/=CrK  
)`F? {Sg  
return str; #Bj{ 4OeV  
LdR}v%EH  
} Smo^/K`f9  
[%;LZZgl  
函数体内的指针变量并不会随着函数的消亡而自动释放 ?VEJk,/k  
iI+kZI-  
$5yS`Iq S  
八、一个内存拷贝函数的实现体 dG.s8r*?M  
b')CGqbbmT  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) H)t YxW  
<%hSBDG!x  
{ bBAZr`<&U  
!FipKX  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); U4%d #  
GBu&2}  
byte *pbTo=(byte*)pvTo; //防止地址被改变  LD: w wH  
S0/@y'q3en  
byte *pbFrom=(byte*)pvFrom; ]kbmbO?M  
 rmUT l  
while (size-- >0) Hq$AF  
 ;4 R1  
pbTo++ = pbForm++; X3(:)zUL  
`j0T[Pi  
return pvTo; 1lfkb1BM  
k6ER GQ9|I  
} Z/sB72K1  
P[n` X  
hEsCOcEG  
九、内存的分配方式 YZ:YYcr  
C/"fS#<  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 w4:S>6X  
]p(+m_F  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 epCU(d*b  
x?KgEcnw2X  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 {2R b^K  
%*e6@Hm  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 JTNQz  
E{^*^+c"h  
B @HW@j  
十、内存分配的注意事项 }DxXt  
*rSMD_>  
用new或malloc分配内存时,必须要对此指针赋初值。 :g2?)Er-  
Wd_bDZQ  
用delete 或free释放内存后,必须要将指针指向NULL OZ&J'Y  
-LzHCO/7(  
不能修改指向常量的指针数据 rK)So#'  
M A}=  
PH9MB  
十一、内容复制与比较 qCSJ=T;  
#R"9(Q&  
//数组…… {\ P$5O{%  
?}m/Q"!1  
char a[]=”Hello Word!”; WfBA5  
apa~Is1  
char b[10]; 7S7gU\qOj  
/S$p_7N  
strcpy(b,a); :HYqm*v;W  
bWt>tEnf  
if (strcmp(a,b)==0) vI{JBWE,S  
W tnZF]1:u  
{} .UakO,"z  
1s-k=3)  
//指针…… x6* {@J&5*  
kCL)F\v"iT  
char a[]=”Hello Word!”; T_\HU*\  
N)lzX X  
char *p; $@FD01h.t3  
m/| >4~  
p=new char[strlen(a)+1]; (Z=ziopDE  
M]!R}<]{  
strcpy(p,a); as)2ny!u  
{0q;:7Bt  
if (strcmp(p,a)==0)  8;4vr@EV  
Pqo _ +fL+  
{} Op,Ce4A  
vpFN{UfD  
j,80EhZ  
十二、sizeof的问题 hc5M)0d  
&}nU#)IX  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 \OHsCG27  
}.3F|H  
char a[]=”Hello World!” _J}ce  
AT<gV/1l  
char *p=a; @%IZKYf c~  
p \; * :  
count<<sizeof(a)<<end; //12字节 HD IB GG~  
8js5/G+  
count<<sizeof(p)<<endl; //4字节 [V  T&  
{lT9gJ+  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 im>Sxu@  
;tf1 #6{  
void fun(char a[1000]) gd]vrW'wj  
2*vOo^f  
{ VjtI1I  
}IC$Du#  
count<<sizeof(a)<<endl; //输出4而不是1000 r[vMiVb  
A-~#ydv  
} : &mYz(1q  
wp-5B= #:{  
)pjd*+V  
十三、关于指针 ;o,t *  
b3wE8Co  
1、 指针创建时必须被初始化 $)mq  
%.r{+m  
2、 指针在free 或delete后必须置为NULL r) T^ Td1  
<GF)5QB  
3、 指针的长度都为4字节 VQZ3&]o  
F8;M++  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 TYw0#ZXo  
g^NdN46%  
char *p=new char[100]; 5~<> h~yJ  
k~>9,=::d  
strcpy(p,”Hello World”); DifRpj I-0  
N;>>HN[bBP  
delete []p; //注意前面的[]号 fGcAkEstT!  
d@b0z$<s  
p=NULL; tE]g*]o  
,ZJI]Q=!  
5、数组指针的内容不能超过数组指针的最大容易。 COOazXtW  
VCiJ]$`M  
如: zid?yuP  
#E2`KGCzW  
char *p=new char[5]; bS3qX{5  
KunK.m  
strcpy(p,”Hello World”); //报错 目标容易不够大 "6~pTHT  
U> (5J,G  
delete []p; //注意前面的[]号 7OS\j>hb~  
uTpKT7t  
p=NULL; 79~,KFct  
I}p uN!  
Xj&{M[k<  
十四、关于malloc/free 和new /delete 7$z")JB  
V,<,;d fR  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 +e)So+.W  
rwtSn?0z"  
l 注意:malloc/free是库函数,new/delete是运算符 /&$'v:VB  
U)zd~ug?m  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 Yi{[llru  
$G"PZ7  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 .bB_f7TH.  
{DI_i +2  
l 两者都必须要成对使用 ;8 JJ#ED  
r[eZV"  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 k*-_CO-h  
D=mU!rjr1  
25l6@7q.  
十五、C++的特性 +>.plvZhu  
fNFdZ[qOd  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 ,yWTk ql  
?6p6OB  
重载和内联:即可用于全局函数,也可用于类的成员函数; eE>3=1d]w  
X@b$C~+  
Const和Virtual:只可用于类的成员函数; \_!FOUPz(  
E(4ti]'4  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 jHT4I>\  
YUF!Y9!  
覆盖是指派生类函数覆盖基类函数 R 9o:{U]  
F] +t/  
函数名相同; DGC -`z  
Eg3rbqM- 8  
参数相同; YZ7rs] A  
R# 8D}5[&  
基类函数必须有Virtual关键字; r4gkSwy  
5dMIv<#T`  
不同的范围(派生类和基类)。 C N"V w  
Vt5%A}.VQ  
隐藏是指派生类屏蔽了基类的同名函数相同 j+*VP  
@!Il!+^3  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 teUCK(;23  
Ar'}#6  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 BgA\l+  
}[!;c+ke  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 HoT5 5v!o  
8q)2 )p  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 3! dD!'  
j5R= K*y  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 x~$P.X7(~  
GLwL'C'591  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: CHdw>/5  
N Rcg~Nu  
将void Func(A a) 改为void Func(const A &a)。 6vX+- f  
6O"Vy  
而void func(int a)就没必要改成void func(const int &a); 'M_8U0k  
<eO 7b6_  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 F@ZG| &  
a,d\< mx  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 Ki^m&P   
wC{ =o`v  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; nv{ou [vQ  
L -b~#  
$B~a*zZ7  
十六、extern“C”有什么作用? CUnZ}@?d  
H5,{Z  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 z Rz#0  
8!3+Obj  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 @IB8(TZ5I  
To]WCFp6@  
j6/ 3p|E  
十七、构造函数与析构函数 {AO3o<-h  
|QAmN> 7U  
派生类的构造函数应在初始化表里调用基类的构造函数; f4/!iiS}r  
}.NR+:0  
派生类和基类的析构函数应加Virtual关键字。 ^M,t`r{  
;1NZY.pyc  
不要小看构造函数和析构函数,其实编起来还是不容易。 ppR_y  
U> e@m?  
#include <iostream.h> 3 V8SKBS  
_L_SNjA_  
class Base oMLpl3pl  
01H3@0Q6  
{ bLCrh(<  
WN>.+qM~8  
public: (Uv{%q.n6  
0w< iz;30  
virtual ~Base() { cout<< "~Base" << endl ; } tOnaD]J  
:lgIu .  
}; k/H<UW?Z]  
1ikkm7  
class Derived : public Base ;r49H<z   
d;D^<-[i  
{ q1r\ 60M  
tK g%5;v  
public: /%=#*/E7  
Bpo~x2p  
virtual ~Derived() { cout<< "~Derived" << endl ; } XwX1i!'54  
"y "C#:5  
}; hYi-F.Qtq  
Z6K9E=%)c  
void main(void) aFyNm@a  
*:BN LM  
{ 49/1#^T"Q>  
dXe763~<  
Base * pB = new Derived; // upcast ~i))Zc3,g\  
m1\>v?=K  
delete pB; XiKv2vwA  
{EW}Wd  
} }mu8fm'  
dam.D.o"  
输出结果为: U!3nn#!yE  
6XFO@c}d  
~Derived [<wy @W  
/PPk p9H{  
~Base #kLM=a/_NO  
g0g/<Tv[  
如果析构函数不为虚,那么输出结果为 lCd^|E  
#0!C3it6c  
~Base Y8\Ms^rz  
\Q^\z   
q?} G?n 4  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 SkvKzV.R;  
Cgq9~U !  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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