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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 oNCDG|8z  
z:fhq:R(  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 d?{2A84S  
'\_)\`a|  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 fglZjT  
T8m%_U#b  
ZRQPOy  
二、头文件的作用 !CMN/=  
|y=gp  
加强安全检测 x< 3vA|o  
Rw\DJJrz  
通过头文件可能方便地调用库功能,而不必关心其实现方式 <%Rr-,  
(CV=0{]  
v*^2[pf  
三、* , &修饰符的位置 G7=8*@q>:  
hWW<]qzA,  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 =lmh^**4  
$?GO|.59  
!*ucVv;  
四、if语句 (Z5#;rgem  
He*L"VpWv  
不要将布尔变量与任何值进行比较,那会很容易出错的。 7>mYD3  
ge?ymaU$a  
整形变量必须要有类型相同的值进行比较 ]s S oIT  
Arv8P P^'  
浮点变量最好少比点,就算要比也要有值进行限制 .R"L$V$RU.  
1e+?O7/  
指针变量要和NULL进行比较,不要和布尔型和整形比较 1lQ1 0J  
Dm^kuTIG  
E4.IS =4S  
五、const和#define的比较 u'b_zlW@  
O^$Zz<  
const有数据类型,#define没有数据类型 dEp=;b s  
qs b4@jt+  
个别编译器中const可以进行调试,#define不可以进行调试 iTvCkb48m  
.0ZvCv:>  
在类中定义常量有两种方式 $ g^;*>yr  
 M:$nL  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; }.vy|^X  
s#fmGe"8  
2、 用枚举代替const常量。 9|m  L  
X[ (J!"+  
]]ZBG<#  
六、C++函数中值的传递方式 5~F0'tb|}  
!R@4tSu  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) f*~fslY,o  
Ye6O!,R  
void fun(char c) //pass by value *~L]n4-  
t*#&y:RG  
void fun(char *str) //pass by pointer qQ'@yTVN  
$gTPW,~s[  
void fun(char &str) //pass by reference rY= #^S  
463dLEd  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 k}.nH"AQ  
B=r/(e  
函数的类型不能省略,就算没有也要加个void [ub\DLl  
Qa%SvA@R  
(jG$M=q-  
七、函数体中的指针或引用常量不能被返回 jayoARUB  
:<gk~3\  
Char *func(void) \#r_H9&s6  
`ahXn  
{ R2s>;V.:  
t_dg$KB  
char str[]=”Hello Word”; CQ[-Cp7  
9R[','x  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 J5T#}!f  
BxU1Q&  
return str; K=)R!e8  
DeSTo9A}!  
} 4C cb!?  
A'8K^,<  
函数体内的指针变量并不会随着函数的消亡而自动释放 mg(56)  
k]iS3+nD  
~=ktFuEa  
八、一个内存拷贝函数的实现体 bYc qscW  
HWBom8u0  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 5aNDW'z`f  
:bDA<B6bb  
{ S/;Y4o  
4vS!99v)  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); >6 #\1/RP  
]Dg0@Y  
byte *pbTo=(byte*)pvTo; //防止地址被改变 bn35f<+  
M(uB ;Te  
byte *pbFrom=(byte*)pvFrom; 9a%@j ]  
Z(M)2  
while (size-- >0) !X8R  
u'1=W5$rK  
pbTo++ = pbForm++; a6E"  
qS|VUy4  
return pvTo; gj^]}6-P  
NN'<-0~  
} auW]rwY  
O$/ swwB!  
l)s+"C#  
九、内存的分配方式 X~3P?O]kFv  
F4%[R)  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 Wp3l>:  
SGd.z6"H  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 m!g8@YI  
J|24I4  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 jt--w"|-r  
-RQQ|:O$  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 pH%c7X/[3L  
MA# !<b('  
sLp LY1X  
十、内存分配的注意事项 )d u{ZWr  
m4>o E|\  
用new或malloc分配内存时,必须要对此指针赋初值。 63Yu05'  
qXGLv4c`Q  
用delete 或free释放内存后,必须要将指针指向NULL nF$)F?||  
~|C1$.-  
不能修改指向常量的指针数据 ;_5 =g  
~HRWKPb  
[frD L)  
十一、内容复制与比较 R}9jgB  
KB*=a   
//数组…… EsB'nf r  
{Y%=/ba W  
char a[]=”Hello Word!”; F|`B2Gr  
Ki6.'#%7  
char b[10]; NV4W2thYo  
/,Id_TTCO  
strcpy(b,a); 'a?.X _t  
gGml c:/J%  
if (strcmp(a,b)==0) k.[) R@0%  
Bjj^!T/#  
{} &"%|`gE  
1/+r?F 3  
//指针…… xH#a|iT?(  
RyWOiQk;  
char a[]=”Hello Word!”; Vzvw/17J  
g*r;( H>e  
char *p; B^~Bv!tHWr  
_hL4@ C  
p=new char[strlen(a)+1]; gr{Sh`Cm-  
Bl\kU8O-  
strcpy(p,a); Atq2pL"  
k]9>V@C  
if (strcmp(p,a)==0) *js$r+4  
W?J[K;<  
{} >/kG5]zxY  
%]$p ^m  
w!w _`7[  
十二、sizeof的问题 6FIoWG"x  
R bc2g"]  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 ^GaPpm  
~.`r(  
char a[]=”Hello World!” Ny7=-]N4{"  
T KL(97)<  
char *p=a; [mzF)/[_2  
A""*vqA  
count<<sizeof(a)<<end; //12字节 <L ( =  
y"L`bl A9}  
count<<sizeof(p)<<endl; //4字节 V^/^OR4k  
gJ8 c]2c  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 -U;LiO;N  
FK >8kC  
void fun(char a[1000]) L8xprHgL  
h]DE Cd{  
{ xYVjUb(,X  
KXA)i5z  
count<<sizeof(a)<<endl; //输出4而不是1000 ::R00gd  
[pFu ] ^X  
} 7oLf5V1~  
}\L !;6oy  
[P c[{(  
十三、关于指针 $SGA60q  
o/9LK  
1、 指针创建时必须被初始化 (Cd{#j<  
z/&a\`DsU  
2、 指针在free 或delete后必须置为NULL N z3%}6F:  
C5PBfn<j  
3、 指针的长度都为4字节 ;(0$~O$3u  
AD%D ,l  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 n ,:.]3v%  
_AB9BQm  
char *p=new char[100]; ?&<o_/`-H5  
pH l2!{z  
strcpy(p,”Hello World”); I&fh  
po2[uJ  
delete []p; //注意前面的[]号 /j69NEl  
l(w vQO  
p=NULL; ck_fEF  
b hr E  
5、数组指针的内容不能超过数组指针的最大容易。 :htq%gPex9  
O:=|b]t  
如: g_U~.?Db7  
z>p`!-'ID  
char *p=new char[5]; u}LX,B-n(  
m5em<P!G  
strcpy(p,”Hello World”); //报错 目标容易不够大 ]v\egfW,W  
) !}-\5F  
delete []p; //注意前面的[]号 MAD}Tv\S7  
P9TBQW2G{  
p=NULL; ^0tf1pV2  
O:^LQ  
zPh\3B  
十四、关于malloc/free 和new /delete 3AQ>>)T~  
X*9N[#wu6  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 $7DcQ b9  
11y .z^  
l 注意:malloc/free是库函数,new/delete是运算符 5+/b$mHZX  
T<e7(=  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 d:<H?~  
MjXE|3&  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 uGUv~bE  
hKZ`DB4  
l 两者都必须要成对使用 9+8!xwR:  
Z-h7  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 +5t bK  
Ds%&Mi  
sId(PT^  
十五、C++的特性 =1 BNCKT<  
%X"m/4c8}  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 hUT^V(  
z1'FmwT  
重载和内联:即可用于全局函数,也可用于类的成员函数; o%WjJ~!zL  
6(J4IzZ  
Const和Virtual:只可用于类的成员函数; yB4H3Q )  
p;u 1{  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 ./&zO{|0]  
,s><kHJ  
覆盖是指派生类函数覆盖基类函数 K%(XgXb(</  
GKyG #Fl  
函数名相同; T~o{woq}g  
qQxA@kdd  
参数相同; V@ _-H gg  
7{An@hNh  
基类函数必须有Virtual关键字; t.E4Tqzc>  
Yb%-tv:  
不同的范围(派生类和基类)。 QSF"8Uk  
{ 8f+h  
隐藏是指派生类屏蔽了基类的同名函数相同 v"~Do+*+  
46K&$6eN  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 sP?$G8-^  
5`E`Kb+@  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 '{0[&i*  
EY)Gi`lK  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 a%T -Z.rd  
EzIs@}  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 2T@L{ql  
.;HIEj zq  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 J}(6>iuQY?  
;;?vgrz  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: Z%+BWS3YqY  
C1T=O  
将void Func(A a) 改为void Func(const A &a)。 a4T~\\,dZ>  
1 @%B?  
而void func(int a)就没必要改成void func(const int &a); BeI;#m0  
N~):c2Kp<9  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 OpK. Lsd0y  
8wII{FHX  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 +:>JZ$  
kYxl1n v  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; rps(Jos_~  
a(@p0YpKT  
=9pw uH  
十六、extern“C”有什么作用? ;NH~9# t:  
!6zyJc @01  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 T3Frc ]6,4  
nw0L1TP/J  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 MCk^Tp!  
(A29Z H  
-!J2x 8Ri  
十七、构造函数与析构函数 ' :\fl.b  
<Zp^lDxa  
派生类的构造函数应在初始化表里调用基类的构造函数; 0%s3Mp6H  
L`UG=7r q  
派生类和基类的析构函数应加Virtual关键字。 I#U>5"%\a  
2'wr={>W  
不要小看构造函数和析构函数,其实编起来还是不容易。 u R\m`  
PMgQxM*h  
#include <iostream.h> %M{k.FE(  
Mlv<r=E  
class Base )?w&oIj5  
~{kM5:-iw  
{ / l".}S  
Mo}H_8y  
public: T&r +G!2  
N%9h~G  
virtual ~Base() { cout<< "~Base" << endl ; } #>8T*B  
e,f ;  
}; PSTu/^  
t`"^7YFS>  
class Derived : public Base -@''[m.*  
[J0*+C9P*  
{ ^ <qrM  
CQdBf3q  
public: E'5Ajtw;  
UvkJ?Bu  
virtual ~Derived() { cout<< "~Derived" << endl ; } V: ^JC>6  
aje^Z=]  
};  ~~PgF"v  
M@|w[ydQG  
void main(void) 8HMo.*Ti9  
3p=vz'  
{ Aoj6k\YX  
'_B_&is  
Base * pB = new Derived; // upcast K7IyCcdB  
Kb}MF9?:e  
delete pB; K~c^*;F  
GDF{Lf)/v  
} U1l0Uke  
fr+@HUOxsl  
输出结果为: xXF2"+  
(NX)o P  
~Derived ajW[eyX  
nV'3sUvR#  
~Base [#p&D~Du&  
$[,l-[-+  
如果析构函数不为虚,那么输出结果为 vXephR'  
W1v CN31  
~Base Fse['O~  
eY T8$  
U\Ct/U&A?  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 < CDA"  
z^r |3;  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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