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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 W{@,DQ  
.<fn+]  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 %2q0lFdcM  
5u5-:#sLy  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 =\ek;d0Tqb  
ScCp88KpFI  
}F B]LLi  
二、头文件的作用 VoG_'P  
OTy{:ID  
加强安全检测 )I{~Pcq  
R(t1Ei.-?  
通过头文件可能方便地调用库功能,而不必关心其实现方式 $c1zMkY)u  
\86:f<)P  
2h;#BJ))  
三、* , &修饰符的位置 a62'\wF>D  
#TUuk  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 kq$0~lNI$  
g6D7Y<}d  
l b9O  
四、if语句 > r %:!o  
._X|Ye9/  
不要将布尔变量与任何值进行比较,那会很容易出错的。 :q>uj5%  
y$,j'B:;4m  
整形变量必须要有类型相同的值进行比较 =".sCV9"N  
Dug{)h_2  
浮点变量最好少比点,就算要比也要有值进行限制 AqZ()p*z  
)x<oRHx]  
指针变量要和NULL进行比较,不要和布尔型和整形比较 hy}n&h  
n/ CP2A  
SHA6;y+U/~  
五、const和#define的比较 6uu49x_^L4  
p=T6Ix'_2e  
const有数据类型,#define没有数据类型 BD_"w]bqD  
-)pVgf  
个别编译器中const可以进行调试,#define不可以进行调试 8ioxb`U  
Hw\hTTK  
在类中定义常量有两种方式 (>,}C/-UG  
D:56>%y@  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; M>rertUR  
Q2LAXTF]y  
2、 用枚举代替const常量。 xXQW|#X\  
gw^X-  
_8{6&AmIw  
六、C++函数中值的传递方式 DQy;W  ov  
&0Bs?oq_  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) CubBD+h l*  
]vQU(@+I  
void fun(char c) //pass by value JTS<n4<a  
(GJX[$@  
void fun(char *str) //pass by pointer 6DxT(VU}  
cs-dvpMZ  
void fun(char &str) //pass by reference [ApAd  
@wTRoMHPQ  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 5uAUi=XA>S  
^@-qnU lH  
函数的类型不能省略,就算没有也要加个void Y- tK  
aUyJi  
#W2#'J:l  
七、函数体中的指针或引用常量不能被返回 # n\|Q\W  
)uK Tf=;  
Char *func(void) VD0U]~CWR  
,9"A"p*R  
{ sOBuJx${m  
 q +*>T=k  
char str[]=”Hello Word”; 0 >:RFCo  
ApotRr$)  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 (jtkY_  
dMDSyd<(  
return str; @sG5Do  
}Zp5d7(@w  
} zz[[9Am!  
9oA-Swc[  
函数体内的指针变量并不会随着函数的消亡而自动释放 mKZ^FgG  
"SFs\] Z  
<,+6:NmT  
八、一个内存拷贝函数的实现体 _>/OqYR_jQ  
?y4vHr"c  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) |W;EPQ+<  
c]3^2Ag,  
{ r Cn"{.rI  
Y6ORI  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); M^?=!!US^  
8 huB<^  
byte *pbTo=(byte*)pvTo; //防止地址被改变 VK/i5yT5N  
Y^ ti;:  
byte *pbFrom=(byte*)pvFrom; -FW'i10\2+  
.{Df"e>  
while (size-- >0) >vk?wY^f  
:qxd s>Xm  
pbTo++ = pbForm++; 'k!V!wcD^y  
7p+uHm  
return pvTo; 5imqZw  
ghVxcK  
} aj6{  
od`:w[2\  
z! DD'8r>  
九、内存的分配方式  j.vBld  
w*qmC<D$A  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 I.L8A|nZ  
//H3{^{  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ba"a!#wA  
xOXCCf/  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 Fwfe5`9'  
r/B iR0$E  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 >a5avSn  
K0\Wty0  
3I.0uLjg^  
十、内存分配的注意事项 d +Bz pS@p  
cwKOE?!  
用new或malloc分配内存时,必须要对此指针赋初值。 -nKBSls  
J6*B=PX=(  
用delete 或free释放内存后,必须要将指针指向NULL T7!=KE_z  
n+;PfQ|  
不能修改指向常量的指针数据 8- ]7>2?_  
(??|\ &DTi  
sow/JLlbC  
十一、内容复制与比较 "K$ y(}C  
\`:LPe  
//数组…… ICI8xP}a?  
y1zep\-D  
char a[]=”Hello Word!”; Ea2&7  
dL!K''24{  
char b[10]; *3We5  
wfc[B;K\  
strcpy(b,a); n\D3EP<s  
D:Y `{{  
if (strcmp(a,b)==0) l5d> YTK+5  
OJ\rT.{  
{} TAn.5 wH9t  
)#n>))   
//指针…… ?G>#'T[  
4uUR2J  
char a[]=”Hello Word!”; )B' U_*  
# pz{,  
char *p; m K@a7fF?  
v__;oqN0  
p=new char[strlen(a)+1]; -?AaRwZ,  
*cn#W]AE  
strcpy(p,a); v^_<K4N`  
5cE!'3Y  
if (strcmp(p,a)==0) _*w}"\4_  
4D\+_Ic3  
{} ,Uv8[ci%9  
f{[,!VG  
e`Z3{H}  
十二、sizeof的问题 YJ{d\j  
wOp# mT  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 .DkDMg1US  
L5*,l`lET  
char a[]=”Hello World!” "yCek  
TAt9+\'  
char *p=a; ,`JXBI~  
^D0BGC&&  
count<<sizeof(a)<<end; //12字节 "@[xo7T  
;ckv$S[p  
count<<sizeof(p)<<endl; //4字节 WPM<Qv L  
XU#nqvS`.  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 ^(0tNX/XD  
w5(GRAH  
void fun(char a[1000]) Z0e+CEzq  
HG%H@uK  
{ /fM6%V=Y  
jdYv*/^  
count<<sizeof(a)<<endl; //输出4而不是1000 {M?!nS6t  
db!2nImNu\  
} T7.u7@V2  
`|^<y.-6  
E4'D4@\W  
十三、关于指针 r4xq%hy  
B&m?3w  
1、 指针创建时必须被初始化 ]&ptld;  
N2_=^s7  
2、 指针在free 或delete后必须置为NULL VM3H&$d(h  
NOa.K)^k  
3、 指针的长度都为4字节 oLn| UWe_  
| We @p  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 'g a1SbA]  
IfZaK([  
char *p=new char[100]; +Hb6j02#  
G\H@lFh  
strcpy(p,”Hello World”); @$79$:q N  
(t9qwSS8z  
delete []p; //注意前面的[]号 Tj{!Fx^H  
7,e=|%7.  
p=NULL; >~$ S!  
[<sBnHbvQ.  
5、数组指针的内容不能超过数组指针的最大容易。 ++13m*fA  
#U&G$E`7  
如: uu>[WFh  
'eo2a&S2D  
char *p=new char[5]; <v('HLA  
r`cCHZo/V  
strcpy(p,”Hello World”); //报错 目标容易不够大 =fHt|}.K  
cuR|cUK  
delete []p; //注意前面的[]号 &T}v1c7)  
Te> 7I  
p=NULL; yg2~qa:dZ  
y( MF_'l  
CFZ= !s)B  
十四、关于malloc/free 和new /delete zF]hf P0Q  
@/JGC%!  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 DoPm{055J  
A}\Rms 2  
l 注意:malloc/free是库函数,new/delete是运算符 !@/?pXt|  
va;d[D,  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 (U`7[F  
Ok6Y&#'P  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 [-$&pB>w8'  
}M|  
l 两者都必须要成对使用 ;lAz@jr+  
oqDW}>.  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 %e%nsj6  
JZL!(>tI  
@;<w"j`r  
十五、C++的特性 ]jHB'Y  
317Buk  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 1}8e@`G0.]  
NE9e br K  
重载和内联:即可用于全局函数,也可用于类的成员函数; I/WnF"yP  
Ir\3c9  
Const和Virtual:只可用于类的成员函数; ^s5.jlZr@  
p]+W1v}V!  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 Y+?bo9CES!  
x\Sp~]o3C  
覆盖是指派生类函数覆盖基类函数 iMp)g%Ng  
2 yP#:T/z  
函数名相同; Y\p yl  
Lp ]d4"L;3  
参数相同; x2ol   
RV(}\JU  
基类函数必须有Virtual关键字; J*U(f{Q(  
 74Q?%X  
不同的范围(派生类和基类)。 ]K9 x<@!  
j9u-C/Q\r  
隐藏是指派生类屏蔽了基类的同名函数相同 ;v0sM*x%V  
LOida#R  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 "W+4`A(/l  
.X2mEnh  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 c>UITM=!I  
2CxdNj  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 ?|hzAF"U  
0KDDAkR5R  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 ,Fr{i1Ky  
-~(0:@o ;  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 &6\rKOsn  
@6D<D6`  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 9i`LOl:;  
tIr66'8  
将void Func(A a) 改为void Func(const A &a)。 3mJHk<m8T  
]owH [wvX  
而void func(int a)就没必要改成void func(const int &a); A:NY:#uC  
56bB~ =c  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 WJ.PPq>]F  
F'#3wCzt  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 . t3@86xTJ  
2#!$f_  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; v l*RRoJ  
S,8zh/1y  
FD@! z :  
十六、extern“C”有什么作用? k2@IJ~  
Zh(f2urKV  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 K0E ;4r  
|;_ yAL  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 1QN]9R0`#7  
S$H4xkKs  
&1[5b8H;+  
十七、构造函数与析构函数 Xl aNR+  
%eah=e  
派生类的构造函数应在初始化表里调用基类的构造函数; lT:<ZQyjT  
rzTyHK[  
派生类和基类的析构函数应加Virtual关键字。 3?geJlD4  
7]v-2 *  
不要小看构造函数和析构函数,其实编起来还是不容易。 wM&G-~9ujk  
V+Tj[:ok  
#include <iostream.h> A!f0AEA,  
Ci*5E$+\  
class Base ~*[}O)7#  
NPc%}V&C(u  
{ iK#{#ebAoW  
T5Fah#-4  
public: w}1)am &pD  
eQLa.0  
virtual ~Base() { cout<< "~Base" << endl ; } =_1" d$S&  
ld?M,Qd  
}; 2~@=ua[|=5  
sS|zz,y  
class Derived : public Base 4Ek< 5s[  
.6"7Xxe]<  
{ an7N<-?  
f@}(<#  
public: o+t?OG/0  
zm}1~A  
virtual ~Derived() { cout<< "~Derived" << endl ; } <7&b|f$CL  
9BY b{<0tS  
}; UB1/FM4~  
W#wM PsB  
void main(void) <h}?0NA4  
5[R}MhLZ  
{ TB[vpTC9)  
NWpRzh8$u  
Base * pB = new Derived; // upcast j>T''T f  
!^7:Rr _  
delete pB; Lf-8G5G  
#SXXYh-e  
} 4|e#b(!  
Ov|j{}=L=9  
输出结果为: b?^n'0  
DEs?xl]zO  
~Derived /{U{smtdFl  
%G@aZWk Sa  
~Base @$*c0 . |z  
96.Wfx  
如果析构函数不为虚,那么输出结果为 meL'toaJdQ  
"+WR[-n>\  
~Base !eq]V9  
^ UzF nW@a  
8tL61x{]  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 xpxm9ySwu  
4 5lg&oO  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八