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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 Fm3f/]>k#_  
Oy `2ccQ#  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 YhzDi>hob  
UFED*al#  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 ZvS|a~jO  
" ~X;u8m  
&d8z`amP  
二、头文件的作用 .vbUv3NI  
\EC=#E(  
加强安全检测 ]("5O V5  
<g^!xX<r?  
通过头文件可能方便地调用库功能,而不必关心其实现方式 W,[b:[~v  
NP {O  
3V"y|q  
三、* , &修饰符的位置 ~D9VjXfL)  
i7m=V T  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 fy(i<L Z  
hSvA dT]m  
#n[1%8l,  
四、if语句 qU1^ K  
P 3CzX48^  
不要将布尔变量与任何值进行比较,那会很容易出错的。 d/Z258  
zJp@\Yo+  
整形变量必须要有类型相同的值进行比较 qhPvU( ,  
4G%!t`? q  
浮点变量最好少比点,就算要比也要有值进行限制 $|2@of.  
t!g9,xG<X  
指针变量要和NULL进行比较,不要和布尔型和整形比较 2`o}neF{  
^rKA=siz  
&d`z|Gx9  
五、const和#define的比较 ? 8d7/KZO  
_uR-Z_z  
const有数据类型,#define没有数据类型 es` A<  
sc2nLyn$  
个别编译器中const可以进行调试,#define不可以进行调试 CFW\  
xF+a.gAIb  
在类中定义常量有两种方式 + !I7(gL  
\xH#X=J  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; tp3>aNj  
\qrSJ=}t  
2、 用枚举代替const常量。 Y!kz0([  
8"M*,?.]  
V0gk8wD  
六、C++函数中值的传递方式 Qe!Q $  
{ZS-]|Kx  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) :\*<EIk(  
PC_#kz  
void fun(char c) //pass by value !*0\Yi,6  
a:o Z5PX=  
void fun(char *str) //pass by pointer )TceNH  
; )Vro  
void fun(char &str) //pass by reference I$Q%i Z{  
JeR8Mb  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 ? [?{X~uq  
S^GB\uJ  
函数的类型不能省略,就算没有也要加个void .qyk[O  
-}lcMZY  
-$(,&qyk  
七、函数体中的指针或引用常量不能被返回 r@xMb,!H  
qzVmsxBNP  
Char *func(void) y@;4F n/  
No)v&P%  
{ 1Ftl1uf  
nb:J"  
char str[]=”Hello Word”; ?"p:6%GFz  
JM#jg-z,~  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 SWjOJjn  
`eIX*R   
return str; kO:iA0KUX  
5#zwd oQ  
} 8c m,G  
!8"516!d|p  
函数体内的指针变量并不会随着函数的消亡而自动释放 H!Y`?Rc  
H( `^1  
D<[4}og&]  
八、一个内存拷贝函数的实现体 zh$[UdY6  
,.` ";='o  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 6&=xu|M<x=  
=|n NC  
{ Dg]ua5jk  
Ox"4 y  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); A6'G%of  
o y! W$ ?6  
byte *pbTo=(byte*)pvTo; //防止地址被改变 jNN$/ZWm  
p+ymt P F  
byte *pbFrom=(byte*)pvFrom; WigC'  
cO2 .gQo'  
while (size-- >0) ^5biD9>M  
&oevgG  
pbTo++ = pbForm++; M:OY8=V  
.J3lo:  
return pvTo; >9D=PnHnD  
or/Y"\-!  
} ZoB?F  
GEq?^z~i  
rr2'bf<]  
九、内存的分配方式 w%cd $"EH  
__""!Yz  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 4J2NIFZ  
 OvU]|4h  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 /4j'?hB<g  
E7+ y W  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 bL+Hw6;  
b/oJ[Vf  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 F#@Mf?#2  
/reSU 2  
p^+k:E>U  
十、内存分配的注意事项 GVZ/`^ndM  
@* L^Jgn  
用new或malloc分配内存时,必须要对此指针赋初值。 eKpH|S!x U  
E/:<9xl  
用delete 或free释放内存后,必须要将指针指向NULL Zb`}/%\7  
\`r5tQr  
不能修改指向常量的指针数据 +o)S.a+7  
gOa'o<  
["GC   
十一、内容复制与比较 4~4PZ  
UNq!|  
//数组…… Yd lXMddE  
FJo N"X  
char a[]=”Hello Word!”; R3wK@D  
M[D`)7=b  
char b[10]; JAen= %2b  
|vA3+kG  
strcpy(b,a); '0U+M{  
^]^Y~$u  
if (strcmp(a,b)==0) c[?S}u|['  
"jmi "O*  
{} cC1nC76[  
tTe\#o`  
//指针…… -MJ6~4k2  
:gVz}/C.@  
char a[]=”Hello Word!”; ;^lVIS%&{  
0@{K'm /  
char *p; %Y:'5\^lC  
UL$^zR3%d  
p=new char[strlen(a)+1]; 3>yb$ZU"-  
jwyJ=W-  
strcpy(p,a); ()v[@"J  
Y(78qs1w  
if (strcmp(p,a)==0) i0Qg[%{9#  
FVT_%"%C9  
{} -#j-Zo+<  
KQaw*T[Q3w  
' wvZnb  
十二、sizeof的问题 cG6Q$  
'CjcOI s  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 ?Q wDV`  
2!cP[ Ck  
char a[]=”Hello World!” Yq4_ss'nB  
nBjfR2TuF  
char *p=a; ,* ?bET $  
k4'rDJfB  
count<<sizeof(a)<<end; //12字节 .1 .n{4z>:  
X3%7VFy9  
count<<sizeof(p)<<endl; //4字节 pY!@w0.  
F=Z|Ji#  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 &!2 4l=!  
m[!t7e  
void fun(char a[1000]) > YKvwbCf8  
%L}9nc%~eP  
{ v0jRoE#  
,xuqQ;JX  
count<<sizeof(a)<<endl; //输出4而不是1000 7ml,  
#,Fk  
} ' ]l,  
M'$n".,p  
&sh %]o8  
十三、关于指针 c>:}~.~T  
yDWzsA/X  
1、 指针创建时必须被初始化 M['8zN  
M-,vX15S  
2、 指针在free 或delete后必须置为NULL 1&ZG6#16q  
rg "W1m[k  
3、 指针的长度都为4字节 \'&:6\-fw  
:-xp'_\L  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 L:IaJ?+?  
=PP]LDlJs  
char *p=new char[100]; D!Owm&We  
8h=H\v^f  
strcpy(p,”Hello World”); ow:c$Zq  
uwsGtgd&  
delete []p; //注意前面的[]号 %g^dB M#  
qtnLQl"M  
p=NULL; $^INl0Pg  
Yl% Ra1  
5、数组指针的内容不能超过数组指针的最大容易。 WO/;o0{d\9  
Xnt`7L<L  
如: ,oT?-PC$z  
K%[Rv#>;q|  
char *p=new char[5]; MIub^ $<C  
1t+]r:{  
strcpy(p,”Hello World”); //报错 目标容易不够大 T#DJQ"$  
I?c# T Rm  
delete []p; //注意前面的[]号 QzT)PtX  
0\qbJ  
p=NULL; ?y>xC|kt  
"(F>?pq  
O _yJR  
十四、关于malloc/free 和new /delete ,+3l9FuQ  
@2v L'6  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 )a .w4dH  
r50}j  
l 注意:malloc/free是库函数,new/delete是运算符 _ M8Q%  
Us+|L|/  
l malloc/free不能执行构造函数与析构函数,而new/delete可以  Xt(w+  
bU/5ug.  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 &[`p qX  
x/ {  
l 两者都必须要成对使用  :J`:Q3@  
%a<N[H3NV@  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 RWP`#(&/&  
n7i;^=9 mM  
kLU$8L  
十五、C++的特性 %L.,:mtq)  
=>-:o:Cu{  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 Lfx&DK !  
v*7}ux8  
重载和内联:即可用于全局函数,也可用于类的成员函数; Tm-Nz7U^^  
DNcf2_m  
Const和Virtual:只可用于类的成员函数; R!0O[i  
d&&^_0O  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 +e);lS"+/  
P6&@fwJ<  
覆盖是指派生类函数覆盖基类函数 l3R`3@  
t%Vc1H2}  
函数名相同; YK!nV ,  
F<Js"z+  
参数相同; ^8Tq0>n?  
GKu@8Ol-wu  
基类函数必须有Virtual关键字; lZ.x@hDS  
Ac 0C,*|^  
不同的范围(派生类和基类)。 I7ZY9W(S  
)WF]v"t  
隐藏是指派生类屏蔽了基类的同名函数相同 {Lwgj7|~  
P95U{   
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 *kY\,r&!P  
;XNe:g.CR  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 XrS.[  
!4\`g?  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 57k@] 3 4  
-lV]((I&  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 ?lW-NPr  
? acm5dN  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 GGo)k1T|)  
[g`9C!P-G  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如:  }&BE*U8_  
)XV|D  
将void Func(A a) 改为void Func(const A &a)。 O]>9\!0{  
28 [hp[<  
而void func(int a)就没必要改成void func(const int &a); h[b5"Uqj  
!G =!^RA  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 nd*9vxM  
eQ`TW'[9_6  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 Cj"+` C)l  
N7Vv"o  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; c,pR+DP  
T;K@3]FbX  
R_ymTB}<t(  
十六、extern“C”有什么作用? 'Vq <;.A  
#Jp_y|  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 f1w&D ]|S+  
;U=IbK*  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 1)yEx1  
piKYO+;W'  
dZcRLLR  
十七、构造函数与析构函数 Q%)da)0:c  
/.B7y(  
派生类的构造函数应在初始化表里调用基类的构造函数; rDFD rviW_  
p vone,y2  
派生类和基类的析构函数应加Virtual关键字。 VM=A#}  
PDQC^2Z  
不要小看构造函数和析构函数,其实编起来还是不容易。 TbX#K:l  
v zgR3r  
#include <iostream.h> ]S;^QZ  
dz@L}b*  
class Base QY2/mtI  
$I*ye+a*{q  
{ ~2u~}v5m7  
"2} {lu  
public: ~,[-pZ <  
 h0}r#L  
virtual ~Base() { cout<< "~Base" << endl ; } [ u7p:?WDW  
Bh3N6j+$d  
}; =)_9GO  
q"BM*:W  
class Derived : public Base 6[3oOO:uo  
EGpN@  
{ Mj&`Y gW5a  
OBrbWXp@  
public: n^vL9n_N  
6{Y3-Pxg  
virtual ~Derived() { cout<< "~Derived" << endl ; } %c+`8 wj  
1eQfc{[g  
}; [R V_{F:'  
-Pds7}F8  
void main(void) tFlLKziU  
jw63sn  
{ p5F=?*[}  
@o4+MQFn  
Base * pB = new Derived; // upcast D1w;cV7/d  
Pnf|9?~$H  
delete pB; 2stBW5v3  
`|nCr  
} abog\0  
%C8p!)Hu  
输出结果为: D*7JE  
j}P xq  
~Derived >4I,9TO  
poLzgd  
~Base |5J'`1W  
iYbp^iVg  
如果析构函数不为虚,那么输出结果为 ,q9nHZG^  
73/DOF  
~Base RWyDX_z#<  
4Js2/s  
<4lR  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 ++>HU{  
=*paa  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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