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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 >Hd!o"I  
NQN?CBFQ  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 r6nWrO>y  
V@`%k]k  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 ];u nR<H  
_A=i2?g  
*(sv5c!0M8  
二、头文件的作用 ) gxN' z  
XMLl>w2z  
加强安全检测 - P4X@s_;  
5&]a8p{  
通过头文件可能方便地调用库功能,而不必关心其实现方式 d\tA1&k71  
EEHTlqvR  
$;)A:*e  
三、* , &修饰符的位置 0u I=8j  
/@",5U#  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ~le:4qaX  
880T'5}S :  
u>V~:q\X  
四、if语句 Qn/ 6gRLj  
v\5`n@}4  
不要将布尔变量与任何值进行比较,那会很容易出错的。 [MeFj!(  
cY|@s?3NND  
整形变量必须要有类型相同的值进行比较 z AY -Y  
E .CG  
浮点变量最好少比点,就算要比也要有值进行限制 6Zv-kG  
e`?o`@vO,  
指针变量要和NULL进行比较,不要和布尔型和整形比较 {G=|fgz  
?%b#FXA  
=r~ExW}+  
五、const和#define的比较 x, 'KI?TyQ  
|doG}C  
const有数据类型,#define没有数据类型 35fj-J$8  
2>xEE  
个别编译器中const可以进行调试,#define不可以进行调试 H$6;{IUz~  
|sAl k,8s  
在类中定义常量有两种方式 !@FzP@  
X6r3$2!  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; ,oJ$m$(Lj  
F2Mxcs* M  
2、 用枚举代替const常量。 H)X&5E  
 y`pgJO  
t1!>EI`  
六、C++函数中值的传递方式 kU{a!ca4  
`_3 Gb  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) ?4_ME3$t  
$WsyAUl  
void fun(char c) //pass by value 3k:`7E.  
t24.u+O  
void fun(char *str) //pass by pointer W O'nW  
QF$s([  
void fun(char &str) //pass by reference c']m5q39'  
:{ai w?1  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 +O7GgySx  
<#)Q.P  
函数的类型不能省略,就算没有也要加个void g!`^!Q/($  
sLc,Dx"+  
$IJ"fs  
七、函数体中的指针或引用常量不能被返回 v `;Hd8  
H^jcWwy:  
Char *func(void) Lv>OBHD  
pzT`.#N:M  
{ @/='BVb'T  
[*r=u[67F  
char str[]=”Hello Word”; cEGR?4z  
<_SdW 5BF<  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 <lRjh7  
)~ ^`[`  
return str; {3``B#}  
j 5bHzcv  
}  4Gj  
Fh}GJE   
函数体内的指针变量并不会随着函数的消亡而自动释放 )c<[@ ::i  
QvlV jDIy  
yL23 Nqe  
八、一个内存拷贝函数的实现体 j/1 f|x  
z -'e<v;w  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) /lc4oXG8  
tV2o9!N4  
{ /#[mV(k  
(Y  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); RAA,%rRhu(  
AH^ud*3F  
byte *pbTo=(byte*)pvTo; //防止地址被改变 IB^vEY!`6_  
jM>;l6l  
byte *pbFrom=(byte*)pvFrom; qCm8R@  
n9V8A[QJ  
while (size-- >0) 5e^z]j1Yv  
5a:YzQ4  
pbTo++ = pbForm++; FaKZ|~Y e  
<'~6L#>,<  
return pvTo; )g ?'Nz  
Z OqD.=O(  
} LRSt >; M  
&jh17y  
)4n]n:FjN  
九、内存的分配方式 {]O.?Yru?  
U/-|hfh  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 fbJa$  
Eg1|Kg\&  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 )IKqO:@  
!#S"[q  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 HC| ]Au  
w]US-7  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 "j=E8Dd}  
e]V7 7oc  
-9R.mG  
十、内存分配的注意事项 e+y%M  
w^[:wzF0  
用new或malloc分配内存时,必须要对此指针赋初值。 '_" S/X +v  
U}GO* +  
用delete 或free释放内存后,必须要将指针指向NULL [+qB^6I+P%  
l=47#zbpZ]  
不能修改指向常量的指针数据 sRflabl *x  
_Bhd@S!  
=P,pW  
十一、内容复制与比较 Kn}Y7B{  
pAyUQe;X#  
//数组…… R4S))EHg  
UK .=Y9  
char a[]=”Hello Word!”;  }S}%4c>  
jm[f|4\  
char b[10]; YOtzj a]~  
eH%i8a  
strcpy(b,a); F`.W 9H3  
6df`]s c  
if (strcmp(a,b)==0) o}yA{<"  
|oR#j `  
{} vhN6_XD  
.GvZv>  
//指针…… e<"sZK  
3(1UI u  
char a[]=”Hello Word!”; 4hW:c0  
tD]vx`0>  
char *p; LftzW{>gI"  
5?TX.h9B4  
p=new char[strlen(a)+1]; )9+H[  
E>F6!qYm  
strcpy(p,a); peVzF'F  
#/)U0 IR)  
if (strcmp(p,a)==0) r<'B\.#tp>  
)a$sx}  
{} H:o=gP60]  
/km0[M  
L tK,_j  
十二、sizeof的问题 7+rroCr"  
$^W|@et{ ]  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 [V0%=q+R  
TrBtTqH)  
char a[]=”Hello World!” v5.KCc}"  
5E2T*EXSh  
char *p=a; * K0aR!  
2 y& k  
count<<sizeof(a)<<end; //12字节 f5'vjWJ30  
N'?#g`*KW  
count<<sizeof(p)<<endl; //4字节 ~2QD.(  
hjp,v)#  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 `r0MQkk  
&& WEBQ  
void fun(char a[1000]) r`PD}6\  
\_/dfmlIZ  
{ MFqb_q+  
3*oZol/  
count<<sizeof(a)<<endl; //输出4而不是1000 m4G))||9Q  
K^%ONultv  
} *++}ll6  
![m6$G{y  
ephvvj~zW4  
十三、关于指针 &Vg)/t;  
!Za yN  
1、 指针创建时必须被初始化 P#AS")Sj  
HcHwvf6y  
2、 指针在free 或delete后必须置为NULL {ApjOIxk  
H2CpZK'  
3、 指针的长度都为4字节 V|pO";%>,  
MkM`)g 5  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 #X0Y8:vj  
5zH_yZ@+  
char *p=new char[100]; Om2w+yU  
66scBi_d  
strcpy(p,”Hello World”); ~FnY'F<35  
`Yyi;!+0  
delete []p; //注意前面的[]号  `dIwBfg_  
aX.//T:':?  
p=NULL; tQ`|MO&o  
,j eC7-tX  
5、数组指针的内容不能超过数组指针的最大容易。 (ZQ?1Qxo  
2W;2._  
如: c=p!2jJ1K~  
LVJn2t^  
char *p=new char[5]; ccy q~  
@E=77Jn[px  
strcpy(p,”Hello World”); //报错 目标容易不够大 RT[ E$H  
E*QLw* H  
delete []p; //注意前面的[]号 SxL/]jWR7  
:13u{5:th  
p=NULL; @R;&PR#5  
18> v\Hi<  
K8h\T4  
十四、关于malloc/free 和new /delete ]qiX"<s>~C  
F:LrQu  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 igF<].'V  
2FR 5RG oD  
l 注意:malloc/free是库函数,new/delete是运算符 gN[^ ,u  
H"wIa8A  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 %.;;itB  
^t,haO4  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 ]aYuBoj  
WpC9(AX5g  
l 两者都必须要成对使用 q<4{&omUJ  
S(_DR 8  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 EEiWIf&S,  
'AZxR4W  
 J {$c|  
十五、C++的特性 kT:?1w'  
Tb{RQ?Nw'  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 </W"e!?X  
@%r "7%tq>  
重载和内联:即可用于全局函数,也可用于类的成员函数; T `o[whr  
~gg&G~ ET  
Const和Virtual:只可用于类的成员函数; }U|Vpgd!  
mBQpf/PG  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 54oJ MW9  
Nf}i /  
覆盖是指派生类函数覆盖基类函数 }Zfi/^0U  
L),bP fz  
函数名相同; T2|os{U  
T/jxsIt3  
参数相同; ?h,.1Tb  
GF*uDJ Kp  
基类函数必须有Virtual关键字; hbs /S  
hd)WdGJp  
不同的范围(派生类和基类)。 DkW^gt  
\+k~p:d_8  
隐藏是指派生类屏蔽了基类的同名函数相同 xp*d:  
=)J<R;  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 fP llN8n  
{8,_[?H  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 ulfs Z:  
*T:jR  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 m",G;VN  
?5wsgP^  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 .p(r|5(b  
WZ UeW*#=  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 oslj<  
QRwOv  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: im F,8'  
6rlvSdB  
将void Func(A a) 改为void Func(const A &a)。 ]hZk #rp}  
bb$1zSA  
而void func(int a)就没必要改成void func(const int &a); E CPSE {  
,Qj\_vr@  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 8#HQ05q>  
n2Q ?sV;m  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 x!u6LDq0  
e1hf{:&/G@  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; ,Bj]j -\Y  
\!*F:v0g^  
 &%T*sR  
十六、extern“C”有什么作用? juxAyds  
qos/pm$&i  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 ~w(A3I.  
W >|'4y)  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 !$<Kp6  
o5G]|JM_  
*p|->p6,u  
十七、构造函数与析构函数 S KGnx  
#hXuGBZEI  
派生类的构造函数应在初始化表里调用基类的构造函数; !04 ^E  
}&%&0$%  
派生类和基类的析构函数应加Virtual关键字。 |*L/ m0'L  
WN o+%  
不要小看构造函数和析构函数,其实编起来还是不容易。 &iT^IkA{  
&uI33=   
#include <iostream.h> 4v2JrC;  
5Hs !s+  
class Base 1;vwreJ  
?i}wm`  
{ *=77|Dba  
s:I 8~Cc  
public: JC}T*h>Ee  
6mjD@  
virtual ~Base() { cout<< "~Base" << endl ; } `0-i>>  
5'_:>0}  
}; kqGydGh*"  
0UQ DB5u  
class Derived : public Base m`jGBSlw_  
l I2UpfkBP  
{ _,w*Rv5=  
FPEab69  
public: Ad4-aWH  
^$<:~qq !  
virtual ~Derived() { cout<< "~Derived" << endl ; } }{v0}-~@  
S4OOm[8  
}; J$-1odL0Z  
jI$7vmO  
void main(void) nyOvB#f  
!RN9wXS7  
{ o@YEd d  
U[:Js@uH_  
Base * pB = new Derived; // upcast Kc+9n%sp  
-#g0  
delete pB; Ef=4yH?\j  
>Fc=F#tA9  
} {7Kl #b  
Zm#,Ike?#  
输出结果为: '@"A{mrE  
<XzRRCYQ  
~Derived +:u &]  
NSQ)lSW,;  
~Base oOGFg3X  
FQcm =d_s  
如果析构函数不为虚,那么输出结果为 Z-aB[hE  
~-~iCIaTb  
~Base (AHTv8  
!@> :k3DC&  
1119YeL  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 Po.izE!C  
P+,YWp  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八