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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 :1@jl2,  
Z,M2vRj"qT  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 1Y~'U =9  
8|5+\1!#/)  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 6Lg#co}9  
3 +`,'Q9  
0V`~z-#  
二、头文件的作用 ZjrBOb  
ej=}OH4  
加强安全检测 IH5^M74b  
0~W6IGE~  
通过头文件可能方便地调用库功能,而不必关心其实现方式 UDnCHGq  
,\d03wha  
eW}-UeT  
三、* , &修饰符的位置 uX&h~qE/  
lZ <D,&  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 pigu]mj  
SxcE@WM  
wu b7w#  
四、if语句 Be<bBKQb  
`49!di[  
不要将布尔变量与任何值进行比较,那会很容易出错的。 3Ljj|5.q  
^BW8zu@=O  
整形变量必须要有类型相同的值进行比较 ZU2D.Kf_:  
wnQi5P+  
浮点变量最好少比点,就算要比也要有值进行限制 >enP~uW[#  
,_=LV  
指针变量要和NULL进行比较,不要和布尔型和整形比较 ?`6Mfpvj96  
&>K|F >7q  
4\uq$.f-  
五、const和#define的比较 e:_[0#  
mmCGIX  
const有数据类型,#define没有数据类型 n0%S: (  
o? K>ji!  
个别编译器中const可以进行调试,#define不可以进行调试 ]"j%:fr  
w6^TwjjZ$  
在类中定义常量有两种方式 (Fq]y5  
oU*e=uehj  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; (#>Q#Izr  
,jD-fL/:  
2、 用枚举代替const常量。 .f!:@fX>=  
47A[-&y*X  
j)juvat  
六、C++函数中值的传递方式 fWF!%|L  
s!Iinc^p  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) (/t{z =  
vy>(?[  
void fun(char c) //pass by value h96<9L  
Qkw_9  
void fun(char *str) //pass by pointer y S<&d#:"  
q 1u_r  
void fun(char &str) //pass by reference IA}.{zY~|  
Kf)$/W4  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 3Gw*K-.  
u~mpZ"9$ 3  
函数的类型不能省略,就算没有也要加个void %O7?:#_  
?}u][akM  
'gsO}xj  
七、函数体中的指针或引用常量不能被返回 {e0aH `me  
W v,?xm  
Char *func(void) 'kg~#cf/+  
U2\k7I  
{  x_/H  
2_Cp}Pj  
char str[]=”Hello Word”; Lg2PP#r  
y\dx \  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 &hZ6CV{  
zhyf}Ta'  
return str; 2j1HN  
~i>'3j0@k  
} |]-~yYqP3  
eQqCRXx  
函数体内的指针变量并不会随着函数的消亡而自动释放 |t#s h  
vH E:TQo4  
uD ;T   
八、一个内存拷贝函数的实现体 eq9qE^[Z&  
ZOx;]D"s  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) UM0#S}  
5D3&6DCH  
{ M[_Ptqjb  
-:b<~S[  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); 2t=&h|6EW  
?4Rq +  
byte *pbTo=(byte*)pvTo; //防止地址被改变 LVL#qNIu  
: >$v@d  
byte *pbFrom=(byte*)pvFrom; (?.h<v1}  
EvA8<o  
while (size-- >0) " ;\EU4R  
PX?^v8wlqL  
pbTo++ = pbForm++; ]a:T]x6'  
a^VI)  
return pvTo; v)*eLX$  
Y$qjQ1jF+  
} !8RJHMX&  
=~dsIG  
e >7Ka\  
九、内存的分配方式 G2:.8 ok  
V@1,((,l  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 c5[ ~2e  
gDH|I;!  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 E <r;J  
ZMK1V)ohn  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 kkj_k:Eah  
$u)#-X;x  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 e)F_zX  
KT<N ;[;  
ItAC=/(d  
十、内存分配的注意事项 Xxm7s S  
V:AA{<  
用new或malloc分配内存时,必须要对此指针赋初值。 a3He-76  
Q"oJhxS  
用delete 或free释放内存后,必须要将指针指向NULL }MM:qR  
KkR.p,/  
不能修改指向常量的指针数据 Lk-h AN{[  
}F3}"Ik'L  
9HlM0qE5b  
十一、内容复制与比较 M IUB]  
4@M}5WJ7  
//数组…… B{V(g"dM  
Nk9w ; z&  
char a[]=”Hello Word!”; aZ ta%3`)  
.O{_^~w_q  
char b[10]; @DAaCF8  
dmMrZ1u2  
strcpy(b,a); ~BXy)IB6  
?.nD!S@  
if (strcmp(a,b)==0) @,pn/[  
H\|H]:CE  
{} fs#9*<]m  
U8zs=tA  
//指针…… }</"~Kw!  
!zfV (&  
char a[]=”Hello Word!”; j<L!(6B  
O%Qz6R  
char *p; 1_G+sDw$  
|j$$0N  
p=new char[strlen(a)+1]; 8: VRq  
h>/L4j*Z  
strcpy(p,a); N,ZmGzNP)  
RRGs:h@;  
if (strcmp(p,a)==0) k rXU*64  
!nF.whq  
{} pq]>Ep  
m2F+ 6G  
^3Z~RK\}  
十二、sizeof的问题 [?)He} _L  
T<mP.T,$!  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 *o=( w5   
qqu ]r  
char a[]=”Hello World!” <mQ9YO#  
&tlU.Whk+  
char *p=a; tz%H1 `  
z*N%kcw"  
count<<sizeof(a)<<end; //12字节 Ja%isIdh  
X@~R<  
count<<sizeof(p)<<endl; //4字节 $oi8 <8Y  
Ga;Lm?6-  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 hOm0ND?;1  
YUlH5rO3  
void fun(char a[1000]) v=YI%{tx)  
(i]0IYMXy*  
{ z+Ej`$E{lD  
{=P}c:i W  
count<<sizeof(a)<<endl; //输出4而不是1000 2:6lr4{uY  
I"WmDC`1  
} x0q `Uc  
Ntpw(E<$f  
&LhR0A  
十三、关于指针 9]a!1  
0}$R4<"{Y>  
1、 指针创建时必须被初始化 er>@- F7w  
v+d? #^  
2、 指针在free 或delete后必须置为NULL MAgoxq~;V  
n<>]7-  
3、 指针的长度都为4字节 K- TLzoYA  
en16hd>^W:  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 AD"L>7  
&3YXDNm  
char *p=new char[100]; rmhL|! Y  
pA@BW:#  
strcpy(p,”Hello World”); va;fT+k=  
s&-dLkis{u  
delete []p; //注意前面的[]号 HgOrrewj  
N<aMUVm  
p=NULL; )AAPT7!U  
6W N(Tw  
5、数组指针的内容不能超过数组指针的最大容易。 0C0ld!>r  
~*RBMHs  
如: l>@){zxL  
V}q=!zz  
char *p=new char[5]; ;QQ/bM&I  
sW@_q8lG  
strcpy(p,”Hello World”); //报错 目标容易不够大 ?L>}( {9  
>]?!9@#IH  
delete []p; //注意前面的[]号 `q?@ Ob&  
sq}uq![?M  
p=NULL; $_ k:{?  
/#e-x|L  
bbFzmS1  
十四、关于malloc/free 和new /delete Pb/[945  
PkDh[i9Z|  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 h%U,g 9_  
bVds23q  
l 注意:malloc/free是库函数,new/delete是运算符 ]bAw>1,NVD  
HJOoCf  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 4,7W*mr3(  
`FIS2sl/  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 <f@ A\  
-K iI&Q  
l 两者都必须要成对使用 A55F* d  
]{pH,vk-  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 ?xzDz  
DMd&9EsRG  
8|IlJiJ~v  
十五、C++的特性 EZ)GW%Bm2  
^ V8?6E  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 ZgL]ex  
=~{W;VZt'  
重载和内联:即可用于全局函数,也可用于类的成员函数; $WZHkV  
p/Lk'h~  
Const和Virtual:只可用于类的成员函数; Y q-7!  
^a;412  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 :X#'E Lo|  
vN`JP`IBx  
覆盖是指派生类函数覆盖基类函数 ddvtBAX  
rJc=&'{&)N  
函数名相同; ?YhGW   
8\e8$y3  
参数相同; (^LR9 CW  
RJA#cv~f  
基类函数必须有Virtual关键字; WlnS.P\+E  
)W3kBDD  
不同的范围(派生类和基类)。 ^1z)\p1  
=-n7/  
隐藏是指派生类屏蔽了基类的同名函数相同 6g%~~hX  
,\0>d}eh !  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。  uE3xzF  
bODyJ7=[  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 zirnur1  
#^bn~  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 2p8}6y:}7  
,M$ J yda  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 8DZ OPA  
h>&t``<  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 %jj\w>  
'Rw*WK  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: /7yd&6`I  
y_f^ dIK*=  
将void Func(A a) 改为void Func(const A &a)。 7N[Cs$_]  
u#v];6N  
而void func(int a)就没必要改成void func(const int &a); .oxeo 0@~  
z#{%[X2  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 K{]\}7+   
$D(q  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 2"L a}Vx2  
aDjYT/`l  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; >Ms_bfSK  
@7OE:& #V  
3Vb/Mn!k  
十六、extern“C”有什么作用? $C9['GGR  
D 13bQ&\B-  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 5:X^Q.f;  
NUGiDJ+[  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 &3bhK5P  
}n$I #G}\/  
khfWU  
十七、构造函数与析构函数 oD~q/04!  
=FXq=x%9+  
派生类的构造函数应在初始化表里调用基类的构造函数; t{Gc,S!]5  
yo"!C?82=  
派生类和基类的析构函数应加Virtual关键字。 XF Wo"%}w  
mA0|W#NB  
不要小看构造函数和析构函数,其实编起来还是不容易。 Gque@u  
</)QCl'd  
#include <iostream.h> wVtBH_>  
wxo{gBq  
class Base u eV,p?Wo  
3\&I7o3V  
{ g2W ZW#a)  
7 ?"-NrW~  
public: F)hUT@  
2U`g[1  
virtual ~Base() { cout<< "~Base" << endl ; } `NARJ9M   
^ lM.lS>)  
}; wb/@g=` d  
 eAbp5}B  
class Derived : public Base m15> ^i^W  
wGAeOD  
{ +pJ~<ug]  
q OX=M  
public: qq[Enf|/y  
Ai.^~#%X  
virtual ~Derived() { cout<< "~Derived" << endl ; } R#Hz%/:|A  
TWT h!  
}; P_%kYcX'  
yu @u0vlc  
void main(void) 5{O9<~,  
%Y<3v \`_  
{ {.D/MdwW;  
f&L8<AS Fo  
Base * pB = new Derived; // upcast @rt}z+JF  
W)fh}|.5  
delete pB; ]ppws3*Pa  
:ej`]yK |  
} ^fxS=Qs+  
X(fT[A_2C  
输出结果为: _"'0^F$I  
H"J>wIuGX  
~Derived XZ[3v9?&n  
&1,{.:@e  
~Base Qvhz$W[P>  
7F 1nBd  
如果析构函数不为虚,那么输出结果为 b<"LUM*;  
Jqgo\r%`  
~Base [gxH,=Pb  
N"&qy3F  
pm k;5 d  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 37nGFH`K2m  
\K(QE ~y'W  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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