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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 QOX'ZAB`  
3:O|p[2)L  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件  aGOS 9  
PR/>E60H  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 '>ASr]Q  
(*M0'5  
|}2/:f#Iz*  
二、头文件的作用 2D(sA  
deQ {  
加强安全检测 b# Dd  
pIV |hb!G  
通过头文件可能方便地调用库功能,而不必关心其实现方式 qnHjwMi  
]- 6q`'?[  
ce;$)Ff\  
三、* , &修饰符的位置 ^OV!Q\j.q  
oxBTm|j7  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 VX*+:  
9@ 4]t6h[  
x+DETRLP  
四、if语句 S}fQis  
!?R#e`}  
不要将布尔变量与任何值进行比较,那会很容易出错的。 4X",:B}  
])G| U A.  
整形变量必须要有类型相同的值进行比较 (t){o> l  
# > I_  
浮点变量最好少比点,就算要比也要有值进行限制 ]cv/dY#  
nrA 4N1  
指针变量要和NULL进行比较,不要和布尔型和整形比较 :f:&B8  
lI%RdA[  
M3elog:M  
五、const和#define的比较 fK~8h  
_k : BY  
const有数据类型,#define没有数据类型 ^I|i9MH  
W[k rq_c-  
个别编译器中const可以进行调试,#define不可以进行调试 [ #ih o(/  
fN@ZJ~F%j  
在类中定义常量有两种方式 P* i 'uN  
Zn0a)VH%  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; r;)31Tg  
#eN2{G=4+  
2、 用枚举代替const常量。 e|W;(@$<  
H0 Z o.Np  
!vSq?!y6*P  
六、C++函数中值的传递方式 tAo$; |  
HY eCq9S  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) } xA@3RT  
3#x1(+c6  
void fun(char c) //pass by value O8A(OfX  
(, ik:j  
void fun(char *str) //pass by pointer V;g) P  
-+u}u=z%  
void fun(char &str) //pass by reference $9j>oUG  
|Xm$O1Wa  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 ?(U;T!n  
JU;`c>8=)  
函数的类型不能省略,就算没有也要加个void @ ;@~=w  
p^}`^>OL  
$UdBZT-  
七、函数体中的指针或引用常量不能被返回 Tt9cX}&&  
wd32q7lGo1  
Char *func(void) j^;P=L0=  
N@O e[X8  
{ <7>1Z 82)  
IA&V?{OE@I  
char str[]=”Hello Word”; `#w#!@s#@  
#_x5-?3  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 Xn?.Od(  
 3s| :7  
return str; D"-Wo}"8O'  
D5oYcGc  
} =-~))!(  
{}8C/4iP  
函数体内的指针变量并不会随着函数的消亡而自动释放  Qe7=6<  
mR1b.$  
)A%* l9\nG  
八、一个内存拷贝函数的实现体 IiRQ-,t1  
sV-P R]  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 63%V_B|  
5-ED\-  
{ {tl{ j1d |  
_ yJz:pa  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); ?<BI)[B  
%'i_iF8.  
byte *pbTo=(byte*)pvTo; //防止地址被改变 !'rdHSy  
,Y6]x^W  
byte *pbFrom=(byte*)pvFrom; 7sQHz.4  
~4Gc~"  
while (size-- >0) jUKMDl H  
:*h1ik4t  
pbTo++ = pbForm++; t2vm&jk  
KAD2_@l  
return pvTo; h,B4Tg'  
E:M,nSc)53  
} &*'^uCna  
Fbu4GRgJ3  
6M`gy|"(~  
九、内存的分配方式 )eT>[['fm  
?H,f|nc  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 vf@j d}?  
o?m1  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 />}zB![(K  
+jZa A/  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 ;,6C&|n]w  
E9>z.vV   
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 Lfcy#3!  
IDJ2epW*;  
^X+qut+~  
十、内存分配的注意事项 n"aF#HR?0d  
gm,AH85  
用new或malloc分配内存时,必须要对此指针赋初值。 ub fh4  
^^7@kh mNl  
用delete 或free释放内存后,必须要将指针指向NULL 7S 8X)  
0>BI[x@  
不能修改指向常量的指针数据 $#+D:W)az  
S>h\D4.  
8x)i{>#i  
十一、内容复制与比较 $:oC\K6  
MZX)znO  
//数组…… 0&fO)de96  
yA"?Hv\o;  
char a[]=”Hello Word!”; 9 Xl#$d5  
`Mt|+iT$p  
char b[10]; B+~ /-3  
c1i:m'b_5  
strcpy(b,a); 1$Q[%9  
%i/|}K  
if (strcmp(a,b)==0) 'h0>]A 2|X  
mRC3w(W  
{} 4Eu'_>"a  
D&"lu*"tg  
//指针…… q78OP}  
o+x! (  
char a[]=”Hello Word!”; @v@F%JCZ  
_eq$C=3Ta  
char *p; hKN ;tq,  
|n tWMm:(  
p=new char[strlen(a)+1]; ^7? WR?!  
=y@0i l+V  
strcpy(p,a); $\vNST E  
x:~XZX\mwH  
if (strcmp(p,a)==0) Rvu5#_P  
n{M Th_C4n  
{} =^rp= Az  
#oa>Z.?_V  
D8u`6/^  
十二、sizeof的问题 r ~UDK]?V  
v X6JjE!  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 &dWGa+e  
ttJ'6lGXh  
char a[]=”Hello World!” hx;kNcPbI  
XC~"T6F  
char *p=a; 1aIGC9xQ`  
KWjhkRK4]  
count<<sizeof(a)<<end; //12字节 g9JZ#BgZ  
7?uDh'utt  
count<<sizeof(p)<<endl; //4字节 ]g;+7  
"&f|<g5  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 \xggIW.^0  
=hb)e}l  
void fun(char a[1000]) fPKpV`Hr3  
"u4x#7n|  
{ `5h^!="  
HH7WMYoKY  
count<<sizeof(a)<<endl; //输出4而不是1000 \db=]L=|  
%5zIh[!1$  
} @w.DN)GPo  
Q <D_QJ  
56c[$ q  
十三、关于指针 5vR])T/S0  
+:ms`Sr>  
1、 指针创建时必须被初始化 w.J$(o(/  
L)\<7  
2、 指针在free 或delete后必须置为NULL 'Z.C&6_  
F5YoEWS  
3、 指针的长度都为4字节 ?yj g\S?L  
^&mrY[;S  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 H.>EO&#|p  
H<fi,"X^  
char *p=new char[100]; PPySOkmS3  
T6\]*mlr  
strcpy(p,”Hello World”); Pf%I6bVN9  
B@ufrQ#Y.  
delete []p; //注意前面的[]号 z a_0-G%C2  
b+ycEs=_  
p=NULL; L"dN $ A  
"\}h  
5、数组指针的内容不能超过数组指针的最大容易。 EZ"i0u  
.),9q z`  
如: " 62g!e}!c  
|XG&[TI- "  
char *p=new char[5]; 11#b%dT  
Ut'T!RD  
strcpy(p,”Hello World”); //报错 目标容易不够大 :/5G Hfyj  
3V^5 4_  
delete []p; //注意前面的[]号 /({oN1X>i  
V3cKdlu Na  
p=NULL; DBaZcO(U  
3w |5%`  
)7+z/y+[n  
十四、关于malloc/free 和new /delete hO3 q|SL  
`p* 43nV  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 aN*{nW  
PknKzrEG:>  
l 注意:malloc/free是库函数,new/delete是运算符 0L32sF y  
Uvc$&j^k  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 t}Td$K7  
yevJA?C4 v  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 iJoYxx  
S},Cz  
l 两者都必须要成对使用 hG#2}K_  
(X\]!'A  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 : KFK2yD  
L?|}!  
`w >D6K+  
十五、C++的特性 v,QvCozOz  
R6Md_t\  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 Vrlqje_Q  
tl~ZuS/  
重载和内联:即可用于全局函数,也可用于类的成员函数; Vi^vG`L9  
-u"|{5? '  
Const和Virtual:只可用于类的成员函数; i4k [#x  
Btzes.  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 t@MUNW`Q  
0`WFuFi^o  
覆盖是指派生类函数覆盖基类函数 $n!5JS@40  
j8 2w 3  
函数名相同; U" 3L  
_fY9u2Y  
参数相同; 1##@'L|u  
ey9hrRMR  
基类函数必须有Virtual关键字; mP6}$ D  
gSwHPm%zn  
不同的范围(派生类和基类)。 (91ts$jH  
f2o6GC_  
隐藏是指派生类屏蔽了基类的同名函数相同 Y7q Q` |  
[$d]U.  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 LQ%QFfC  
`\"<%CCe  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 *}#HBZe(9  
PbS1`8|4  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 *3={s"a.(  
v_U/0 0  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 (X5y%~;V5a  
{2Tu_2>  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 wVI_SQ<8V  
_s0)Dl6K  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: ( [a$Z2m  
|k]]dP|:'  
将void Func(A a) 改为void Func(const A &a)。 WwWOic2  
os;9 4yd )  
而void func(int a)就没必要改成void func(const int &a); (7! pc  
toD!RE  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 9SA%'  
%rrD+  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 %WR"qd&HSh  
bw/mF5AsW  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; *5s*-^'#!  
Uea2WJpX  
8;<aco/62  
十六、extern“C”有什么作用? 4:O.x#p  
1GkoE  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 ' CJ_&HR  
Uy|!f]"?  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 $'d,X@}8  
1uKIO{d @  
,+h<qBsV@  
十七、构造函数与析构函数 <v_Wh@m  
CXz9bhn<4  
派生类的构造函数应在初始化表里调用基类的构造函数; FcZ)^RQ4G  
reYIF*  
派生类和基类的析构函数应加Virtual关键字。 lsj9^z7  
!@ P{s'<:  
不要小看构造函数和析构函数,其实编起来还是不容易。 iI'ib-d  
?G!p4u?C  
#include <iostream.h> u-jc8W`Zd  
B+R|fQ  
class Base D(|+z-}M  
N`H`\+  
{ <Tbl |9  
M e:l)8+  
public: L$!2<eK  
L">jSZW[[  
virtual ~Base() { cout<< "~Base" << endl ; } y,jpd#Y  
ir\)Hz2P  
}; I(&N2L$-  
ume70ap}m  
class Derived : public Base T\4>4eX-  
n|Y}M]u,  
{ G#NbLj`h  
v5?)J91  
public: KkzG#'I1  
zZ51jA9x  
virtual ~Derived() { cout<< "~Derived" << endl ; } qJl DQc-  
zd$iD i($  
}; Mkt_pr  
s{X+0_@Q  
void main(void) 6kR3[]:16v  
Dh#5-Kf%  
{  4y5Q5)j  
S_??G:i  
Base * pB = new Derived; // upcast b 5K"lPr  
g~9rt_OV  
delete pB; l$HBYA\Qh  
/']`}*d  
} &ns??:\+T  
9X#]Lg?b  
输出结果为: ih75 C"  
5__B M5|  
~Derived V}2[chbl  
Lq6nmjL  
~Base i~<.@&vt  
&"Cy&[  
如果析构函数不为虚,那么输出结果为 x2b t^!t.  
Ag(JSVY  
~Base \7$"i5  
`GY]JVW  
qn{9vr  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 EUgKJ=jw  
OQg}E@LZ  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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