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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 jlqSw4_  
Z@*!0~NH=4  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 *<"{(sAvk  
bkpN`+c  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 <{YzmN\Z  
23'{{@30  
FKhgUnw  
二、头文件的作用 @FF{lK?[  
ofI,[z3  
加强安全检测 sint":1FC  
JFNjc:4{0  
通过头文件可能方便地调用库功能,而不必关心其实现方式 \;Q!}_ K  
5'`DrTOA  
Nm-E4N#'i  
三、* , &修饰符的位置 0;OZ|;Z  
~Dw% d;  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 n\BV*AH  
,R7j9#D  
Y ;E'gP-J  
四、if语句 xh25 *y  
i],~tT|P  
不要将布尔变量与任何值进行比较,那会很容易出错的。 ]F;1l3I-  
q['3M<q  
整形变量必须要有类型相同的值进行比较 4+p1`  
^q%f~m,O<  
浮点变量最好少比点,就算要比也要有值进行限制 nYvkeT  
Lm1JiP s d  
指针变量要和NULL进行比较,不要和布尔型和整形比较 eIf-7S]m  
,[dvs&-*  
[a~@6*=  
五、const和#define的比较 3Q7PY46  
q@ wX=  
const有数据类型,#define没有数据类型 kK:Wr&X0H  
&t!f dti  
个别编译器中const可以进行调试,#define不可以进行调试 tuY= )?  
9JILK9mVO  
在类中定义常量有两种方式 8|L5nQ  
& \"cV0  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; WYcZD_  
(hKjr1s  
2、 用枚举代替const常量。 )Q}Q -Zt  
R,OT\FQ<  
\TDn q!)?  
六、C++函数中值的传递方式 Zz 'g&ewo  
`/i/AZ{  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) ^AXH}g  
_c:th{*  
void fun(char c) //pass by value ,K PrUM}  
 Yg2P(  
void fun(char *str) //pass by pointer K_.|FEV  
*;F<Q!i&v  
void fun(char &str) //pass by reference LFYSur8  
WZTv  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 '[_.mx|cd`  
FBzsM7]j  
函数的类型不能省略,就算没有也要加个void `@u9 fx.  
n%02,pC6,  
y;P%=M P  
七、函数体中的指针或引用常量不能被返回 V;Ln|._/t  
[`bK {Dq2  
Char *func(void) E2`9H-6e  
{aK3'-7  
{ )}_}D +2  
q$ j  
char str[]=”Hello Word”; A\E ))b9+  
#~w~k+E4  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 g~9b_PY9  
$d.Dk4.ed  
return str; >-w# &T &K  
B=}QgXg  
} KO"+"1 .  
!i@A}$y  
函数体内的指针变量并不会随着函数的消亡而自动释放 WK#%G  
9gIim   
/{I-gjovy  
八、一个内存拷贝函数的实现体 + kF%>F]  
X V)ctF4  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) K,*z8@  
CqU^bVs  
{ GI:!,9  
!>kg:xV  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); %`/F> `  
z XUr34jF  
byte *pbTo=(byte*)pvTo; //防止地址被改变 #60gjHYaV  
L[`8 :}M  
byte *pbFrom=(byte*)pvFrom; Q;nC #cg  
5HY0 *\  
while (size-- >0) g-m,n=qu  
%):pfM;b  
pbTo++ = pbForm++; h2?\A%  
3m$Qd#|  
return pvTo; VT#`l0I }  
|S:erYE,G  
} @,W5K$Ka=  
p&HO~J <w  
EV|W:;Sg  
九、内存的分配方式 _[wG-W/9R  
hVd_1|/X  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 8;f5;7M n  
l%2 gM7WMY  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 n5tsaU;  
f9d{{u  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 5as5{"l  
2{oQ  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 Q `-Xx  
:C={Z}t/F  
B9c gVTLj  
十、内存分配的注意事项 ~JS@$#  
qc' ;<  
用new或malloc分配内存时,必须要对此指针赋初值。 ^^a%Lz)U  
xjrL@LO#  
用delete 或free释放内存后,必须要将指针指向NULL ::cI4D  
L{&Yh|}  
不能修改指向常量的指针数据 >>8{N)c5E  
?<Mx*l  
nm %7e!{m  
十一、内容复制与比较 Re*~C:  
4 DV,f2:R4  
//数组…… K7i@7  
;(K"w*  
char a[]=”Hello Word!”; ,<s:* k  
b+$wx~PLi  
char b[10]; ;r.#|b  
0eK>QZ_  
strcpy(b,a); oc[z dIk  
_|;{{8*?  
if (strcmp(a,b)==0) BD]o+96qP  
6k {gI.SG  
{} Pw6%,?lQ  
38:5g_  
//指针…… {7_C|z:'p&  
&78lep  
char a[]=”Hello Word!”; -uhVw_qq#  
.VohW=D3  
char *p; >Dz8+y  
=hI;5KF  
p=new char[strlen(a)+1]; TS=U%)Ik  
{L7+lz  
strcpy(p,a); o/=61K8D  
Qx_N,1>S  
if (strcmp(p,a)==0) TnQW ~_:  
l701$>>  
{} w")m]LV  
? Y luX  
~b4kV)[ q  
十二、sizeof的问题 `-?`H>+OG  
N-45LS@  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 "}oo`+]Cq  
UoSc<h|  
char a[]=”Hello World!” 7d+0'3%  
/1Ss |.  
char *p=a; v0T?c53?  
xokA_3,1F  
count<<sizeof(a)<<end; //12字节 n{M-t@r7  
)d|s$l$?7  
count<<sizeof(p)<<endl; //4字节 #6pJw?[  
,)VAKrSg  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 {j4&'=C:  
JcfGe4  
void fun(char a[1000]) ZzP&Zrm  
oqg +<m  
{ ,v?FR }v  
d\8j!F^=  
count<<sizeof(a)<<endl; //输出4而不是1000 TFz k5  
~c*kS E2X  
} T#vY(d  
Rv.IHSQUo  
vV"I}L  
十三、关于指针 u}rJqZ  
hb9HVj  
1、 指针创建时必须被初始化 0vMKyT3 c  
vTL/% SJ8  
2、 指针在free 或delete后必须置为NULL `_BmVms  
BQs\!~Ux2  
3、 指针的长度都为4字节 !"'6$"U\K  
t oM+Bd:Y  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 [lu+"V,<LJ  
X}ihYM3y/  
char *p=new char[100]; U_Q;WPJ  
uh>"TeOi  
strcpy(p,”Hello World”); - Nt8'-  
D<WGau2H  
delete []p; //注意前面的[]号 {CFy %  
(Bv~6tj~J  
p=NULL; . K_Jg$3  
1{1mL-I;  
5、数组指针的内容不能超过数组指针的最大容易。 ['3E'q,4&  
,-DU)&dF  
如: ^ q3H  
*nv ^s  
char *p=new char[5]; y k\/Cf  
Fzn !  
strcpy(p,”Hello World”); //报错 目标容易不够大 0<^Q j.(9  
Vo|[Z)MO`  
delete []p; //注意前面的[]号 ~ftR:F|9  
]3Jb$Q@  
p=NULL; C^:{y  
~4xn^.w  
ID<[=es6  
十四、关于malloc/free 和new /delete ]u:Ij|.'y0  
kxmsrQ>av  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 tJGK9!MH{(  
{s6hi#R>  
l 注意:malloc/free是库函数,new/delete是运算符 }%^3  
c6iFha;db  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 ^g.H JQ'vF  
[@]i_L[  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 L=WKqRa>4  
>X5RRSo  
l 两者都必须要成对使用 Kk|)N3AV:  
d@tNlFfS  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 Q!I><u  
j(M.7Z7^  
Bw9O)++  
十五、C++的特性 s{42_O?,c  
nB/`~_9  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 ?u0qYep:  
i@ 86Ez  
重载和内联:即可用于全局函数,也可用于类的成员函数; D r"PS >.  
=c%gV]>G  
Const和Virtual:只可用于类的成员函数; #RKd >ig%  
Ds{DVdqA$c  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 LCe6](Z  
57_AJT hR  
覆盖是指派生类函数覆盖基类函数 Iv u'0vF  
Wq?vAnLbk  
函数名相同; <oSx'_dc  
+WguWLO"  
参数相同; QT|\TplJt  
Z!4B=?(  
基类函数必须有Virtual关键字; J~h9i=4<bF  
O5:[]vIn  
不同的范围(派生类和基类)。 A+z}z@K  
O:8Ne*L`D  
隐藏是指派生类屏蔽了基类的同名函数相同 =NWzsRl,  
G-#rWZ&  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 ;qcOcm%  
jHV) TBr  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 zhY]!  
NL'(/|)  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 {s=c!08=  
^S(QvoaQ  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 A-h[vP!v|  
.}E@ 7^X  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 (?i4P5s[!  
}}oIZP\qM  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: " BU4\QF-  
*@W B aN+  
将void Func(A a) 改为void Func(const A &a)。 =<AG}by![  
j!@, r^(  
而void func(int a)就没必要改成void func(const int &a); `H9 !Z$7G  
OU*skc>  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 =%B}8$.|  
at\$ IK_  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 urQ<r{$x0  
zXkq2\GHA  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; &egP3  
<X?xr f  
CX ; m8  
十六、extern“C”有什么作用? H;+98AIy`  
6p.y/LMO  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 X9C:AGbp  
n' 1LNi  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 c2]h.G83  
S$a.8Xh  
ET%F+  
十七、构造函数与析构函数 b27t-p8  
Rhw+~gd*F  
派生类的构造函数应在初始化表里调用基类的构造函数; 7 4hRG~  
6t'.4SR  
派生类和基类的析构函数应加Virtual关键字。 -67!u;  
3@1$y`SN  
不要小看构造函数和析构函数,其实编起来还是不容易。 X<f4X"y  
Ty*+?#`  
#include <iostream.h> n} ]gAX  
t$lJgj(  
class Base 3(:?Z-iKe  
g+xcKfN{  
{ $- Y8@bw  
OUN"'p%%  
public: !P6?nS  
;Q[E>j?w=  
virtual ~Base() { cout<< "~Base" << endl ; } q3|SZoN  
BG6Lky/omz  
};  TZdJq  
!yz3:Yzu  
class Derived : public Base KYq<n& s  
iaQFVROu  
{ Z5`V\$  
QJI]@3 Y  
public: ('.I)n  
8[a N5M]  
virtual ~Derived() { cout<< "~Derived" << endl ; } ~h%H;wC&  
E_{P^7Z|Jg  
}; g O8~$Aj  
N1U.1~U  
void main(void) :\%hv>}|  
B|=S-5pv*  
{ ppeF,Q  
V2g"5nYT  
Base * pB = new Derived; // upcast WY26Iq@C  
SzG?m]  
delete pB; 46H@z=5  
[lz H%0 V  
} }T53y6J#  
<d{>[R)  
输出结果为: ZR8y9mx2"  
8SCXA9}  
~Derived aaI5x  
8 v da"  
~Base aLwEz}-   
EWWCh0 {  
如果析构函数不为虚,那么输出结果为 Iomx"y]9  
oMNBK/X_  
~Base {<cgeH  
gUiZv8C  
DP!8c  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 tn|H~iF{  
}t1 q5@QU  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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