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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 {'/8{dS  
8O]$)E  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 }u :sh >2  
m 9r X  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 [|vd r.  
J( 0c#}d  
.k}h'nE  
二、头文件的作用 S;Vj5  
#(OL!B  
加强安全检测 bS*9eX=K  
8"+Kz  
通过头文件可能方便地调用库功能,而不必关心其实现方式 L!\I>a5C0G  
cG.4%Va@s_  
+BESO  
三、* , &修饰符的位置 lyP<&<Y5  
RJ`F2b sYN  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 -0Ps. B  
'2eggX%  
O[!]/qP+.  
四、if语句 4g|}]K1s  
)gZ yW  
不要将布尔变量与任何值进行比较,那会很容易出错的。 WHL@]^E@m  
qTG/7tn "  
整形变量必须要有类型相同的值进行比较 |1#*`2j\=9  
s q_ f[!  
浮点变量最好少比点,就算要比也要有值进行限制 OF}vY0oiw?  
z&w@67 >j  
指针变量要和NULL进行比较,不要和布尔型和整形比较 LKhUqW  
y:mXv<g  
V V<Zl  
五、const和#define的比较 Z\n nVM=  
bO9X;} \6  
const有数据类型,#define没有数据类型 o<Q~pd#Ip,  
Wh,p$|vL  
个别编译器中const可以进行调试,#define不可以进行调试 `rvS(p[s  
{q:6;yzxl  
在类中定义常量有两种方式 uZCPxog  
L+&$/1h]  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; zpJQ7hym  
F&^u1RYz  
2、 用枚举代替const常量。 vLq_l4l  
(<|,LagTuc  
G#UO>i0jy  
六、C++函数中值的传递方式 *~cq (PFQ  
O.i.<VD7  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) C1hp2CW$5/  
0`:0m/fsU  
void fun(char c) //pass by value NbH;@R)L  
!IcP O  
void fun(char *str) //pass by pointer X-=49)  
fTMn  
void fun(char &str) //pass by reference EW]rD  
U 1vZ r{\  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 b:2# 3;)  
A|7%j0T  
函数的类型不能省略,就算没有也要加个void n&Bgpt~  
c1Skt  
 (cx Q<5  
七、函数体中的指针或引用常量不能被返回 bZLY#g7L"  
-a !?%  
Char *func(void) ka0MuQ M  
uWkW T.>$  
{ XU_gvz  
Ejmpg_kux  
char str[]=”Hello Word”; ]De<'x}  
XkDIP4v%  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 I|(r1.[K  
{{qu:(_g  
return str; p C^d-Ii  
KSz;D+L \  
} K|]/BjB/  
s+DOr$\  
函数体内的指针变量并不会随着函数的消亡而自动释放 n&1q*  
NYw>Z>TD8c  
g=n{G@*N  
八、一个内存拷贝函数的实现体 #A\@)wJ  
{\hjKP  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) }20~5!  
uVN2}3!)Y  
{ f?W_/daP  
W[/Txc0$  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); WUrE1%u  
0~4Ww=#  
byte *pbTo=(byte*)pvTo; //防止地址被改变 E6XDn`:  
\xG_q>1_  
byte *pbFrom=(byte*)pvFrom; @q]4]U)  
6+!$x?5|NP  
while (size-- >0) -!q^/ux  
TXdo,DPv7  
pbTo++ = pbForm++; {.eo?dQ  
{^8?fJ/L  
return pvTo; w{mw?0  
rny(8z%Ck-  
} s5h}MXIXw  
Np7+g`nG  
tTOBKA89  
九、内存的分配方式 ~[<C6{  
#zRHYZc'T|  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 fYSH]!  
[4w*<({*  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 LY-,cXm&|  
zG{P5@:.R  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 9A~w2z\G  
rtNYX=P  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 iYD5~pK8  
e.\dqt~%y  
<p/zm}?')  
十、内存分配的注意事项 DG?g~{Y~b  
-U*J5Q  
用new或malloc分配内存时,必须要对此指针赋初值。 Qo32oT[DM  
,.Lwtp,n  
用delete 或free释放内存后,必须要将指针指向NULL ;.'?(iEB  
ulE5lG0c  
不能修改指向常量的指针数据  LAkBf  
PriLV4?  
F Y<Q|Ov  
十一、内容复制与比较 4M#i_.`z  
h+=IxF4  
//数组…… hjyM xg;Q?  
By waD?  
char a[]=”Hello Word!”; {xx}xib3  
"}MP{/  
char b[10]; v*[UG^+)  
eAmI~oku  
strcpy(b,a); &(oA/jFQ  
Unvl~lm6  
if (strcmp(a,b)==0) \3OEC`  
Ge_fU'F  
{} Q3Pu<j}Y  
URceq2_  
//指针…… yDfH`]i)U  
nNq<x^@83  
char a[]=”Hello Word!”; l`.z^+!8@  
KLvAe>#,  
char *p; p[w! SR%=  
LN~mKoW  
p=new char[strlen(a)+1]; d?&`Z Vl  
.W^B(y(tA  
strcpy(p,a); 7HkFDI()1  
}f;WYz5  
if (strcmp(p,a)==0) :.4O Hp1  
T%% 0W J  
{} 9dq"x[  
6@TU9AZS `  
A|GtF3:G  
十二、sizeof的问题 b"uO BB  
<l(n)|H1P  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 MA,*$BgZ  
9w- )??  
char a[]=”Hello World!” <3!Al,!ej@  
)by7 [I0v  
char *p=a; Tf~eH!~0  
iLch3[p%  
count<<sizeof(a)<<end; //12字节 .<zKBv  
d\uN  
count<<sizeof(p)<<endl; //4字节 =WjHf8v;  
LD ]-IX&L  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 N"}>);r  
0KnL{Cj   
void fun(char a[1000]) @4hzNi+  
_tJt eDRY  
{ ]L97k(:Ib  
ele@xl  
count<<sizeof(a)<<endl; //输出4而不是1000 <Xl#}6II  
%ggf|\ -e  
} Asv]2> x  
XHekz6_  
?<${?L>  
十三、关于指针 )i}j\";>L  
OL>)SJj5  
1、 指针创建时必须被初始化 Qn7T{ BW  
5]>*0#C S  
2、 指针在free 或delete后必须置为NULL a;t}'GQGk  
8'u9R~})   
3、 指针的长度都为4字节 h*%FZ}}`q  
u Jqv@GFv  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 &EqLF  
PFuhvw~?  
char *p=new char[100]; nm@ h5ON_  
=nHKTB>  
strcpy(p,”Hello World”); iP0m1  
U xBd14-R_  
delete []p; //注意前面的[]号 kzKej"a;  
Ec!!9dgRQ  
p=NULL; (oi:lC@h*  
h{gFqkDoTI  
5、数组指针的内容不能超过数组指针的最大容易。 `wXK&R<`  
]:OrGD"  
如: B~w$j/sWU  
ID43s9  
char *p=new char[5]; is4}s,]$6  
pASX-rb  
strcpy(p,”Hello World”); //报错 目标容易不够大 9a=Ll]=\  
&cL1 EQ(  
delete []p; //注意前面的[]号 z~#;[bER  
qtExd~E  
p=NULL; l)9IgJ|<b  
bZNqv-5 4h  
<%m YsaM  
十四、关于malloc/free 和new /delete +b(};(wL  
i'm<{ v  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 5Jbwl$mZ  
+P^ ;7"H  
l 注意:malloc/free是库函数,new/delete是运算符 #7 3pryXV  
x "{aO6M  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 SI=$s>1  
rZKfb}ANQ  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 wAKHD*M)  
m<h%BDSzr{  
l 两者都必须要成对使用 /?eVWCR  
O;H6`JQ  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 j{%;n40$  
%rylmioW>  
m+0yf(w  
十五、C++的特性 dymq Z<  
#RBrii-,  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 v>_@D@pr  
}T@=I&g;  
重载和内联:即可用于全局函数,也可用于类的成员函数; &eHRn_st5b  
HU'Mi8xxy  
Const和Virtual:只可用于类的成员函数; M76p=*  
K6kz{R%`  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 inWLIXC,  
--WQr]U/  
覆盖是指派生类函数覆盖基类函数 /K#k_k  
I8Aq8XBw  
函数名相同; m\56BP-AM  
5dePpFD5  
参数相同; xU.1GI%UPu  
fzIs^(:fl  
基类函数必须有Virtual关键字; }|.<EkA  
|-Uh3WUE6  
不同的范围(派生类和基类)。 YNr"]SA@;  
B&]`OO>O  
隐藏是指派生类屏蔽了基类的同名函数相同 M7TLQqaF  
`,qft[1  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 (QDKw}O2b  
,^:{!?v  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 d=D-s  
gQ_<;'m)2  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 )2&3D"V  
tm+*ik=x|  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 hzo> :U  
G?s9c0f  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 o;$xN3f,  
$G".PWc  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: Q;]JVT1  
KqK]R6>  
将void Func(A a) 改为void Func(const A &a)。 UzxL" `^7  
YzESV Th  
而void func(int a)就没必要改成void func(const int &a); p F{jIXu  
P8eCaZg?(3  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 C[L 5H  
gXxi; g  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 <Ht"t]u*Bn  
?9`j1[0  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; YO$Ig:a#  
/eV)5`V  
V$?6%\M^*  
十六、extern“C”有什么作用? k+J%o%* <  
[d`E9&Hv3  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 5#GMp  
kelBqJ-,p  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ` ,\b_SFg  
"w:h  
!"N,w9MbD  
十七、构造函数与析构函数 BJjic%V  
,"EaZ/Bl/  
派生类的构造函数应在初始化表里调用基类的构造函数; ~/L:$  
(!* l+}  
派生类和基类的析构函数应加Virtual关键字。 *ERV\/  
"t0^4=c+7  
不要小看构造函数和析构函数,其实编起来还是不容易。 J :O!4gI  
cYA:k  
#include <iostream.h> Xdn&%5rI  
B4y_{V  
class Base Fi i(dmn  
t<45[~[  
{ (Ceruo S  
i!a!qE.1  
public: }j/\OY _&  
Rw?w7?I  
virtual ~Base() { cout<< "~Base" << endl ; } )]fsl_Yq  
K(+=V)'Dz  
}; UD-+BUV  
L^JU{\C  
class Derived : public Base QLJ\>  
]64Pk9z=  
{ C m:AU;  
bBi>BP =  
public: ),x0G*oebj  
}b456J  
virtual ~Derived() { cout<< "~Derived" << endl ; } Ca~8cQ  
,;pUBrz/[  
}; "S;4hO  
j9fBl:Fr  
void main(void) \@@G\\)er  
"yu{b]AU  
{ A[l )>:  
?/.])'&b  
Base * pB = new Derived; // upcast 2+&;jgBP  
HZ9>4G3  
delete pB; {y"Kn'1  
JLd%rM\m  
} Nw"df=,{  
;P S4@,  
输出结果为: #(tdJ<HvC|  
z4YDngf=4  
~Derived N3u06  
/dCsZA  
~Base ~cm4e>o  
F$UL.`X _/  
如果析构函数不为虚,那么输出结果为 nvR%Ub x  
OC&BJNOi  
~Base x// uF  
f&vMv.  
!KI^Z1dP(  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 Fg`<uW]TFZ  
;mpYcpI  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五