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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 YblRwic  
Ol? 2Qy.2)  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 GYYro&aq{  
'.=Z2O3p  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 g=pDC+  
/Yh8r1^2tZ  
x\jHk}Buj  
二、头文件的作用 [V2l&ZUni  
H)S3/%.|  
加强安全检测 gDsZbmR  
^Z*_@A_v  
通过头文件可能方便地调用库功能,而不必关心其实现方式 rnr7t \a~]  
[D t`@Dm  
R8 m/N t2  
三、* , &修饰符的位置 7-5q\[ZK  
qb_V ,b9  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 d>%_<pw  
vl#/8]0!  
)L{\k$r!EM  
四、if语句 C?O{l%0  
E8xXr>j>#  
不要将布尔变量与任何值进行比较,那会很容易出错的。 U0rz 4fxc  
&^<94l  
整形变量必须要有类型相同的值进行比较 I$Z"o9"  
+|.#<]GA  
浮点变量最好少比点,就算要比也要有值进行限制 {b?)|@)is  
/EC m  
指针变量要和NULL进行比较,不要和布尔型和整形比较 _ReQQti[  
"K8qmggTq  
!-QKh aY  
五、const和#define的比较 Rwr0$_A  
,y0kzwPR1  
const有数据类型,#define没有数据类型 ;#;X@BhS  
gQ?k}D  
个别编译器中const可以进行调试,#define不可以进行调试 +o/q@&v;Ax  
$d"6y  
在类中定义常量有两种方式 Ev()2 80  
%$cwbh-{{  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 5 `+*({  
9J?j2!D  
2、 用枚举代替const常量。 %=]{~5f>  
L^=>)\R2$[  
u7/M>YJ`T  
六、C++函数中值的传递方式 {[$p}#7Y  
EgY]U1{  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) J ^v_VZ3  
?832#a?FZ;  
void fun(char c) //pass by value pS%Az)3RZ  
$exu}%  
void fun(char *str) //pass by pointer .VUZ4e  
#C+0m`  
void fun(char &str) //pass by reference Rl,B !SF  
$]Q_x?  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 'g^]ZTxb  
T|E;U  
函数的类型不能省略,就算没有也要加个void EGs z{c[8@  
}{lOsZA  
I@hC$o  
七、函数体中的指针或引用常量不能被返回 :g,rl\S7  
toQn]MT  
Char *func(void) o6qQ zk  
ss[8d%V  
{ %PG0PH4?  
9A6ly9DIS  
char str[]=”Hello Word”; G q 8/xxt  
nK:39D$(  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 2Two|E  
%(NRH?  
return str; 6@T_1  
Y`M.hYBXk  
} ^iGIF~J9  
GxvVh71zP  
函数体内的指针变量并不会随着函数的消亡而自动释放 @}FRiPo6  
S`J_}>  
BFMM6-Ve  
八、一个内存拷贝函数的实现体  V C.r  
E J 9A 4B  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) %o?fE4o'  
Oe5aNo  
{ p@!"x({@l  
/O8'8sL5  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); ue`F|  
>LW9$[H  
byte *pbTo=(byte*)pvTo; //防止地址被改变 ~[[a7$_4  
.$q]<MK8  
byte *pbFrom=(byte*)pvFrom; `dj/Uk  
_ p?q/-[4  
while (size-- >0) M5<5 (l  
rp _G.C  
pbTo++ = pbForm++; X=DJOepH'  
*fjarZu  
return pvTo; xd>2TW l#  
's e 9|:  
} J +9D/VT  
HHX9QebiST  
A\=:h  AQ  
九、内存的分配方式 "['YMhu_  
1s*I   
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 ftK.jj1:  
}$b/g  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 /WM : Bj   
>CYg\vas!  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 i4->XvC  
au GN~"n^  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 (OJ}|*\e  
@]OI(B  
-8EdTc@  
十、内存分配的注意事项 4ba1c  
D,X$66T ^  
用new或malloc分配内存时,必须要对此指针赋初值。 x{+rx.  
1pc|]9B  
用delete 或free释放内存后,必须要将指针指向NULL Z3S\@_/;  
6z/8n f +u  
不能修改指向常量的指针数据 (US8Sc  
1Og9VG1^  
6R?J.&|  
十一、内容复制与比较 zis-}K<   
K<V(h#(.@  
//数组…… F2XXvxG  
iA%3cpIc(Z  
char a[]=”Hello Word!”; -,Q<*)q{  
YpuA,r;"  
char b[10]; 1pcSfN:"1  
Muarryh}  
strcpy(b,a); $i =-A  
&jj\-;=~Ho  
if (strcmp(a,b)==0) S;CT:kG6Y{  
)`g[k" yB3  
{} &*0!${ B  
of(Nq@  
//指针…… [TNYPA> {  
[t ^|l?  
char a[]=”Hello Word!”; /0(4wZe~?  
XbHcd8N T  
char *p; Bw{W-&$o  
E6n;_{Se/S  
p=new char[strlen(a)+1]; <@Ew-JU  
?lbX.+  
strcpy(p,a); Gk!v-h9cq  
*aTM3k)Zs  
if (strcmp(p,a)==0) ~>{<r{H"S  
{VI%]n{M  
{} ]H.+=V;1  
y_J{+  
TN l$P~X>  
十二、sizeof的问题 GifD>c |z  
]bRu8kn  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 LxMOs Nv  
vnIxI a  
char a[]=”Hello World!” J :,  
DrW]`%Ql  
char *p=a; FxD"z3D  
z.{y VQE  
count<<sizeof(a)<<end; //12字节 b5yb~;0  
CMTy(Z8_)  
count<<sizeof(p)<<endl; //4字节 !lHsJ)t  
OxqP:kM  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 uV;Z  
dLjT^ 9  
void fun(char a[1000]) "ebn0<cZ  
F.AO  
{ B[y1RI|9  
'"I"D9;9  
count<<sizeof(a)<<endl; //输出4而不是1000 ,kLeK{   
` 3<#DZ;!  
} &M<431y  
A~h8 >zz*  
`7'(U)x,F  
十三、关于指针 ZtIK"o-|!  
L@v0C)  
1、 指针创建时必须被初始化 {x-g?HB  
k 9s3@S  
2、 指针在free 或delete后必须置为NULL Xst&QKU  
NbgP,-  
3、 指针的长度都为4字节 i3f/{D/  
6g$+))g  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 yQ&;#`!'  
t6~|T_]  
char *p=new char[100]; s'/ug  
64zO%F*  
strcpy(p,”Hello World”); &(wik#S  
Av/|={i  
delete []p; //注意前面的[]号 d'DS7F(c{  
I |BLAm6j  
p=NULL; Ph-3,cC  
,/Xxj\i  
5、数组指针的内容不能超过数组指针的最大容易。  E?%k  
SR8[ 7MU  
如: Ndx='j0  
t-/%|@?D  
char *p=new char[5]; RCoz;|c`P  
F[~qgS*;  
strcpy(p,”Hello World”); //报错 目标容易不够大 =L&_6lb  
[;};qQ-C2  
delete []p; //注意前面的[]号 S,J'Z:spf  
M~3(4,  
p=NULL; u*H2kn[DU  
`t#C0  
t+66kBN  
十四、关于malloc/free 和new /delete J&h 3,  
egKYlfe"  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 7rsrC  
][TS|\\  
l 注意:malloc/free是库函数,new/delete是运算符 {>5c,L$  
|[xi"E\  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 MJ>(HJY6?%  
8f#YUK sW=  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 EMJ}tvL0Tp  
nEs l  
l 两者都必须要成对使用 Vd|/]Zj  
\QYs(nm?k  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 yKq;EcVx  
$^`hu%s,~  
$YL} rM  
十五、C++的特性 Jb_/c``  
>Utn[']~  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 D|UDLaz~  
T*'5-WV|3t  
重载和内联:即可用于全局函数,也可用于类的成员函数; =g?r.;OO  
;Q-sie(#  
Const和Virtual:只可用于类的成员函数; d6~wJMFl  
hZ$* sf  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 l *pCG`@J#  
v]vrD2L  
覆盖是指派生类函数覆盖基类函数 .\< \J|3  
`/Z8mFs Y  
函数名相同; {T.$xiR  
w[loV  
参数相同; JQI`9$asuC  
ijC;"j/(  
基类函数必须有Virtual关键字; OB5{EILej  
 M3u[E  
不同的范围(派生类和基类)。 CYG'WFvZZ  
I%p Q2T$;  
隐藏是指派生类屏蔽了基类的同名函数相同 @bS>XWI>  
~H?RHYP~  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 =OhhMAn  
Bg;bBA!L  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 b>;5#OQfn  
QZ h|6&yI  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 Z<xSU?J  
Bxz{rR0XV  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 -08Ys c  
bm(0raugs  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 b abDLaC@  
)HR'FlxOd  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: t+p-,ey^@  
0d.lF:  
将void Func(A a) 改为void Func(const A &a)。 Cl i k  
'[:].?M  
而void func(int a)就没必要改成void func(const int &a); {.eC"  
nhQ.U>&-M  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 9?l( }S`  
w QwY_ _  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 N4'b]:`n  
vy6NH5Q  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; >0B [  
5v!Uec'+  
Km pX^Se[  
十六、extern“C”有什么作用? NS<lmWx+  
V/J[~mN9  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 \fh.D/@  
]TqcV8Q~  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 h.=YAcR0D  
9sJbz=o]r  
2{#*z%|z  
十七、构造函数与析构函数 m6aoh^I  
-mcLT@  
派生类的构造函数应在初始化表里调用基类的构造函数; C[<&% =  
:cIE8<\%  
派生类和基类的析构函数应加Virtual关键字。 v" y e\ZG  
tWL9>7]G  
不要小看构造函数和析构函数,其实编起来还是不容易。 U#@:"v|  
!|,=rM9x  
#include <iostream.h> +=U`  
%[;<'s5e~  
class Base < _c84,[V  
6'|J ;  
{ [,xFk* #  
B<LQ;n+  
public: .|x0du|  
b< Pjmb+  
virtual ~Base() { cout<< "~Base" << endl ; } sRt|G  
P4Wd=Xoz6  
}; (47jop0RDQ  
jAN(r>zVL  
class Derived : public Base Ff%m.A8d,4  
l.fNkLC#  
{ l<GRM1^kU  
I\`:(V  
public: B3)#Ou2  
GsE?<3  
virtual ~Derived() { cout<< "~Derived" << endl ; } |LiFX5!\  
?jz{fU  
}; |oPqX %?  
7q$9\RR5  
void main(void) Ay"x<JB{U2  
(Q#ArMMORI  
{ vWjK[5 M%  
OlMCF.W#3  
Base * pB = new Derived; // upcast AY,6Ddw  
~F uD6f  
delete pB; N~Ax78TX  
4$SW~BpQ  
} JnV$)EYi  
- stSl*  
输出结果为: ur9-F^$  
lr,hF1r&Y  
~Derived {%b>/r  
umI#P,%[  
~Base u\s mQhQGE  
[sACPn$f  
如果析构函数不为虚,那么输出结果为 {l\v J#r:  
kd!f/'E!  
~Base i|.!*/qF  
S#2 'Jw  
B>YrDJUN  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 9Ni$nZN  
Ho\K %#u  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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