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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 eZ^-gk?  
R} #6  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 DWQ@]\  
(K(6`~  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 JWuF ?<+k  
!VJ5(b  
`V1D &}H+G  
二、头文件的作用 'kz[Gh*8  
lB0: 4cIj  
加强安全检测 UvtSNP&/2d  
_ IqUp Y  
通过头文件可能方便地调用库功能,而不必关心其实现方式 Jn>6y:s  
i!!1^DMrw  
Nd"4*l;  
三、* , &修饰符的位置 85Hb~|0  
lQolE P.pc  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 x*" 0dYH  
LS=HX~5C  
P ;#}@/E  
四、if语句 Uu9*nH_  
&u_s*  
不要将布尔变量与任何值进行比较,那会很容易出错的。 `2M`;$~ 5  
+Xg]@IS-eg  
整形变量必须要有类型相同的值进行比较 M@n9i@UsO  
AJ*FQo.U  
浮点变量最好少比点,就算要比也要有值进行限制 3 oG5E"G  
-R[ *S "  
指针变量要和NULL进行比较,不要和布尔型和整形比较 uD2v6x236  
Ris5) *7  
DhL]\ 4  
五、const和#define的比较 '01ifA^  
7;UUS1  
const有数据类型,#define没有数据类型 G:]w UC\  
jJN.(  
个别编译器中const可以进行调试,#define不可以进行调试 P1Z+XRWOM  
L(yR"A{FsE  
在类中定义常量有两种方式 `~bnshUk  
KKz{a{ePY%  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; ;eG,T-:  
AC$:.KLI  
2、 用枚举代替const常量。 q5irKT*Hs  
wi]F\ q"Y^  
pD+_ K  
六、C++函数中值的传递方式 a/Cd;T2  
AQ>8]`e`  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) ,,Dwb\B}  
3}@!TI  
void fun(char c) //pass by value S9$*w!W  
X0,?~i6Q  
void fun(char *str) //pass by pointer e Akjpc  
7n-;++a5]  
void fun(char &str) //pass by reference `@acQs;0  
Qg\OJmv  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 Q.q'pJ-  
ccUq!1  
函数的类型不能省略,就算没有也要加个void yX}riXe  
}4!R2c  
O43emL3  
七、函数体中的指针或引用常量不能被返回 #)aUKFX  
/mb?C/CI  
Char *func(void) ;$Eg4uX  
*20$u% z2  
{ <_S>-;by  
l@x/{0  
char str[]=”Hello Word”; Q)\~=/L b  
y^o*wz:D*  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 5$,dpLbL  
hcvWf\4'#q  
return str; >i>%@  
jXBAo  
} r>=)Y32Q  
#PzRhanX  
函数体内的指针变量并不会随着函数的消亡而自动释放 p nS{W \Q  
kvzGI>H:  
E1U~ ew  
八、一个内存拷贝函数的实现体 A8?uCkG  
~bp^Q| wM  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) jpl"KN?X  
CH6^;.  
{ fa7I6 i  
pNN6PsLt  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); n5Ad@Bg  
U*.Wx0QM  
byte *pbTo=(byte*)pvTo; //防止地址被改变 c :S A#.  
Q3t9J"=1g  
byte *pbFrom=(byte*)pvFrom; ##gq{hgjb$  
a&6e~E$K2  
while (size-- >0) JmJ8s hq  
J1waiOh  
pbTo++ = pbForm++; ,4bqjkX5q  
"T`Q,  
return pvTo; <q V<dK&W  
28KS*5S  
}  a=<l}`*  
`u%`N j  
c~B[ <.Qj  
九、内存的分配方式 &{): x  
j4v.8;  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 Jww LAQ5  
!TJCQ[Aa }  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 v !~lVv&  
bk@F/KqL  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 <,%qt_ !  
W}<'Y@[ ,  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 lg)jc3  
(mHCK5  
481SDG[b  
十、内存分配的注意事项 |IbCN  
_5F8F4QY`  
用new或malloc分配内存时,必须要对此指针赋初值。 0B0Uay'd_  
Xsvf@/]U  
用delete 或free释放内存后,必须要将指针指向NULL B'( /W@  
tta\.ic  
不能修改指向常量的指针数据 O1+2Z\F  
-r%3"C=m  
+I$ k_  
十一、内容复制与比较 ~_SoP  
H"_ZqEg  
//数组…… @Sxb}XI!f  
i%m]<yElm  
char a[]=”Hello Word!”; 8+ P)V4}  
>z'kCv  
char b[10]; a?4'',~  
#HjiE  
strcpy(b,a); Byx8`Cx1  
=2[5 g!qX  
if (strcmp(a,b)==0) '.jr" 3u  
C NDf&dzX8  
{} [89qg+z  
Y`5(F>/RQG  
//指针…… h|^RM*x  
&tT*GjPwg;  
char a[]=”Hello Word!”; W'l &rm@  
w)A@  
char *p; r+T@WvS%W  
|5o0N8!b[  
p=new char[strlen(a)+1]; ys+ AY^/  
GCn^+`.h1t  
strcpy(p,a); ]?n)!u  
!"w1Pv,  
if (strcmp(p,a)==0) N"X;aVFs_  
?[ n{M  
{} a}~Xns  
y8=(k}=3  
HmWU;9Vn+  
十二、sizeof的问题 h,-8( S  
s8,N9o[.~P  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 [42vO  
xz1jRI$  
char a[]=”Hello World!” ][ri A  
zKycd*X  
char *p=a; 's.%rre%  
0'Kbh$LU  
count<<sizeof(a)<<end; //12字节 r;gtfX*  
DA)mkp  
count<<sizeof(p)<<endl; //4字节 <ob+Ano$  
t{\,vI  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 Q~R7]AyR  
S GAu.8Js  
void fun(char a[1000]) 7Sc._G{[%  
Lq#>N_72W0  
{ cVHv>nd#  
=.q Zgcg  
count<<sizeof(a)<<endl; //输出4而不是1000 %y( oY  
m&EJ @,H  
} MO7:ZYq  
Vo@[  
9,h'cf`F  
十三、关于指针 ?T+Uu  
Qqt<  
1、 指针创建时必须被初始化 %nU8 Ca  
9.F+)y@  
2、 指针在free 或delete后必须置为NULL s bf\;_!  
*h=|KOS  
3、 指针的长度都为4字节 Ep/kb-~-  
[nQ<pTg~r  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 cVrses^yE  
e0i&?m  
char *p=new char[100]; w Phs1rL  
?nWK s  
strcpy(p,”Hello World”); xHs8']*\  
Z)RoFD1]C  
delete []p; //注意前面的[]号  4wLp  
%i!&Fr  
p=NULL; crV2T  
iHKWz)0  
5、数组指针的内容不能超过数组指针的最大容易。 ^j"*-)R  
}Wxu=b  
如: <t9#~x#'b  
J(CqT/Au-  
char *p=new char[5]; qla$}dnvc  
jOuz-1x,&  
strcpy(p,”Hello World”); //报错 目标容易不够大 }R.<\  
_1D'9!+   
delete []p; //注意前面的[]号 F<'@T,LVc  
sq6|J])GgU  
p=NULL; "xS?#^a  
`(j}2X'[  
gAcXd<a0  
十四、关于malloc/free 和new /delete X@$x(Zc  
%]/O0#E3Kz  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 Yb57Xu  
AL #w  
l 注意:malloc/free是库函数,new/delete是运算符 Rk#@{_  
F1skI _!  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 *KF-q?PBb  
0QE2e'}}-  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 n@9*>D U  
E 9=a+l9  
l 两者都必须要成对使用 xngK_n  
;x.xj/7  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 ?:bW@x  
F\1{bN|3  
vi+k#KE  
十五、C++的特性 mT8")J|2  
^P&)2m:s  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 Z!Y ^iN  
QO;W}c:N  
重载和内联:即可用于全局函数,也可用于类的成员函数; V\nQHzjF<6  
@+LZSd+I  
Const和Virtual:只可用于类的成员函数; cwK 6$Ax  
@pueM+(L&  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 ]|cL+|':y  
!(=bH"P  
覆盖是指派生类函数覆盖基类函数 K8 Y/sHl  
j(Tt-a("z  
函数名相同; Xj:?V;  
]d]tQPEU  
参数相同; u@v0I$  
PxENLQ3a=  
基类函数必须有Virtual关键字; ^cO^3=  
Q`#Y_N-h+  
不同的范围(派生类和基类)。 <&3qFK*9r  
!|P>%bi  
隐藏是指派生类屏蔽了基类的同名函数相同 \wY? 6#;  
_9!_fIY  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 Xz`?b4i  
m7z6c"?lB  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 g0-hN%=6  
_1w?nN'  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 <<>?`7N  
;74hOHDS  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 [eV!ho*r  
0( fN  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 {5}UP@h  
n,eO6X 4  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 0*?~I;.2m$  
q=8I0E&q  
将void Func(A a) 改为void Func(const A &a)。 yw'b^D/  
T9enyYt%  
而void func(int a)就没必要改成void func(const int &a); "T4Z#t  
1=C>S2q  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 3| 5Af  
?YR/'Vq97  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 Bor_Kib  
;hsgi|Cy-  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; "qEHK;  
SJhcmx+  
mO$]f4}  
十六、extern“C”有什么作用? &E.ckWf  
#&vP(4p  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 _iBNy   
S[!-M\b  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 VIo %((  
Lc;4 Hg  
mVGQyX  
十七、构造函数与析构函数 =VkbymIZ4y  
OZdiM&Zss  
派生类的构造函数应在初始化表里调用基类的构造函数; h@$M.h@mcG  
l%h0x*?$  
派生类和基类的析构函数应加Virtual关键字。 v*}r<} j  
Mfjj+P  
不要小看构造函数和析构函数,其实编起来还是不容易。 pQc5'*FKd  
 WTi8  
#include <iostream.h> OF^v;4u  
9I*zgM!F  
class Base WlnmW(uahW  
3P C'P2  
{ {<7!=@j  
r (Ab+1b  
public: +o)o4l%3  
E.kGBA;a?  
virtual ~Base() { cout<< "~Base" << endl ; } MH|!tkW>:  
ES72yh]  
}; FJl#NOp&  
i,>yIPBU!  
class Derived : public Base (C/2shr 8  
ON~jt[  
{ 9J% ~?k  
@ ]u nqCO  
public: c%Y%c2([  
!gv/jdF  
virtual ~Derived() { cout<< "~Derived" << endl ; } #)`N  
D2x-Wa  
}; o ohgZ&k2]  
-7)%J+5  
void main(void) 'r6s5 WC  
MKSiOM  
{ fvKb0cIx]  
]c,ttS _  
Base * pB = new Derived; // upcast Afi;s. ,  
C*kGB(H7  
delete pB; Iy8>9m'5  
!P7&{I,e  
} ,Z*Fo: q  
o|lEF+  
输出结果为: RYzDF+/  
D4%5T>^LW[  
~Derived o9-b!I2  
co<-gy/mCR  
~Base 47s<xQy  
wzhM/Lmo\z  
如果析构函数不为虚,那么输出结果为 :eqDEmr>  
\"BoTi'2!  
~Base Vrl)[st!;I  
;pu68N(B  
rnWU[U8%  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 "HTp1  
-.= q6N4  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
10+5=?,请输入中文答案:十五