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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 PYiO l  
DJb9] ,=a  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 )lU9\"?o  
@^.o8+Pp  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 DN;|?oNZ  
]Q#k"Je  
E?FUr?-[  
二、头文件的作用 *)L~1;7j>  
PsM8J  
加强安全检测 3qkPe_<I  
Z~] G+(  
通过头文件可能方便地调用库功能,而不必关心其实现方式 srhI%Zj  
dVSQG947i:  
Pq, iR J  
三、* , &修饰符的位置 {dYz|O<  
$;rvKco)%  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 W[:CCCDL  
c{j)beaS  
uann'ho?q  
四、if语句 * !9=?  
L=dQ,yA  
不要将布尔变量与任何值进行比较,那会很容易出错的。 F#^/=AR'  
2B"tT"f  
整形变量必须要有类型相同的值进行比较 *j<{3$6Ii  
?}U?Q7vx@@  
浮点变量最好少比点,就算要比也要有值进行限制 M'VJE|+t  
Z^Yy sf  
指针变量要和NULL进行比较,不要和布尔型和整形比较 n&2OfBJ  
tgj 5l#P  
LIll@2[  
五、const和#define的比较 F!g;}_s9  
P$.$M}rMv  
const有数据类型,#define没有数据类型 &crR nv ?  
K >Q 6  
个别编译器中const可以进行调试,#define不可以进行调试 OAaLCpRp  
Dq-[b+bm  
在类中定义常量有两种方式 &W3Hj$>  
Wm4C(y@  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; &Im-@rV!  
)J?8"+_Y  
2、 用枚举代替const常量。 ]X> I(p@  
BO2s(8  
,H_d#Koa.  
六、C++函数中值的传递方式 rX0 ?m:&m  
R'pfA B|!  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) M+I9k;N6&  
,/&|:PkS  
void fun(char c) //pass by value JNo[<SZb  
^<_rE-k  
void fun(char *str) //pass by pointer mkq246<D~  
mWU d-|Ul  
void fun(char &str) //pass by reference h]vEXWpG]  
J%lrXm(l{  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 ^r,0aNzAs  
97/ 4J  
函数的类型不能省略,就算没有也要加个void EQQ@nW{;  
xd\ml 37~  
L)qUBp@MW  
七、函数体中的指针或引用常量不能被返回 }a;H2&bu  
egAYJK-,!  
Char *func(void) qcC(#0A>  
z<%dWz  
{ "ruYMSpU  
3 2"f'{  
char str[]=”Hello Word”; T[<554  
raZkH8  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 _5S||TuNS  
G7i0P j  
return str; N)PkE>%X  
9z`72(  
} {y B0JL}n  
]L2b|a3  
函数体内的指针变量并不会随着函数的消亡而自动释放 !MVf(y$  
x.$cP  
eJ6 #x$I,  
八、一个内存拷贝函数的实现体 >f4[OBc  
i(;.Y  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 6uTC2ka[&R  
%`~+^{Wp  
{ x4h.WDT$  
G9Noch9 g  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); 4Dy1M}7  
@R<z=n"  
byte *pbTo=(byte*)pvTo; //防止地址被改变 W.%p{wB |  
8llXpe  
byte *pbFrom=(byte*)pvFrom; NwdrJw9  
XpYd|BvW  
while (size-- >0) e.^?hwl  
K4]#X"  
pbTo++ = pbForm++; x!7r7|iV  
fg lN_  
return pvTo; L2_[M'  
Q}cti /  
} lEw;X78+  
|~#A?mK-  
+43~4_Oj  
九、内存的分配方式 ^Ku]8/ga  
l`uMtv/Wp  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 yo(MJ^=d  
X|&H2y|*7  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 YWJ$Pp  
"ZPgl 8  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 0FLCN!i1  
"?kDR1=7A  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 w`D$W&3>  
r)Vpt fg;  
|KZX_4   
十、内存分配的注意事项 MK1#^9Zr  
5;G0$M0  
用new或malloc分配内存时,必须要对此指针赋初值。 X&h?1lMJ /  
PVIZ Y^64  
用delete 或free释放内存后,必须要将指针指向NULL q[+ h ~)  
G B,O  
不能修改指向常量的指针数据 ti$60Up  
;nJ2i?"  
NpCQ4 K  
十一、内容复制与比较 H:OpS-b  
s5 {B1e  
//数组…… 8B]\;m  
J"@X>n  
char a[]=”Hello Word!”; ';!-a] N  
}p-/R'  
char b[10]; :>Bk^"  
ZJ~0o2xZ'  
strcpy(b,a); .z=%3p8+  
V;^N:I\js  
if (strcmp(a,b)==0) FFcIOn  
+'+ Nr<  
{} CrSBN~  
N-t"CBTO  
//指针…… N=7iQ@{1   
]N;n q  
char a[]=”Hello Word!”; mq:WBSsV  
US=K}B=g  
char *p; )Vrp<"v  
` AD}6O+x  
p=new char[strlen(a)+1]; edCVIY'1  
%IE;'aa }  
strcpy(p,a); B2*7H  
Ke3~o"IQ  
if (strcmp(p,a)==0) GU9G5S.  
u!HX`~q+A  
{} (+0(A777M  
zg@i7T  
J#F HR/zV  
十二、sizeof的问题 ;MK|l,aIQ  
CE!cZZ  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 >,tJq %  
bfEH>pQ>#  
char a[]=”Hello World!” KATf9-Sz  
A.@wGy4  
char *p=a; _cC1u7U9  
1 0.Z Bfn  
count<<sizeof(a)<<end; //12字节 $E[M[1j  
AWPgrv/  
count<<sizeof(p)<<endl; //4字节 ]=ZPSLuEm%  
'h 7x@[|  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 ,3c25.,*  
/er{sKVX<  
void fun(char a[1000]) -3 ANNj  
k3e6y  
{ 7E#h(bt j  
^i2>Ax&T  
count<<sizeof(a)<<endl; //输出4而不是1000 EVBOubV  
F|y0q:U  
} 'Z=_zG/RX  
vM]5IHqeE  
c HR*.  
十三、关于指针 p&u\gSo  
=cb!2%?}  
1、 指针创建时必须被初始化 Y2'HP)tfIw  
rBU)@IpDG  
2、 指针在free 或delete后必须置为NULL e=p_qhBt  
N 3O!8A_  
3、 指针的长度都为4字节 _?y3&4N)  
|Kjfh};-C  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 8B-mZFXpK  
Cg%Owe/E?0  
char *p=new char[100]; ki}Li*)7  
<P ?gP1_zi  
strcpy(p,”Hello World”); kOdpW  
kP/<S<h,g  
delete []p; //注意前面的[]号 &cTOrG  
?u;m ],w!  
p=NULL; ujN~l_ 4  
v _:KqdmO]  
5、数组指针的内容不能超过数组指针的最大容易。 ?b'(39fj  
`8#xO{B1  
如: S 1^t;{"  
g.blDOmlc  
char *p=new char[5]; KHx;r@{<  
O"kb*//  
strcpy(p,”Hello World”); //报错 目标容易不够大 ZR0 OqSp]  
'vu]b#l3  
delete []p; //注意前面的[]号 ZZwIB3sNhf  
J%B/(v`  
p=NULL; V@s93kh  
,)!%^ ~v  
ntB#2S  
十四、关于malloc/free 和new /delete ,quUGS  
BFP@Yn~k  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 {oF;ZM'r  
Vr"'O6  
l 注意:malloc/free是库函数,new/delete是运算符 ^+-]V9?+  
5-k gGOt  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 _ W#Km  
&iq'V*+-\  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 WA1yA*S  
\ZhkOl  
l 两者都必须要成对使用 $Q}L*4?]  
ahZ@4v  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 lKU{jWA  
`#85r{c$:  
n9 FA` e  
十五、C++的特性 7\$b%A  
cyP+a  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 xh CQ Rw  
uPN^o.,/.  
重载和内联:即可用于全局函数,也可用于类的成员函数; I![/bwObG  
m@*aA}69  
Const和Virtual:只可用于类的成员函数; e]ST0J"  
TOgH~R=  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 8tf>G(I{  
]]`[tVaFr  
覆盖是指派生类函数覆盖基类函数 ;14Q@yrZ0  
fhR u-  
函数名相同; (E 8jkc  
"}%j'  
参数相同; #nft{AN  
-kP2Brm  
基类函数必须有Virtual关键字; x*tCm8`{  
.YH#+T'  
不同的范围(派生类和基类)。 {|j-e{*  
w)qmq  
隐藏是指派生类屏蔽了基类的同名函数相同 38l:Y"  
 &z*4Uij  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 sAs`O@  
>b#CR/^z  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 X}h}3+V  
fpjFO&ML  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 qC& xuu|  
hBcklI  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 E5|GP  
s(s_v ?k  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 y,KZp2 j  
1rue+GL  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: CN-4FI)1D9  
;Z;` BGZJ  
将void Func(A a) 改为void Func(const A &a)。 -;HZ!Lf  
C R't  
而void func(int a)就没必要改成void func(const int &a); Bd;EI)JT  
$:-C9N29  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 ,,IK}  
L"?4}U:  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 L8zMzm=-  
x 2l}$(7  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 0|0IIgy  
Dk")/ ib  
j E5=e</  
十六、extern“C”有什么作用? nSZp,?^  
c$u#U~~  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 0lcwc"_DZX  
LS# _K-  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 #L*MMC"  
[5M!'  
VzcW9'"#  
十七、构造函数与析构函数 /z)8k4  
,g|ht%"  
派生类的构造函数应在初始化表里调用基类的构造函数; U}=H1f,  
M3GFKWQI,`  
派生类和基类的析构函数应加Virtual关键字。 6OQ\f,h@  
(f#{<^gd  
不要小看构造函数和析构函数,其实编起来还是不容易。 )^ )|b5,  
;D4 bxz0ou  
#include <iostream.h> (V/! 0Lj  
I3l1 _  
class Base bOV]!)o  
Nii5},  
{ Ur""&@  
z!~{3M  
public: }y*rO(cu7G  
9~iDL|0'~  
virtual ~Base() { cout<< "~Base" << endl ; } 5:EE%(g9  
0d`lugf  
}; aKRnj!4z  
#X5Tt  ;  
class Derived : public Base N$ 2Iz  
vDc&m  
{ [{ A5BE -  
q'biTn]2  
public: 1gYvp9Ma  
:ZM=P3QZ  
virtual ~Derived() { cout<< "~Derived" << endl ; } @Hp=xC9V  
+ J}h  
}; #so"p<7 R  
J+hifO  
void main(void) zKG]7  
gvP.\,U  
{ ^c sOXP=Yp  
8{CBWXo$)  
Base * pB = new Derived; // upcast IF?  
HNfd[#gV  
delete pB; J'lqHf$T  
)f%Q7  
} S8]YS@@D   
Y3'dV)  
输出结果为: oYeFO w`  
2-"`%rE  
~Derived MPsm)jqX  
jSvo-  
~Base fEyc3K'5V  
h&b s`  
如果析构函数不为虚,那么输出结果为 $[(FCS  
;, u7)  
~Base %Vsg4DRy  
?T[K{t;~jo  
M;@/697G  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 `{J(S'a`  
Xkp`1UTH  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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