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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 ]n|Jc_Y  
2,q*[Kh1  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 [DM0'4  
^ U mYW  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 u>"0 >U  
K$M+"#./  
mvZ#FF1,J  
二、头文件的作用 *$vH]>)p  
*|dr-e_j  
加强安全检测 V9v20iX  
XhM!pSl\  
通过头文件可能方便地调用库功能,而不必关心其实现方式 TMj;NSc3  
I!S Eb  
yzhNl' Rz  
三、* , &修饰符的位置 DpgTm&}-  
BtC*]WB"_'  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 'q)g, 2B%  
/gZyl|kdy  
vNv!fkl  
四、if语句 '&![h7B  
~pQN#C)CO>  
不要将布尔变量与任何值进行比较,那会很容易出错的。 /qX?ca1_4^  
'V]&X.=zC  
整形变量必须要有类型相同的值进行比较 O[C4xq  
^E.L8  
浮点变量最好少比点,就算要比也要有值进行限制 !o /=,ZIx  
1Hr}n6s  
指针变量要和NULL进行比较,不要和布尔型和整形比较 22CET9iCe  
+ GI906K  
Q< :RLKVT  
五、const和#define的比较 R{H[< s+n  
e(? w h   
const有数据类型,#define没有数据类型 K@O^\  
'f-r 6'_ZX  
个别编译器中const可以进行调试,#define不可以进行调试 06S R74  
~Ba=nn8Cq  
在类中定义常量有两种方式 W}CM;~*L  
xmvE*q"9]  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; x)~i`$  
h= sNj  
2、 用枚举代替const常量。 wfmM`4Y   
Cf2WBX$  
"r-P[EKpL  
六、C++函数中值的传递方式 2jFuF71  
u S1O-Q>  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) }xk(aM_  
3#>W\_FY*D  
void fun(char c) //pass by value  oBkhb  
sE pI)9  
void fun(char *str) //pass by pointer !ajBZ>Q  
`5IrV&a  
void fun(char &str) //pass by reference i41~-?Bc  
OM*c7&  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 y?<KN0j  
Tnp P'  
函数的类型不能省略,就算没有也要加个void Qq<@;4  
gc.Lh~  
#J"xByQKK  
七、函数体中的指针或引用常量不能被返回 c1yRy|  
I,{YxY[$7  
Char *func(void) SO$Af!S:bB  
LjI`$r.B  
{ X8$i*#D  
.:$(o&  
char str[]=”Hello Word”; 8W\yM;'  
_}R[mr/  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 4dX{an]Cz  
X7},|cmD_  
return str; mM,HMrgLqK  
q>$MqKWM  
} 51jgx,-|$  
KewW8H~tb  
函数体内的指针变量并不会随着函数的消亡而自动释放 X4 Arn,  
AE0uBv  
r)*23&Ojs  
八、一个内存拷贝函数的实现体 fMUcVTFe  
lG7PM^Eb  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) =,6H2ew  
MiT0!6Pg  
{ SYCL\b   
-& 1(~7  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); D.K""*ula  
\MP~}t}c  
byte *pbTo=(byte*)pvTo; //防止地址被改变 W [ l  
.XJ'2yKof  
byte *pbFrom=(byte*)pvFrom; 7n7Xyb  
)+G"57p  
while (size-- >0) vMTf^V  
Q(bOar5  
pbTo++ = pbForm++; {R}F4k  
DB/~Z  
return pvTo; mmTpF]t ?`  
4q}+8F`0F  
} @J[@Pu O  
:@((' X(".  
gP2zDI   
九、内存的分配方式 tT}b_r7h(1  
jn<?,UABD  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 uX_H;,n  
w% %q/![uy  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ~g{j)"1  
*~vB6V|1  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 Er;/ zxg9p  
l0qaTpn  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 1Bj.MQ^  
 /8x';hQ  
$1yO Zp5  
十、内存分配的注意事项 lsz3'!%Y)  
Rx-\B$G  
用new或malloc分配内存时,必须要对此指针赋初值。 fN&,.UB^p  
e^y9Kmd  
用delete 或free释放内存后,必须要将指针指向NULL m2PUU/8B/  
uo#1^`P  
不能修改指向常量的指针数据 J(7#yg%5  
!oWB5x~:P  
daE.y_9y  
十一、内容复制与比较 p='j/=  
$}9jv3>)  
//数组…… 6'^_*n  
9@ k8$@  
char a[]=”Hello Word!”; ]o6 ZZK  
vqm|D&HU  
char b[10]; vpQ&vJfR  
TeHJj`rdAU  
strcpy(b,a); O~3 A>j  
u{sHuVl  
if (strcmp(a,b)==0) i2=- su  
W/Dd7 G#IC  
{} GG%b"d-  
"#1\uoH  
//指针…… orGMzC2  
={g)[:(C.  
char a[]=”Hello Word!”; }Fe6L;^;  
@{Rb]d?&F?  
char *p; 3~>-A=  
@j!,8JQEd  
p=new char[strlen(a)+1]; eh86-tQI~(  
CMj =4e  
strcpy(p,a); ,'8%'xit  
8 v/H;65  
if (strcmp(p,a)==0) tFmB`*!%  
W A/dt2D|  
{} A@A8xn%  
hA7=:LG  
;ku>_sG-  
十二、sizeof的问题 5YY5t^T  
:""HyjY!  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 \5ls <=S.  
n7t}G'*Y!^  
char a[]=”Hello World!” _.5{vGyxr  
nBy-/BU&  
char *p=a; E'08'8y  
JipNI8\r  
count<<sizeof(a)<<end; //12字节 %3z[;&*3O  
Rl?1|$%  
count<<sizeof(p)<<endl; //4字节 .9J^\%JD  
-CvmZ:n  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 dbf<k%i6  
<V?2;Gy  
void fun(char a[1000]) _2fW/U54_  
CI W4E  
{ 6.@.k  
p6DI7<C<H  
count<<sizeof(a)<<endl; //输出4而不是1000 };Q}C0E  
cMT7Bd  
} cYSn   
=H{<}>W'  
m$vq %[/#  
十三、关于指针 x-%O1frc  
MBWoPK  
1、 指针创建时必须被初始化 b}! cEJY  
"wcaJ;Os  
2、 指针在free 或delete后必须置为NULL +~8Lc'0aA  
8eXe b|?J  
3、 指针的长度都为4字节 XGa8tI[:X  
q5f QTV  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ]#o;`5'  
R"cQyG4  
char *p=new char[100]; iOiF kka  
6n9/`D!  
strcpy(p,”Hello World”); 4|x _C-@  
t&?jJ7 (&8  
delete []p; //注意前面的[]号 |` T7}U  
-.D?Z8e  
p=NULL; MJ}{Q1|*  
FL mD?nw  
5、数组指针的内容不能超过数组指针的最大容易。 v5[gFY(?  
Vn#}f=u\  
如: Ed=/w6<  
\K$\-]N+  
char *p=new char[5]; ;\pr05  
;[y( 14g  
strcpy(p,”Hello World”); //报错 目标容易不够大 gj^)T_E_  
F_@B ` ,  
delete []p; //注意前面的[]号 EQyX!  
nCYz ];".  
p=NULL; hz/mNDE]  
U$y 9f  
G&oD;NY@/  
十四、关于malloc/free 和new /delete Oo|JIr7i  
b7.7@Ly y  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 Ii0\Skb  
B^2r4 9vC  
l 注意:malloc/free是库函数,new/delete是运算符 u62H+'k}F  
-Q? i16pM  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 }?2X q  
\(Ma>E4PNU  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 @X/ 1`Mp  
@qNY"c%HV  
l 两者都必须要成对使用 3@~a)E}T  
ilL%  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 bF _]j/  
^Gk)aX  
F_079~bJ  
十五、C++的特性 =z. hJu  
aE0R{yupZ  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 |k}<Zz1UM  
8g -u  
重载和内联:即可用于全局函数,也可用于类的成员函数; 4)iP%%JH  
%pVsafV  
Const和Virtual:只可用于类的成员函数; 0moAmfc  
d/  Lz"  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 5( <O?#P  
{IOc'W-C#2  
覆盖是指派生类函数覆盖基类函数 3eY>LWx  
'xS@cF o(  
函数名相同; .>W [  
R+!U.:-yz  
参数相同; zY/Oh9`=v  
xd{.\!q.  
基类函数必须有Virtual关键字; i ;B^I8  
5WI bnV@  
不同的范围(派生类和基类)。 d>[i*u,]/  
O _9r-Zt^  
隐藏是指派生类屏蔽了基类的同名函数相同 "rMfe>;FJ  
\PS]c9@,rc  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 `R0~mx&6G  
<lzC|>BG  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 OV{v6,>O  
:2j`NyLI.  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 82FEl~,^E  
3w^W6hN)  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 QPm[4Fd{G  
(rFkXK4^J  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 faOiNR7;h  
4A+g-{d  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 4D&L]eJ  
H!Gw@u]E  
将void Func(A a) 改为void Func(const A &a)。 $7YZ;=~B  
gw)z*3]~s  
而void func(int a)就没必要改成void func(const int &a); |mMsU,*gB  
R+.4|1p  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 k2Cq9kQq  
XoD:gf  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 >r`O@`^U  
2#NnA3l]x%  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; yr'-;-u  
Xc[ym  
IhzY7U)}T  
十六、extern“C”有什么作用? #pZeGI|'J  
_1)n_P4  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 A@o7  
YC;@^  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 \JPMGcL  
& &CrF~  
_wXT9`|3  
十七、构造函数与析构函数 ,q%X`F rc  
0WzoI2Q  
派生类的构造函数应在初始化表里调用基类的构造函数; 8b0j rt  
L:C/PnIV  
派生类和基类的析构函数应加Virtual关键字。 d"5_x]Z;  
MR|A_e^x  
不要小看构造函数和析构函数,其实编起来还是不容易。 t,LK92?  
&n,v@ gt  
#include <iostream.h> XR",.3LD  
Pfs_tu  
class Base yW?-Z[  
MgP|'H3\  
{ P, ZQ*Ju  
oaha5aWH  
public: >3&  
O-[YU%K3?  
virtual ~Base() { cout<< "~Base" << endl ; } F3V:B.C  
F4~ OsgZ'N  
}; cAN8'S(s1  
UG44 oKB  
class Derived : public Base .WSn Y71  
.oM- A\!  
{ Tp@Yn  
P'iX?+*  
public: g@x72$j  
vE`;1UA}  
virtual ~Derived() { cout<< "~Derived" << endl ; } 0Gj/yra9MO  
a1_ N~4r`  
}; ()j)}F#Z`  
,X|FyO(p  
void main(void) \4qF3#  
rmBzLZ}  
{ 47Vt8oyh%  
#IGcQY  
Base * pB = new Derived; // upcast M &-p  
K?M~x&Q  
delete pB; !^Ay !  
oeKl\cgFx  
} u gRyUny  
Q~"Lyy8  
输出结果为: -N/n|{+F  
DNj<:Pdd)  
~Derived +)h# !/  
zEQQ4)mA  
~Base rhzI*nwOT  
k6DJ(.n'%a  
如果析构函数不为虚,那么输出结果为 !!A(A^s  
|H=5Am  
~Base n[y=DdiKGS  
?lqqu#;8  
uFmpc7  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 T-n>+G{  
~YNzSkz  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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