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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 :I}_  
]X)EO49  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 ^$y_~z3o#7  
^OQ#Nz  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Do|`wpR  
xf@D<}~1  
IczEddt@'  
二、头文件的作用 ?D6rFUs9;  
`'[ 7M  
加强安全检测 `v)-v<  
J)n g,i  
通过头文件可能方便地调用库功能,而不必关心其实现方式 a|\_'#  
]eq3cwR[|  
-~h2^Oez  
三、* , &修饰符的位置 .j4IW 3)  
#| 8!0]n'  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 !m1pL0  
T`=N^Ca1!`  
L$x/T3@  
四、if语句 <u"#Jw/VP  
yREO;m|o  
不要将布尔变量与任何值进行比较,那会很容易出错的。 8C=Y(vPk2  
m-a _<xo  
整形变量必须要有类型相同的值进行比较 .-N9\GlJ,d  
;r[=q u\  
浮点变量最好少比点,就算要比也要有值进行限制 um&e.V)N  
+-#| M|a  
指针变量要和NULL进行比较,不要和布尔型和整形比较 I=^%l7  
UgJ^NF2w  
9=I(AYG{m  
五、const和#define的比较 $/45*  
!{SU G+.2  
const有数据类型,#define没有数据类型 0r=Lilu{q  
y\ @;s?QL  
个别编译器中const可以进行调试,#define不可以进行调试  \'"q6y  
-zz9k=q  
在类中定义常量有两种方式 h3xX26l  
6SsZK)X  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; (w% hz']  
9#6ilF:F  
2、 用枚举代替const常量。 vVLR9"rHM  
tO?*x/XC{  
cVn7jxf  
六、C++函数中值的传递方式 wR/i+,K  
K"b vUH  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) mXF pGo5 s  
<z)MV oa  
void fun(char c) //pass by value b)w3 G%Xx  
k=bv!T_o  
void fun(char *str) //pass by pointer VV] {R'  
4 '9h^C&  
void fun(char &str) //pass by reference i`8!Vm  
:eQx di'  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 /IV:JVT  
x)vYc36H  
函数的类型不能省略,就算没有也要加个void ,bmTB ZV  
a$t [}D2  
nhXa&Nro  
七、函数体中的指针或引用常量不能被返回 +Mm0bqNN  
4b3p,$BWS  
Char *func(void) <k^9l6@  
a/^Yg rC\T  
{ x'JfRz  
PD/JXExK  
char str[]=”Hello Word”; 2 >xV&  
Gh|1%g"gm  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 S^D ~A8u  
_W#27I  
return str; >Q5E0 !]  
^ad> (W  
} !b _<_Y{l  
Cfz1\a&V{  
函数体内的指针变量并不会随着函数的消亡而自动释放 ]\ r~"*TZ  
9y]$c1  
1<5 9)RiO>  
八、一个内存拷贝函数的实现体 rhn*k f{8  
^QW%< X  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) R!pV`N  
"?qu(}|  
{ @1Zf&'/6  
'T|.<u@~  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); QTn-n)AE  
KI>7h.t  
byte *pbTo=(byte*)pvTo; //防止地址被改变 "hlIGJ?_=  
oHi&Z$#!n  
byte *pbFrom=(byte*)pvFrom; bR&hI9`%F  
c@nl;u)n  
while (size-- >0) :f/ p5 c  
U-n33ty`H  
pbTo++ = pbForm++; ax>c&%vo  
s.GhquFCrU  
return pvTo; '{oe}].,  
4qm5`o\hb  
} eEc;w#  
p Y>yJ)  
Ca1)>1 Vz  
九、内存的分配方式 (J^ Tss  
o!\O)  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 A<.Q&4jb  
#sqDZ]\B  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 /{kyjf[o&*  
*=|i"  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。  B-&J]H  
Cq(Xa-  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 dNJK[1e6  
<&L;9fr  
=v;-{oN!  
十、内存分配的注意事项 \GvVs  
BgpJ;D+N4  
用new或malloc分配内存时,必须要对此指针赋初值。 g:o\r (  
-O_UpjR;  
用delete 或free释放内存后,必须要将指针指向NULL !w)Mm P Xb  
C,I N+@  
不能修改指向常量的指针数据 Gg.w-&  
9C4l@ jrF  
r 2   
十一、内容复制与比较 ^c(PZ,/#JB  
BklB3*n  
//数组…… E$ngmm[  
O5=ggG  
char a[]=”Hello Word!”; QOF;j#H^  
M3t_!HP}!  
char b[10]; UxS;m4  
o"]eAQ  
strcpy(b,a); =AKW(v  
q/B+F%QiMQ  
if (strcmp(a,b)==0) +pcj8K%  
vSnb>z1  
{} %cm5Z^B1"  
X  ]a>  
//指针…… .y\HQ^j  
_E30t( _.  
char a[]=”Hello Word!”; k]>k1Mi=  
x# YOz7.  
char *p; cLYc""=  
VmUM _Q~  
p=new char[strlen(a)+1]; 6/-!oo   
zEhy0LLm  
strcpy(p,a); !}3`Pl.(r  
pJv?  
if (strcmp(p,a)==0) C`jP8"-  
i L m1l  
{} ]Z84w!z  
v =?V{"wk!  
FI/YJ@21  
十二、sizeof的问题 eY(usK  
U1"t|KW8  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 `?D_=Gw  
V!opnLatYS  
char a[]=”Hello World!” @"/}Al  
KqSa"76R  
char *p=a; Q./ lX:  
 R_N<j  
count<<sizeof(a)<<end; //12字节 ?}]kIK}MC  
7O9s 5  
count<<sizeof(p)<<endl; //4字节 @LE?XlhD  
G^(&B30V  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 F d\XDc[g  
v]BQIE?R /  
void fun(char a[1000]) JyqFFZ&  
h#n8mtt&i  
{ ;OPCBdr  
C5WCRg5&  
count<<sizeof(a)<<endl; //输出4而不是1000 {fb~`=?  
kIfb!  
} \G=E%aK  
c==Oio("  
jF3!}*7,  
十三、关于指针 8x9kF]=  
"{B ek<  
1、 指针创建时必须被初始化 o5D"<-=>  
H4m6H)KOG  
2、 指针在free 或delete后必须置为NULL b$ x"&&   
~`})x(!  
3、 指针的长度都为4字节 "~(&5M\8`  
3N bn|_`(  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 4y1> !~f  
} g*-Ty  
char *p=new char[100]; @*uX[)  
QB.'8B_  
strcpy(p,”Hello World”); {''|iwLr  
B![5+  
delete []p; //注意前面的[]号  `JE>GZ Y  
4'd{H Rs  
p=NULL; #LN I&5  
\i,cL)HM  
5、数组指针的内容不能超过数组指针的最大容易。 -PnC^r0L$  
HEuM"2{DMM  
如: $&C(oh$:  
 q%k+x)  
char *p=new char[5]; )a^Yor)o"  
bSr 'ji  
strcpy(p,”Hello World”); //报错 目标容易不够大 6oP{P_Pxi  
Z M+Hb_6f  
delete []p; //注意前面的[]号 {a3kn\6H0  
ZmULy;{<)  
p=NULL; `Q&] dE=  
UC1!J =f  
+r0eTP=zf  
十四、关于malloc/free 和new /delete VRX" @uCD  
[\b_+s)eN  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 /SXz_ e  
}K>H S\e  
l 注意:malloc/free是库函数,new/delete是运算符 ~t:b<'/  
rEhf_[Dv  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 j&/.[?K  
=GQ^uVf1  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 y^AA#kk  
N4To#Q1w  
l 两者都必须要成对使用 ys/mv'#>  
O$Vm#|$sq  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 RGO:p]t|  
A&P1M6Of  
|nEV Oy>'  
十五、C++的特性 s\W  
\B2d(=~4  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 O^}v/}d  
|mk}@OEf  
重载和内联:即可用于全局函数,也可用于类的成员函数; g&4~nEp  
z/KZ[qH\  
Const和Virtual:只可用于类的成员函数; j#e.rNG  
#eC;3Kq#-  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 ;:c%l.Y2  
B Z?W>'B%$  
覆盖是指派生类函数覆盖基类函数 aEDN]O95?  
O|Ic[XfLx  
函数名相同; C|f7L>qe  
"rGOw'!q>  
参数相同; Q H_W\W  
`XxG"k\/S  
基类函数必须有Virtual关键字; R9l7CJM@  
"F"_G  
不同的范围(派生类和基类)。 ;x-H$OZX  
|2@en=EYk  
隐藏是指派生类屏蔽了基类的同名函数相同 S7kT3zB  
9"aFS=><  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 4$aO;Z_  
z@~&Kwf\}  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 hRr1#'&  
Y_@"v#,  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 [tqO}D  
jRG\C=&(x  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 kz0=GKic  
2Nn1-wdhb  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 g?~Tguv  
-k&{nD|  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: m`$>:B  
`OP>(bU0  
将void Func(A a) 改为void Func(const A &a)。 d>, V  
6B''9V:s  
而void func(int a)就没必要改成void func(const int &a); X B*}P  
m*!f%}T  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 4C1FPrh  
14D 7U/zer  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 *w/WHQ`xI  
8*yo7q&  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; u:k:C  
Mjj}E >&  
`x} Dk<HF  
十六、extern“C”有什么作用? "XNu-_$N<a  
=#(0)p $EC  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 i~)N QmH<  
Px?Ao0)Z,  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 'qV3O+@MF  
ADGnBYE  
&|N%#pYS  
十七、构造函数与析构函数 fYhR#FVI  
D#7_T KX  
派生类的构造函数应在初始化表里调用基类的构造函数; }t|Plz  
5#0e={X  
派生类和基类的析构函数应加Virtual关键字。 Ud#X@xK<h  
'_qQrP#  
不要小看构造函数和析构函数,其实编起来还是不容易。 rKzlK 'U  
#+" 4&:my  
#include <iostream.h> JzMZB"Z?  
pDq#8*q+v  
class Base l RDxIuTK  
YZGS-+  
{ 2L2 VVO  
1n'$Ji7  
public: =3|pHc hJ4  
&Vt2be*  
virtual ~Base() { cout<< "~Base" << endl ; } Ad;S=h8:  
s=N#CE  
}; S<nP80C  
:p<kQ4   
class Derived : public Base w< 65S  
PW%1xHLfk  
{ 5g``30:o  
WRD A `  
public: [5Fd P0  
i3Hz"Qs;  
virtual ~Derived() { cout<< "~Derived" << endl ; } Sty! atEWT  
dTN$y\   
}; mz\NFC<  
R-pH Quu3  
void main(void) u 1ZJHry  
mX&xn2}qZ"  
{ Hz?!BV0  
> z=Ou<,  
Base * pB = new Derived; // upcast ptpW41t}^  
|3{+6cg  
delete pB; tAqA^f*{  
x(PKFn  
} 3ai (x1%  
gYatsFyL  
输出结果为: 53 @oP  
(*,8KLV_i  
~Derived )O3jQ_q=  
$PSY:Zz  
~Base Q.,DZp   
( 0i'Nb"  
如果析构函数不为虚,那么输出结果为 }:`5,b%Y_  
V+lRi"m?|  
~Base 4'SaEsA~  
FY]pv6@  
[yw%ih)  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 _Vjpw,  
AnNP Ti  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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