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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 q;../h]Ne  
7Y|>xx=v  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 %4|}&,%%r  
bC>>^?U1m  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Ya&\ly /i  
e4YfT r  
.V 3X#t  
二、头文件的作用 2}`Vc{\  
w4fJ`,  
加强安全检测 /zG-\eU  
'x,GI\;?  
通过头文件可能方便地调用库功能,而不必关心其实现方式 XJlDiBs9=Q  
qe6C|W~n  
aEFe!_QY  
三、* , &修饰符的位置 QV'3O|  
:Bv&)RK  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ;TV'PJ  
%<J(lC9,C  
`YmI'  
四、if语句 Q0q)n=i }]  
)' x/q  
不要将布尔变量与任何值进行比较,那会很容易出错的。 H&yFSz}6a  
~b$z\|Y  
整形变量必须要有类型相同的值进行比较 xL39>PB  
A.$VM#  
浮点变量最好少比点,就算要比也要有值进行限制 RZ)vU'@kx  
1f@U :<:  
指针变量要和NULL进行比较,不要和布尔型和整形比较 uWR,6\_jY  
HDSA]{:sl  
z@%/r~?|  
五、const和#define的比较 ~Miin   
{F(-s"1;xO  
const有数据类型,#define没有数据类型 Q9eYF-+  
m['v3m:  
个别编译器中const可以进行调试,#define不可以进行调试 01-\:[{  
q(&^9"  
在类中定义常量有两种方式 _]=TFz2O  
DNm7z[ t{  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; X$uz=)  
C;)Xwm>e  
2、 用枚举代替const常量。 w*6!?=jP  
gB{]yA"('  
zy5s$f1IA  
六、C++函数中值的传递方式 `hK>bHj  
P$(WdVG  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) !4 4mT'Y  
]U#[\ Z  
void fun(char c) //pass by value e}?1T7NPG]  
2{sD*8&`  
void fun(char *str) //pass by pointer 3lLW'g&=  
"u Of~e"  
void fun(char &str) //pass by reference j:v~MrQ7|  
 VNr  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 Z/NGv  
e}](6"t`5  
函数的类型不能省略,就算没有也要加个void x^M5D+o  
qL%.5OCn(  
Yhc6P%{Z^  
七、函数体中的指针或引用常量不能被返回 =qV4Sje|q  
as\<nPT{Fj  
Char *func(void) { .aK{ V  
I8<Il ^  
{ !7mvyc!'!  
>}dTO/  
char str[]=”Hello Word”; koncWyW  
<K DH  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 Nl=m'4 @`  
]= ?X*,'  
return str; P S_3Oq)  
gtaV6sD  
} Qm35{^p+  
G| QUujl  
函数体内的指针变量并不会随着函数的消亡而自动释放 #L@} .Giz  
pW*{Mx  
vi[#? ;pkF  
八、一个内存拷贝函数的实现体 1R'u v4e  
3:]{(@J  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) PZ  
)XmCy"xx  
{ AkYupP2]v  
G8 ^0 ^@o  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); ":UWowJO  
2X qTyf<  
byte *pbTo=(byte*)pvTo; //防止地址被改变 _Hz~HoNU  
? -v  
byte *pbFrom=(byte*)pvFrom; ,h%D4EVx  
'2Q.~6   
while (size-- >0) J<b3"wK0[  
RL7C YB  
pbTo++ = pbForm++; =F'l's^j  
f nLR  
return pvTo; + >T7Q`64  
8N=%X-R%  
} H$NP1^5!  
Gt^|+[gD  
]Y_{P~ZX  
九、内存的分配方式 \GijNn9ah  
-:)DX++  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 J- t=1  
eVqM=%Q  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 JDC=J(B  
nwa\Lrh  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 ;yk9(wea}"  
@wd!&%yzO  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 :3111}>c  
-kG3k> by_  
(w5u*hx  
十、内存分配的注意事项 |Hx%f  
=8$|_  
用new或malloc分配内存时,必须要对此指针赋初值。 m.1LxM$8  
5xh!f%6  
用delete 或free释放内存后,必须要将指针指向NULL @Ufa -h5"(  
RpHpMtvNo/  
不能修改指向常量的指针数据 <MPeh&_3#  
f|- m ^/y  
/HB+ami,  
十一、内容复制与比较 (\Rwf}gyR  
R(M}0JRm  
//数组…… IV)^;i  
pY^pTWs(  
char a[]=”Hello Word!”; e%PC e9  
mDb-=[W5  
char b[10]; Jz~+J*r;]A  
[GtcaX{Zz  
strcpy(b,a); +\+Uz!YS  
th5,HO~  
if (strcmp(a,b)==0) <'r0r/0g?  
Iv'RLM  
{} NY4!TOp  
j`>?"1e@x  
//指针…… lr9=OlH  
?wGiog<Q{  
char a[]=”Hello Word!”; JaH* rDs-  
l_^T&xq8  
char *p; Oamv9RyDvC  
Kg4QT/0VA  
p=new char[strlen(a)+1]; zt7_r`#z  
hNH.G(l0  
strcpy(p,a); *,E;  
kxwNbxC  
if (strcmp(p,a)==0) "nVK< Vd  
K5P Gi#  
{} p@#]mVJ>9  
!nec 7  
Z1VC5* K  
十二、sizeof的问题 " <<A  
7sj<|g<h(_  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 U5|B9%:&  
G1kDM.L  
char a[]=”Hello World!” l<u{6o  
}16&1@8  
char *p=a; &J\B\`  
\eEds:Hg  
count<<sizeof(a)<<end; //12字节 WLE%d]'%M  
r %+Bc Y  
count<<sizeof(p)<<endl; //4字节 uQ{=o]sy  
0('OyH)  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 aL88E  
\s,Iz[0Vfz  
void fun(char a[1000]) 7@FDBjq  
Kp8fh-4_  
{ )\8URc|J  
cN62M=**  
count<<sizeof(a)<<endl; //输出4而不是1000 ^gd<lo g  
Po1hq2-U8  
} wHA/b.jH  
<#zwKTmK1  
XFtOmY  
十三、关于指针 OWqrD@  
-UJ?L  
1、 指针创建时必须被初始化 3voW  
aD+0\I[x  
2、 指针在free 或delete后必须置为NULL z9^c]U U)E  
Cy`26[E$S  
3、 指针的长度都为4字节 F|,6N/;!W  
v}Z9+ yRC2  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 _Q> "\_,  
}6<)yW}U  
char *p=new char[100]; h5x*NM1Ih  
{W-5:~?"  
strcpy(p,”Hello World”); Dh2#$[/@1  
!IN @i:m  
delete []p; //注意前面的[]号 Dzo{PstM%  
w %;hl#s  
p=NULL; yDzdE;  
S)+CTVVE  
5、数组指针的内容不能超过数组指针的最大容易。 tL1P<1j_  
vuXS/ d  
如: HF]EU!OT  
Bw6L;Vu  
char *p=new char[5]; {wcO[bN  
,`y yR:F  
strcpy(p,”Hello World”); //报错 目标容易不够大 4b]_ #7Qm  
Yhe+u\vGs\  
delete []p; //注意前面的[]号 "2%>M  
6eM6[  
p=NULL; k'g$2  
p<q].^M  
AfN&n= d K  
十四、关于malloc/free 和new /delete ,6DD=w0r  
}~rcrm.   
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 /oFc 03d  
vmvFBzLR  
l 注意:malloc/free是库函数,new/delete是运算符 ZBF1rx?  
$Y6 3!*  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 V`by*s  
#XcU{5Qm5  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 -/zp&*0gcx  
-]/7hN*v  
l 两者都必须要成对使用 w(Gz({l+  
@^'$r&M  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 wDMjk2 YN  
Ssw&'B|o  
#\LZ;&T'N  
十五、C++的特性 Nl { 7  
V'j@K!)~xR  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 9_GokU P_  
yQ'eu;+]  
重载和内联:即可用于全局函数,也可用于类的成员函数; ;@9e\!%  
N};t<Xev  
Const和Virtual:只可用于类的成员函数; qJ 95  
BMpF02Y|4  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 .A(i=!{q  
|:N>8%@6c  
覆盖是指派生类函数覆盖基类函数 ocwE_dR{  
9s(i`RTM  
函数名相同; [A]Ca$':  
JD ]OIh  
参数相同; 1Fs-0)s8  
i|S: s  
基类函数必须有Virtual关键字; p0Gk j-  
+RS$5NLH  
不同的范围(派生类和基类)。 5KJ%]B(H2  
e=7W 7^"_  
隐藏是指派生类屏蔽了基类的同名函数相同 VRF6g|0;  
t7bqk!6hM\  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 SRItE\"Xe  
ei|cD[ NY  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 \DS^i`o)rY  
MxTmWsaW  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 ]-:1se  
doM?8C#`  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 \Tyf*:_F>  
g8l5.Mpx  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 @o&Ytd;i  
?Wa<AFXQ  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: [Tp%"f1  
m6i%DE  
将void Func(A a) 改为void Func(const A &a)。 J(e7{aRJ9  
iDw.i"b  
而void func(int a)就没必要改成void func(const int &a); &\^rQi/tf  
U-g9C.  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 yUe+":7k.  
=Dk7RKoHF  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 @\jQoaLT$_  
_=EZ `!%  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; h>klTPM>  
I+",b4  
Ak A!:!l  
十六、extern“C”有什么作用? @1bH}QS  
CW-Ae  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 _*E!gPO  
^C7C$TZS  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 G6Nb{m  
a+Ab]m8`  
63M=,0-Qt  
十七、构造函数与析构函数 9B=1 Yr[  
ertBuU  
派生类的构造函数应在初始化表里调用基类的构造函数; 5un^yRMB-  
g<a<*)&  
派生类和基类的析构函数应加Virtual关键字。 _mk5^u/u  
1TZPef^y  
不要小看构造函数和析构函数,其实编起来还是不容易。 +s~.A_7)  
H^ BYd%-  
#include <iostream.h> xA #H0?a]  
k':s =IXW  
class Base >f$NzJ}  
vq>l>as9O  
{ b\giJ1NJB  
R=M!e<'  
public: / M@ PO"  
:YNp8!?T?  
virtual ~Base() { cout<< "~Base" << endl ; } V!&P(YO:  
{/|qjkT&W  
}; 7ZsA5%s=,  
-DCa   
class Derived : public Base 4pPI'd&/7  
e_rzA  
{ S4bBafj[I  
%4,?kh``D  
public: m|F:b}0Hb  
w z=z?AZW  
virtual ~Derived() { cout<< "~Derived" << endl ; } HnU Et/  
,@.EpbB  
}; VLdB_r3lQ  
IzUo0D*@  
void main(void) &{z<kmc$6  
P^i.La,  
{ < kP+eD  
d#>y}H9  
Base * pB = new Derived; // upcast &z@~B&O  
nIBFk?)6  
delete pB; >qh?L#Fk  
]tY:,Mfs  
} Cv^`&\[SW+  
6ep>hS4A&  
输出结果为: Fm3t'^SqF  
:(p )1=I  
~Derived r}W2Ak\  
8\Hr5FqB(  
~Base wC` R>)  
1mH\k5xu  
如果析构函数不为虚,那么输出结果为 SlaDt  
CDdkoajBa  
~Base A'-_TFwW  
c\.P/~  
,.v7FM^gO  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 7bF*AYM  
Y7SacRO  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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