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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 "V~U{(Z  
RUf,)]Vvk  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 /7@@CG6b  
}^G'oR1LF  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Mp75L5  
@^Mn PM  
s .^9;%@$J  
二、头文件的作用 %xxe U  
Bp^>R`,  
加强安全检测 *Dh.'bB!  
L"zOa90ig  
通过头文件可能方便地调用库功能,而不必关心其实现方式 5<IUTso5h  
;Iw'TF   
!f)'+_d  
三、* , &修饰符的位置 }n=Tw92g  
.)|jBC8|}  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 Y8.0R-:ZAN  
z-[Jbjhd  
{0QD-b o  
四、if语句 M(Jf&h4b  
DBCL+QHA  
不要将布尔变量与任何值进行比较,那会很容易出错的。 9foQ0#R  
g%j z,|  
整形变量必须要有类型相同的值进行比较 s`C#=l4  
dp)lHBV  
浮点变量最好少比点,就算要比也要有值进行限制 )~d2`1zGS  
Uo^s]H#:  
指针变量要和NULL进行比较,不要和布尔型和整形比较 kKE 2~ q  
G2a fHL<  
Iay7Fkv  
五、const和#define的比较 ,-] JCcH  
:KX/`   
const有数据类型,#define没有数据类型 XIBw&mWf  
zF)_t S  
个别编译器中const可以进行调试,#define不可以进行调试 m>:%[vm  
q,u >`]}  
在类中定义常量有两种方式 Uj k``;  
Vz 5:73  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 1b6gTfU  
2:p2u1Q O  
2、 用枚举代替const常量。 =AgY8cF!sl  
lBQ|=  
rUlpo|B  
六、C++函数中值的传递方式 DX$`\PA  
D:n0d fPU  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) wO8^|Yf  
OFRzzG@  
void fun(char c) //pass by value k% In   
xR#hU;E}  
void fun(char *str) //pass by pointer 7{<F6F^P  
mqsf#'ri  
void fun(char &str) //pass by reference L@a-"(TN+  
\SLYqJ~m  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 J)jiI>  
WK;p[u?~xi  
函数的类型不能省略,就算没有也要加个void ~d{E>J77j  
!\awT  
t"0~2R6i  
七、函数体中的指针或引用常量不能被返回 B|,6m 3.  
KL5rF,DME  
Char *func(void) ~PlwPvWo  
OPKX&)SE-  
{ Iu1P}R>C  
+\:I3nKs%  
char str[]=”Hello Word”; N`iK1n4 X  
X]1ep  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 ;F5B)&/B  
,\=u(Y\I[  
return str; <5$= Ta  
<NJ7mR}  
} ppV\FQ{K  
Ce_Z &?  
函数体内的指针变量并不会随着函数的消亡而自动释放 FswFY7 8  
cz T@txF  
dk(-yv'  
八、一个内存拷贝函数的实现体 v(: VUo]H  
Zfb:>J@h6  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) (n`\b47  
#=O0-si ]P  
{ B;K{Vo:C  
|(P>'fat-p  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); e#zGLxa  
S0 yPg9v  
byte *pbTo=(byte*)pvTo; //防止地址被改变 J2 5>t^  
(nE$};c<b2  
byte *pbFrom=(byte*)pvFrom; wfZ 'T#1  
fA 3  
while (size-- >0) yS3x))  
Sl$dXB@  
pbTo++ = pbForm++; \C<rg|  
}`_2fJ6  
return pvTo; "lz!'~im  
*Lh0E/5  
} "(C }Dn#  
e<C5}#wt  
n[iil$VKh  
九、内存的分配方式 5;|9bWH  
oO UVU}H  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 rg'? ?rq  
5#d(_  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 Me`"@{r|#  
*|=&MU*+  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 r?[mn^Bo5  
tICxAp:  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 6u.b?_u  
d3{Zhn@  
R]V`t^1  
十、内存分配的注意事项 7=<PVJ*/  
K^w9@&g6  
用new或malloc分配内存时,必须要对此指针赋初值。 H@ w6.[#  
C$(t`G  
用delete 或free释放内存后,必须要将指针指向NULL }pTj8Tr  
-B4v1{An  
不能修改指向常量的指针数据 rmhCuY?f  
9 /zz@  
NF a ;  
十一、内容复制与比较 2 G"p:iPp  
QyN~Crwo  
//数组…… w{r ->Phe  
)5&m:R9  
char a[]=”Hello Word!”; vEgJmHv;  
FSBCk  
char b[10]; J-QQ!qa0  
7"[lWC!As5  
strcpy(b,a); m9q%l_  
6?a(@<k_  
if (strcmp(a,b)==0) (Dn-vY'  
.(hb8 rCM  
{} -e)bq: T  
nRo`O  
//指针…… (la   
txgGL'  
char a[]=”Hello Word!”; DRzpV6s  
 JA)gM  
char *p; [n}c}%  
i ;tA<-$-  
p=new char[strlen(a)+1]; 3jn@ [ m  
%-*vlNC)  
strcpy(p,a); P! 3$RO  
5m bs0GL  
if (strcmp(p,a)==0) JZv]tJWq  
Q O?ha'Sl  
{} + zrwz\  
$yc,D=*Isi  
2+P3Sii  
十二、sizeof的问题 Mb9q<4  
'^J/aV  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 o|}%pc3  
H@3+K$|v  
char a[]=”Hello World!” m3XH3FgKz  
(Q4_3<G+  
char *p=a; y-@!, @e  
0F3>kp4u  
count<<sizeof(a)<<end; //12字节 HcVPJuD  
QbNv+Eu5  
count<<sizeof(p)<<endl; //4字节 jQr~@15J#  
$XI<s$P%(%  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 U-? ^B*<  
I/> IB   
void fun(char a[1000]) $Us@fJr  
n=SZ8Rj7  
{ ,G:4H%?  
zo5.}mr+  
count<<sizeof(a)<<endl; //输出4而不是1000 F*w|/-e  
.J@[v  
} YH[_0!JY^  
EGDE4n5>I  
5]Ra?rF  
十三、关于指针 `MwQ6%lf  
$oQsh|sTI  
1、 指针创建时必须被初始化 R] [M_ r  
hHg g H4T  
2、 指针在free 或delete后必须置为NULL Gu}x+hG  
pd;-z  
3、 指针的长度都为4字节 6nfkZvn  
a "DV`jn  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 Q)@1:(V/  
O1ha'@qID  
char *p=new char[100]; ^hHeH:@  
{UmCn>c  
strcpy(p,”Hello World”); (p?3#|^  
z\h+6FCD  
delete []p; //注意前面的[]号 oto od  
7 b. -&,  
p=NULL; ?xo,)``  
i]-gO  
5、数组指针的内容不能超过数组指针的最大容易。 _]S6>  
+{%4&T<nHw  
如: 5 muW*7  
Gh|!FRK[$  
char *p=new char[5]; z-gwNE{  
&0eB@8{N  
strcpy(p,”Hello World”); //报错 目标容易不够大  ke#;1  
w.Vynb  
delete []p; //注意前面的[]号 L@_">' pR  
Wi5|9  
p=NULL; j>Z]J'P  
PM.SEzhm  
p<zXuocQ  
十四、关于malloc/free 和new /delete ?iLd5 Z  
^0|NmMJ]  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 7 h1"8#X  
uBTT {GGQ  
l 注意:malloc/free是库函数,new/delete是运算符 U>+~.|'V9  
N39nJqo>"  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 QP[a^5;Tt  
u,akEvH~a  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 U&n>fXTHn  
W^ :/0WR  
l 两者都必须要成对使用 z^/GTY  
05KoxFO?  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 T"H )g  
"k<:a2R  
$vLV< y07  
十五、C++的特性 ,/:a77  
bQy%$7UmX,  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 P082.:q"  
2E2}|: ||&  
重载和内联:即可用于全局函数,也可用于类的成员函数; rH9}nL  
<s >/< kW:  
Const和Virtual:只可用于类的成员函数; [/Z'OV"tU  
`,Nn4  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 LZ)m](+M  
oe |e+  
覆盖是指派生类函数覆盖基类函数 iHn!KV  
i"]8Zw_D  
函数名相同; K~8tN ,~&  
?a>7=)%AH  
参数相同; gc@#O#K~h^  
&7w>K6p  
基类函数必须有Virtual关键字; "x;k'{S  
,GJ>vT)  
不同的范围(派生类和基类)。 & fSc{/  
E)O|16f|>  
隐藏是指派生类屏蔽了基类的同名函数相同 tt ]V$V  
0['"m^l0S  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 U('<iw,Yy  
eAsX?iaH  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 R-Q1YHUQM  
)SX6)__  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 6rQpK&Jx  
v$m[#&O^V?  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 &@HNz6KO  
ix9HSa{d  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 <i'u96  
mp,e9Nd;  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: N+M&d3H`  
n<:d%&^n  
将void Func(A a) 改为void Func(const A &a)。 ;(Xe@OtW  
"'!%};  
而void func(int a)就没必要改成void func(const int &a); >I& jurU#  
e$EF% cKH  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 @y(Wy}  
Nr24[e G>d  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 sk ?'^6Xh  
pTALhj#,  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; `GQiB]Z  
,![Du::1  
Ok>(>K<r  
十六、extern“C”有什么作用? P$3=i`X!nw  
VL7S7pb_  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 w2d]96*kQe  
XU_,Z/Yw_  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 <.WM-Z  
%i&/$0.8  
^+as\  
十七、构造函数与析构函数 eky(;%Sz  
r)p2'+}pV  
派生类的构造函数应在初始化表里调用基类的构造函数; .ts0LDk0f  
R6Zj=l[  
派生类和基类的析构函数应加Virtual关键字。 8b(1ut{  
A!{.|x[S44  
不要小看构造函数和析构函数,其实编起来还是不容易。 'q92E(  
Q+d.%qhc  
#include <iostream.h> [2'm`tZL  
Aw4?y[{H  
class Base gr>o E#7  
,|.8nk"  
{ xIQ/$[&v  
WBr:|F+~s  
public: 4Oy.,MDQP  
ojx'g8yO  
virtual ~Base() { cout<< "~Base" << endl ; } aZj J]~bO  
}r}RRd  
}; *`ZB+ \*  
m-ph}  
class Derived : public Base 0\'Q&oTo  
3e%l8@R@  
{ {?*<B=c  
X 45x~8f  
public: N^\2 _T  
u  m: 0y,  
virtual ~Derived() { cout<< "~Derived" << endl ; } $_RWd#Q(  
G#e9$!  
}; (!*Xhz,(-  
tL~,ZCQz  
void main(void) E-)VPZ1D  
]$~Fzs  
{ Dxt),4 %P  
R CBf;$O  
Base * pB = new Derived; // upcast : 8^M5}  
O3kg  
delete pB; ~h)@e\Kc  
6?V<BgCC  
} ]C16y. ~e  
;&Bna#~B  
输出结果为: U*3A M_w  
R:'Ou:Mh  
~Derived )MWUS;O<  
xF( bS+(o  
~Base [1{SY=)  
qoC]#M$oo#  
如果析构函数不为虚,那么输出结果为 Xhcn]  
4$ Dt8!p0  
~Base R_1)mPQ^P  
H2qf'  
iHAU|`'N)  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 b7B+eN ?z  
:}y9$p  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
如果您在写长篇帖子又不马上发表,建议存为草稿
认证码:
验证问题:
10+5=?,请输入中文答案:十五