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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 c9H6\&  
(oiQ5s^f  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 '#A_KHD  
9BOn8p;yz  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 p79QEIbk=  
(@T{ [\  
5R.jhYAj  
二、头文件的作用 Ro$*bN6p  
G1X73qoHT<  
加强安全检测 )qX.!&|I  
yAGQD[ih  
通过头文件可能方便地调用库功能,而不必关心其实现方式 =?Co<972Z  
Q!-"5P X  
 1l}Am>}  
三、* , &修饰符的位置 DZESvIES  
~<IQe-Q 5  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 yp]vDm  
CPsl/.$tC  
 nmL|v  
四、if语句 -*&aE~Cs  
M4 ?>x[Pw  
不要将布尔变量与任何值进行比较,那会很容易出错的。 nRq[il0 `i  
Xq"9TYf$  
整形变量必须要有类型相同的值进行比较 V=1yg24B<  
Y -BZV |  
浮点变量最好少比点,就算要比也要有值进行限制 KvPLA{  
H^B,b !5i  
指针变量要和NULL进行比较,不要和布尔型和整形比较 xV`)?hEXFh  
hms Aim9i  
"{S4YA  
五、const和#define的比较 *.$ov<E.  
"_dJ4<8  
const有数据类型,#define没有数据类型 gi:M=  
 5B1,,8P  
个别编译器中const可以进行调试,#define不可以进行调试 CucW84H`J  
qoph#\  
在类中定义常量有两种方式 4,)QV_?  
# NK{]H$fd  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; iRW5*-66f  
HF&d HD2f  
2、 用枚举代替const常量。 i)'u!V  
TFbF^Kd#:d  
`"~X1;  
六、C++函数中值的传递方式 7|J&fc5BP  
ex|)3|J  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) a(JtGjTf&  
y </i1qM  
void fun(char c) //pass by value ~d3BVKP5  
#N=_-  
void fun(char *str) //pass by pointer 2gvS`+<TP  
4Im}!q5;:<  
void fun(char &str) //pass by reference )OlYz!#?  
H?ue!5R#L  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 (a,`Y.  
Xn!=/<TIVz  
函数的类型不能省略,就算没有也要加个void &$qIJvMiK  
]/R>nT  
*D7oHwDU  
七、函数体中的指针或引用常量不能被返回 D* HK[_5  
>X>]QMfh  
Char *func(void) @X/-p3729  
[ifQLsHA  
{ OWN|W,  
%z @T /  
char str[]=”Hello Word”; A}"uEk(R  
oY@]&A^ah  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 m1p% ,  
hB:+_[=Kj.  
return str; G<*h,'B  
,=%c e  
} [h\_yU[ P  
FQJFq6l  
函数体内的指针变量并不会随着函数的消亡而自动释放 2NL|_W/  
d?CU+=A&|  
DEv,!8  
八、一个内存拷贝函数的实现体 }u5J<*:bZ  
7w0=i Z>K  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) ,.gI'YPQC  
!\&4,l(  
{ H/G;hk  
z8};(I>)  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); i)ibDrX!I  
J2`OJsMwWe  
byte *pbTo=(byte*)pvTo; //防止地址被改变 +A_jm!tJS(  
1@<>GDB9  
byte *pbFrom=(byte*)pvFrom; .9!&x0;  
*EtC4sP  
while (size-- >0) Gg7ZSB 7  
=\<!kJ\yH  
pbTo++ = pbForm++; OBPiLCq  
*41WZE  
return pvTo; 5bWy=Xk B  
1T3YFt@&I  
} XoiZ"zE  
0ENqK2  
AkqGk5e ^  
九、内存的分配方式 #|e5i9l*B  
1Imb"E  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 0*u X2*  
JDMsco+j5  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 Od]wh  
sy9YdPPE  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 Y9(BxDP_+Y  
ewinG-hX_  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 *-_joAWTG  
IG@@CH  
|VoYFoiQ  
十、内存分配的注意事项 =u&NdMy  
W!Rr_'yFe)  
用new或malloc分配内存时,必须要对此指针赋初值。 7.v{=UP  
~HgN'#Y?  
用delete 或free释放内存后,必须要将指针指向NULL `VOLw*Ci  
]JHY(H2|  
不能修改指向常量的指针数据 VzFzVeJ  
dU"C=c(w\  
m9m~2   
十一、内容复制与比较 z;i4F.p  
-IS?8\ Q<  
//数组…… n~&e>_;(.  
\cq.M/p  
char a[]=”Hello Word!”; ),I7+rY  
}pPt- k  
char b[10]; }Qvoms<k  
wsCT9&p  
strcpy(b,a); C)s*1@af  
s!BZrVM%I`  
if (strcmp(a,b)==0) t+SLU6j,  
v{>9&o.J  
{} $S!WW|9j.  
#*K!@X  
//指针…… @Cd}1OT)  
kC6s_k  
char a[]=”Hello Word!”; ~f%AbDye  
cE]#23  
char *p; E;x~[MA  
8"S? Toqq  
p=new char[strlen(a)+1]; evGUSol?:n  
5'O.l$)y  
strcpy(p,a); 7llEB*dSA  
}\\6"90g*  
if (strcmp(p,a)==0) 4K*DEVS  
]z/  
{} s((_^yf  
?GGh )";y  
nnO@$T  
十二、sizeof的问题 ()i!Uo  
QJ-?6 7_i  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 ! J@pox-t  
Z})n%l8J]p  
char a[]=”Hello World!” \\~4$Ai[  
6MR S0{  
char *p=a; 6PI-"He  
GB_ m&t  
count<<sizeof(a)<<end; //12字节 |k9A*7I  
s97L/iH  
count<<sizeof(p)<<endl; //4字节 _`Sz}Yk  
ed)!Snz   
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 N[,/VCW  
pV))g e\  
void fun(char a[1000]) ) N"gW*  
MtO p][i  
{ %4E7 Tu,1  
Ycx$CU C  
count<<sizeof(a)<<endl; //输出4而不是1000 (gv ~Vq  
D+  **o  
} M+TF0c  
ETVT.R8   
>taZw '  
十三、关于指针 &9'JHF!l  
>(HUW^T/9z  
1、 指针创建时必须被初始化 9wFQ<r  
I2=Kq{  
2、 指针在free 或delete后必须置为NULL R OQIw  
=<[ZFO~v  
3、 指针的长度都为4字节 p{Gg,.f!HM  
s2ys>2k  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 i(c'94M  
DP_ bB(  
char *p=new char[100]; 62LQUl]<  
*ha9Vq@X  
strcpy(p,”Hello World”); $bKa"T*  
Fw5r\J87c  
delete []p; //注意前面的[]号 K\ \U F  
|KC3^  
p=NULL; Kn9 ,N@bU_  
;nJCd1H  
5、数组指针的内容不能超过数组指针的最大容易。 )FqE8oN-  
5+O#5" v_  
如: 4[&6yHJ^  
~qT+sc!t  
char *p=new char[5];  '[#uf/~W  
P5P<-T{-c  
strcpy(p,”Hello World”); //报错 目标容易不够大 =kLg)a |  
Swua dN  
delete []p; //注意前面的[]号 ;"nEEe]?  
6%_d m'  
p=NULL; 0\U28zbMJw  
Ja#idF[V  
Z [5HI;  
十四、关于malloc/free 和new /delete n{Mj<\kL  
(Qq$ql27  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 HF\L`dJX?  
tIC_/ 6  
l 注意:malloc/free是库函数,new/delete是运算符 q& Vt*  
BWX&5""  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 3r{'@Y =)Y  
es(vWf'  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 ZdH WSfO)O  
5y"yd6O]O5  
l 两者都必须要成对使用 "v3u$-xN1  
ix&hsNzD  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 1.H"$D>TC  
xt"/e-h }  
^j=_=Km]  
十五、C++的特性 r/O(EW#=8  
_L!"3  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 D\V}Eo';6  
73.o{V  
重载和内联:即可用于全局函数,也可用于类的成员函数; 6v1#i  
%9NGVC  
Const和Virtual:只可用于类的成员函数; nhCB ])u8l  
}u+R,@l/  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 a<gzI  
n(f&uV_):  
覆盖是指派生类函数覆盖基类函数 a3lo;Cfp  
s_Dl8O4u  
函数名相同; i]$7w! r&  
#G{T(0<F  
参数相同; 6U+#ADo  
G%kXr$?W  
基类函数必须有Virtual关键字; c*1x*'j.  
?I/,r2ODLh  
不同的范围(派生类和基类)。 SKfv.9  
iKS9Xss8  
隐藏是指派生类屏蔽了基类的同名函数相同 6OTxtk  
#lLL5ji  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。  BW\R  
LL6f40hC  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 esu6iU@  
kb7\qH!n  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 vP~F+z @g  
dF.T6b  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 q-8  GD7  
"?9fL#8f*!  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 $qrr]U  
=k/n  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: q3P3euK3  
4rzioIk  
将void Func(A a) 改为void Func(const A &a)。  vo(?[[  
_fyw  
而void func(int a)就没必要改成void func(const int &a); IkZ_N#m  
YJ6vyG>%C  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 BA>0 +  
RU >vnDaC  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 D&^:hs@  
2b"5/$|6  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 7Rh:+bT  
Q.] )yqX6  
7lj-Z~1  
十六、extern“C”有什么作用? Vlz T  
uHIWbF<0oo  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 e S=k 48'U  
?^!dLW  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 ~R8yj(  
7w$R-Y/E  
s*X\%!l9  
十七、构造函数与析构函数 >>8w(PdTn%  
U+RPn?Q  
派生类的构造函数应在初始化表里调用基类的构造函数; g|HrhUT;  
A-u5  
派生类和基类的析构函数应加Virtual关键字。 )/AvWDKvO  
&sgwY  
不要小看构造函数和析构函数,其实编起来还是不容易。 ? 7EVmF  
dtBV0$  
#include <iostream.h> wEbs E<</  
9C 05  
class Base c+{4C3z  
DQICD.X6R  
{ F)5Aq H/p  
}"x*xN  
public: rQm  
5gEfhZQ  
virtual ~Base() { cout<< "~Base" << endl ; } 4w6K|v<X  
T!A}ipqb  
}; W>bW1h  
15:@pq\  
class Derived : public Base @/(7kh +  
6)$ N[FNs  
{ PZR%8 m}]u  
IpXhb[UZ?  
public: r3_gPK  
rM=A"  
virtual ~Derived() { cout<< "~Derived" << endl ; } aF"Z!HD  
o#) !b:/  
}; 2vN(z %p  
1@S6[&_  
void main(void) [s{:}ZuKc  
j/pQSlV  
{ Le JlTWotC  
f{c[_OR  
Base * pB = new Derived; // upcast kte.E%.PE  
C+?s~JL  
delete pB; 7 aD&\?  
\X.=3lc&  
} 'sBXH EZA]  
'm5(MC,  
输出结果为: 7B!Qq/E?g  
s)8M? |[`I  
~Derived %,cFX[D/)  
A<5`[<x$  
~Base ya L W(@  
xBfe8lor  
如果析构函数不为虚,那么输出结果为 LC\:xia{X  
J8BT%  
~Base :_a]T-GL  
1 " 7#|=1/  
cu?(P ;mQi  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 ]U1,NhZu  
4`P2FnJ?  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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