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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别  &z*4Uij  
;9fWxH  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 _Gb 7n5p  
,1!Y!,xy  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 W np[8IEU  
X|g5tnsj`  
1cMdoQ  
二、头文件的作用 hBcklI  
Dp#27Yzc  
加强安全检测 s(s_v ?k  
}TuMMO4+  
通过头文件可能方便地调用库功能,而不必关心其实现方式 1rue+GL  
CN-4FI)1D9  
?}W#j  
三、* , &修饰符的位置 -;HZ!Lf  
C R't  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 Bd;EI)JT  
$:-C9N29  
yDe*-N\'W  
四、if语句 L"?4}U:  
L8zMzm=-  
不要将布尔变量与任何值进行比较,那会很容易出错的。 JJM!pD\h  
0|0IIgy  
整形变量必须要有类型相同的值进行比较 ,m7Z w_.  
9!2$?xqym  
浮点变量最好少比点,就算要比也要有值进行限制 -s le7k  
zH~g5xgh  
指针变量要和NULL进行比较,不要和布尔型和整形比较 Aq(,  
6"rS?>W/mO  
&?y|Pn  
五、const和#define的比较 |\"%Dy[m  
i*09m^r  
const有数据类型,#define没有数据类型 \Km+>G  
/z)8k4  
个别编译器中const可以进行调试,#define不可以进行调试 ,g|ht%"  
eUgKwu;  
在类中定义常量有两种方式 M3GFKWQI,`  
6OQ\f,h@  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; h4ghMBo%  
AI9=?X<kh  
2、 用枚举代替const常量。 -A:'D8o#f  
z|S4\Ae  
7-9HCP  
六、C++函数中值的传递方式  Bv%dy[I  
s <$*A;t  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) qe0ZM-C_  
'=(yh{W  
void fun(char c) //pass by value )D]LPCd[  
T0\[": A  
void fun(char *str) //pass by pointer Zyz)`>cB  
iq 8Hq)I]  
void fun(char &str) //pass by reference *s2 C+@ef  
1'k,P;s  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 =)Goip  
: :/vDUDc  
函数的类型不能省略,就算没有也要加个void y>g`R^^  
:ZM=P3QZ  
 3+M+5  
七、函数体中的指针或引用常量不能被返回 XR#?gx.}  
ty9(mtH+  
Char *func(void) (1Jc-`  
KDDx[]1Q  
{ 0=OvVU;P  
C$v !emu  
char str[]=”Hello Word”; o 7&q  
f_QZ ql  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 f{]W*!VV-  
GMob&0l8_  
return str; )f%Q7  
l~*d0E-$  
} Y3'dV)  
oYeFO w`  
函数体内的指针变量并不会随着函数的消亡而自动释放 2-"`%rE  
MPsm)jqX  
jSvo-  
八、一个内存拷贝函数的实现体 fEyc3K'5V  
h&b s`  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) *AYjMCo  
%Vsg4DRy  
{ o-]8)G>~M  
-9"[/  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); (i^<er q  
k,[[ CZ0j  
byte *pbTo=(byte*)pvTo; //防止地址被改变 8.' THLI  
`SYq/6$VEH  
byte *pbFrom=(byte*)pvFrom; 7)Bizlf  
6uWPIM;  
while (size-- >0) #j"N5e}U  
^c>ROpic  
pbTo++ = pbForm++; ogE|8`Tq^  
M j |"+(  
return pvTo; : DBJ2n  
8PW3x-+  
} sH)40QmO{  
]LSlo593  
I;?np  
九、内存的分配方式 mC`U"rlK~  
y@]:7  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 x[YW 3nF  
4p`z%U~=u  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 t-J\j"~%+  
dxWG+S  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 8d\/  
Oj.xJ(uX+v  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 TbhsOf!  
t3aDDu  
L>2gx$f  
十、内存分配的注意事项 4:XVu  
j|(bdTZY:  
用new或malloc分配内存时,必须要对此指针赋初值。 `[.4SIah  
G%fNGQwT  
用delete 或free释放内存后,必须要将指针指向NULL K db:Q0B  
^g N?Io  
不能修改指向常量的指针数据 _ ~E_#cNn  
0Y ld!L  
(k5d.E]CK  
十一、内容复制与比较 k|_LF[*Z  
^9*Jz{e  
//数组…… ?rububDT{  
nA XWbavY  
char a[]=”Hello Word!”; \EeK<)4:  
mF] 8  
char b[10]; ~C;gEE-  
2lBfc  
strcpy(b,a); Y>'t)PK  
iJ~e8l0CA  
if (strcmp(a,b)==0) Zk 9i}H  
x?-kt.M  
{} .&c!k1kH  
@RVj~J.A  
//指针…… Pt %EyFG  
CKRnkTTiV  
char a[]=”Hello Word!”; F%e5j9X`  
uze5u\  
char *p; Je;HAhL  
WEB enGQ  
p=new char[strlen(a)+1]; u69s}yZ  
*Mr'/qp,  
strcpy(p,a); TY *q[AWG  
&+F}$8,  
if (strcmp(p,a)==0) \"hP*DJ"  
1jQlwT(:  
{} eWAgYe2  
's6hCs&|NV  
I r;Z+}4>Y  
十二、sizeof的问题 m^ [VM&%  
S?LUSb  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 iQ_^MzA  
} {m.\O  
char a[]=”Hello World!” Z%O>|ozpq  
wDS(zG   
char *p=a; ( G#W6  
a$P$Ngi?S  
count<<sizeof(a)<<end; //12字节 |+(Hia,X  
^B7C8YP  
count<<sizeof(p)<<endl; //4字节 @c#M^:9Dc  
w `r)B`!g  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 1:d,8  
:s'hXo  
void fun(char a[1000]) ? ;)F_aHp  
.< /.(7  
{ 7`Bwo*Y  
tR% &.,2  
count<<sizeof(a)<<endl; //输出4而不是1000 i$W=5B>SO  
>4eZ%</D5  
} |9cSG),z  
/"OJ~e_%  
9\D0mjn=l  
十三、关于指针 n aB`@  
=5Auk 5&  
1、 指针创建时必须被初始化 H g;;>  
2w? 5vSv  
2、 指针在free 或delete后必须置为NULL OLM}en_L  
1brKs-z  
3、 指针的长度都为4字节 ZRo-=/1  
2k3yf_N  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 meNz0ve  
`d i/nv)  
char *p=new char[100]; BY^5z<^.  
O/2Jz  
strcpy(p,”Hello World”); p?zh4:\F+  
C1KO]e>  
delete []p; //注意前面的[]号 -$m?ShDd  
s.G6?1VXlY  
p=NULL; jW!)5(B[A  
1 |zy6  
5、数组指针的内容不能超过数组指针的最大容易。 5uufpvah  
!2Q>   
如: o|0QstSCl  
9F"Q2^l'  
char *p=new char[5]; `OmYz{*r  
L=WB'*N  
strcpy(p,”Hello World”); //报错 目标容易不够大 0al8%z9e@  
GcYT<pwN6  
delete []p; //注意前面的[]号 :Y;\1J<b1  
LQrm/)4bF5  
p=NULL; M,b^W:('4  
,HM~Zs  
GBsM?A:  
十四、关于malloc/free 和new /delete tug\X  
*X4$'LSx1  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 |]9Z#lv+I  
YKsc[~ h  
l 注意:malloc/free是库函数,new/delete是运算符 &,B91H*#  
Vz,2_QJ  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 hu+% X.F4  
lm;G8IP`  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 15^5y RXC  
CAD:ifV  
l 两者都必须要成对使用 X@n\~[.B  
j,/t<@S>  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 8fwM)DKS  
.xp|w^  
Ew kZzVuX  
十五、C++的特性 t846:Z%[  
a:3f>0_t  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 Ly$s0.!  
z.7'yJIP#  
重载和内联:即可用于全局函数,也可用于类的成员函数; )bG d++2  
h8MkfHH7{  
Const和Virtual:只可用于类的成员函数; ]XH}G9X^  
[o,S.!W8  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 )d|hIW]7(  
*t+E8)qL  
覆盖是指派生类函数覆盖基类函数 C8 b%r|^#  
=':,oz^|  
函数名相同; Kc:} Ky  
dn1Tu6f;|  
参数相同; pH1 9"=p<  
HjFY >(e  
基类函数必须有Virtual关键字; Hf'yRKACj  
>xt*(j&}  
不同的范围(派生类和基类)。 \#A=twp  
r2*'5jk_  
隐藏是指派生类屏蔽了基类的同名函数相同 K{&b "Ba1  
42m}c1R  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 Q b|.;_  
CXs i  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 h8yv:}XU*  
S}hg*mWn{$  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 nd] AvVS  
] cv|A^  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 0+\~^  
ew n/@;E  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 |UO1vA@  
2.K"+%  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: /e5Fx  
jnoFNIW   
将void Func(A a) 改为void Func(const A &a)。 a'v%bL;H~  
[i'\d}  
而void func(int a)就没必要改成void func(const int &a); DvuL1Me Ko  
zq5_&AeW  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 )^&)f!f  
B`4[@$  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 %-4e8d74/  
Yb|zE   
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 2Z-BZuK6p  
3o'SY@'W  
CDcs~PR@B  
十六、extern“C”有什么作用? h,@x5q>g  
Wb4%=2Qn  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 uxto:6),P<  
3\,TI`^C  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 Xm`K@hJ@  
JHf}LZu  
C%P"Ds=w0N  
十七、构造函数与析构函数 hfvs' .  
_e_]$G/TM  
派生类的构造函数应在初始化表里调用基类的构造函数; ?nFT51 t/4  
aNW&ib  
派生类和基类的析构函数应加Virtual关键字。 P-~Avb  
*TuoC5  
不要小看构造函数和析构函数,其实编起来还是不容易。 #oYX0wvl  
9tS& $-  
#include <iostream.h> >NwrJSx  
u%O^hcfb  
class Base fxLhVJ"b  
`,(1'  
{ LwUvM  
(D8'qx-M  
public: &-+&`h|s  
MjU>qx::  
virtual ~Base() { cout<< "~Base" << endl ; } {kJ[)7  
=*'X  
}; ftq~AF  
'q[V*4g  
class Derived : public Base 33\b@F7b  
`bZ_=UAb  
{ RWBmQg^]X  
>?e*;f$VdJ  
public: e_6 i896  
JoZC+G  
virtual ~Derived() { cout<< "~Derived" << endl ; } 0;TMwE  
,`|KN w5  
}; d*3R0Q|#{  
? =IbiT  
void main(void) -T{~m6  
vfhip"1  
{ Qb# S)[6s+  
V!KtF  
Base * pB = new Derived; // upcast y&__ 2t^u  
"_)   
delete pB; 3iWLo Qm  
c_^H;~^rL  
} nbpN+a%  
7<.f&1MgI  
输出结果为: =GR Em5  
'~ ]b;nA  
~Derived l!iB -?'u  
kd\yHI9A  
~Base g6W.Gl"5\w  
y+ :<  
如果析构函数不为虚,那么输出结果为 "E2 g7n&  
. ~|^du<X  
~Base 0t4i'??  
6-X7C9`C  
N&>D/Z;"  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 QW2% Gv:  
71/6=aq>n  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
欢迎提供真实交流,考虑发帖者的感受
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八