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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 &P(vm@*  
(h27SLYm  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 <xAlp;8m5  
|dqvv  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 U/:x<Y$ tj  
h<FEe~  
m@y_Wt  
二、头文件的作用 oT^r  
}>m3V2>[  
加强安全检测 k6??+b:rE  
lPn&,\9@~  
通过头文件可能方便地调用库功能,而不必关心其实现方式 Cz#3W8jV  
7.(vog"I)  
G2hBJTW  
三、* , &修饰符的位置 f/e2td*A  
LJBDB6  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 v QL)I  
J!*Pg<  
ybVdWOqv  
四、if语句 Wg5i#6y8w  
ATf{;S}  
不要将布尔变量与任何值进行比较,那会很容易出错的。 -u%'u~s  
KDy:A>_ G"  
整形变量必须要有类型相同的值进行比较 :]-? l4(%  
21G:!t4/?n  
浮点变量最好少比点,就算要比也要有值进行限制 !d=Q@oy5  
Y^CbpG&-vC  
指针变量要和NULL进行比较,不要和布尔型和整形比较 My\  
pd X"M>  
fY9/u=  
五、const和#define的比较 -}r(75C  
9 TILrK  
const有数据类型,#define没有数据类型 /yj-^u\R  
[EV}P&U  
个别编译器中const可以进行调试,#define不可以进行调试 i4oBi]$T  
;t}ux  
在类中定义常量有两种方式 \^%5!  
5s2334G  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; fO{E65uA  
"227 U)Q  
2、 用枚举代替const常量。 >SZ9,K4Gs  
)SYZ*=ezl.  
#%g~fh  
六、C++函数中值的传递方式 )04lf*ti  
$\@yH^hL  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) a4M`Bk;mb  
v]HiG_C  
void fun(char c) //pass by value _;+N=/l0  
q3E_.{t  
void fun(char *str) //pass by pointer ^R4eW|H  
@Q atgYu  
void fun(char &str) //pass by reference  ]=g |e  
l7r!fAV-f  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 md/Z[du:'  
?$^qcpJCp  
函数的类型不能省略,就算没有也要加个void cnOk  
KCed!OJ+  
:{tvAdMl7  
七、函数体中的指针或引用常量不能被返回 8_tMiIE-pS  
, eZL&n  
Char *func(void) X+K$y:UZ  
b\w88=|  
{ 0Fh*8a}?b  
7o+!Gts]  
char str[]=”Hello Word”; wQ,RZO3  
|8"~ou:.  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 )Cz^Xp)#  
?WX&,ew~  
return str; _ QM  
<nj[=C4v  
} "/?*F\5  
3HA$k[%7P  
函数体内的指针变量并不会随着函数的消亡而自动释放 1a90S*M  
_rqOzE)  
>M^ 1m(  
八、一个内存拷贝函数的实现体 AAdRuO{l1  
ys;e2xekg  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) oA~m*|  
D.<CkD B  
{ ;NRT a*  
iEki<e/  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); Hk\+;'PrN  
/)de`k"  
byte *pbTo=(byte*)pvTo; //防止地址被改变 xIrpGLPSh  
fT8Id\6js  
byte *pbFrom=(byte*)pvFrom; h{sW$WA  
$YSD%/c  
while (size-- >0) &bj :,$@  
%i%Xi+{3  
pbTo++ = pbForm++; [NvEX Td  
"`"j2{9|e!  
return pvTo; Xt= &  
n/8Kb.Vf  
} 0 \LkJ*i  
#s#z@F  
Mn~A;=%qF  
九、内存的分配方式 D-3/?"n  
~~zw[#'  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 OqBw&zm  
*-|+phi m  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。  R/^JyL  
u."fJ2}l0X  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 Z{p6Q1u  
@LL&ggV?  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 C3@.75-E  
f aO8 &  
[k'Ph33c  
十、内存分配的注意事项 rpEFyHorJ  
G<jpJ  
用new或malloc分配内存时,必须要对此指针赋初值。 GYO\l.%V5y  
pXFNK" jm  
用delete 或free释放内存后,必须要将指针指向NULL g=Qga09  
b7AuKY{L  
不能修改指向常量的指针数据 ]Hd 0 Y%  
Km <Wh=  
M@'V4oUz  
十一、内容复制与比较 0dcXgP  
t^CT^z  
//数组…… uAvs  
"j a0,%3  
char a[]=”Hello Word!”; "]_|c\98  
2/7=@>|  
char b[10]; @eT sS%f2  
 +rT(  
strcpy(b,a); K<]fElh-  
Y$ChMf  
if (strcmp(a,b)==0) 2 !;4mij,  
3,vH:L4  
{} tt^ze|*&t  
b(SV_.4,'  
//指针…… <Y orQ>  
@^` <iTK&p  
char a[]=”Hello Word!”; \4j+pU  
7%E1F)%  
char *p; H~ZSw7!M8  
k( g$_ ]X  
p=new char[strlen(a)+1]; 5dgBSL$A}]  
EkL\~^  
strcpy(p,a); \W}EyA  
'!.;(Jo  
if (strcmp(p,a)==0) ,#E5/'c`  
s^oNQ}  
{} zJnVO$A'  
|?| u-y  
Z>,X$ Y6<  
十二、sizeof的问题 xF/DYXC{8  
'u3+k.  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 eurudl  
e6R "W9  
char a[]=”Hello World!” RE.@ +A  
(Z$6J Nkz  
char *p=a; {6n \532@  
yhdG 93  
count<<sizeof(a)<<end; //12字节 _#4,&bh8  
- X_w&  
count<<sizeof(p)<<endl; //4字节 # 0!IUSa  
cLU*Tx\  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 U]D.z}0  
=_dd4`G&<  
void fun(char a[1000]) H n!vTB  
Cv~hU%1T  
{ (7b_g6>:  
VjqdKQeVq  
count<<sizeof(a)<<endl; //输出4而不是1000 2SJh6U  
9Bk}g50$#  
} ~yi&wbTjM  
N 9&@,3  
Z]S0AB.Z@  
十三、关于指针 k@aP&Z~  
_;q-+"6L;  
1、 指针创建时必须被初始化 M0zD)@  
@L!#i*> 9  
2、 指针在free 或delete后必须置为NULL )M N yOj  
SU'1#$69F  
3、 指针的长度都为4字节 j_yFH#^W:  
arLl8G[  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ptv 4v[gQ  
|<|,RI?  
char *p=new char[100]; %gMpV  
k6-n.Rl01  
strcpy(p,”Hello World”); wDhcHB  
*Z`eNz}  
delete []p; //注意前面的[]号 C55n  
NoAb}1uae  
p=NULL; Z{ Zox[/  
^X;Xti  
5、数组指针的内容不能超过数组指针的最大容易。 >v_5xd9  
/Z " 4[  
如: ,*Z[P%<9  
YaZt+WA  
char *p=new char[5]; 'HWgvmw(  
g**% J Xo  
strcpy(p,”Hello World”); //报错 目标容易不够大 0bxvM  
y}-S~Ov>I  
delete []p; //注意前面的[]号 -mHhB(Td'  
xnQGCw?S&}  
p=NULL; pt cLJ]+)  
'+I 2$xE  
6>BDA?  
十四、关于malloc/free 和new /delete 01c/;B  
T7,Gf({  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 <oaBh)=7  
Px7g\[]  
l 注意:malloc/free是库函数,new/delete是运算符 =@KYA(D  
dezL{:Ya  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 !bV(VRbu  
.-u k   
l new/delete不能在C上运行,所以malloc/free不能被淘汰 eN<pU%7  
'Tf#S@o  
l 两者都必须要成对使用 2V2x,!  
Y5i`pY/}#?  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 aHPSnB&  
ul=a\;3x#|  
LB*#  
十五、C++的特性 ;*4tVp,  
.FbZVYc]  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 SeZT4y*=  
!:5`im;i  
重载和内联:即可用于全局函数,也可用于类的成员函数; WQLHjGehe  
d[RWkk5  
Const和Virtual:只可用于类的成员函数; zUEfa!#?  
.f !]@"\  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 _/]:=_bf_z  
\, %o>M'  
覆盖是指派生类函数覆盖基类函数 H8<7#  
spU!t-n67  
函数名相同; A D}}>v  
vBnKu  
参数相同; YK w!pu=  
IGK_1@tq  
基类函数必须有Virtual关键字;  ny  
,+NE:_  
不同的范围(派生类和基类)。 jgo<#AJ/E  
y800(z  
隐藏是指派生类屏蔽了基类的同名函数相同 !7kLFW  
kHJDX;  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 RlslF9f  
Xv-1PY':pA  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 LG Y!j_bD  
.e FOfV)  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 m[@%{  
){Ciu[h  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 -lP )  
"%}Gy>;  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 (N*<\6kr  
\2].|Mym  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: s#+"5&!s  
5!SoN}$  
将void Func(A a) 改为void Func(const A &a)。 (?!(0Ywbg  
 9+'@  
而void func(int a)就没必要改成void func(const int &a); Msv*}^>  
 \8>  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 ~}7$uW0ol  
<m Ju v  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 TXd5v#_vo  
SG dfhno;  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; P|e:+G7  
j[m_qohd7  
.Ca"$2  
十六、extern“C”有什么作用? ~),;QQ,  
;gxN@%}@  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 z)58\rtz  
93E,  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 Ism^hyL  
2YE;m&  
`2B*CMW{  
十七、构造函数与析构函数 L;1$xI8tx  
laUu"cS  
派生类的构造函数应在初始化表里调用基类的构造函数; h` irO 5  
H Z;ZjC*  
派生类和基类的析构函数应加Virtual关键字。 [+g(  
8 3z'#  
不要小看构造函数和析构函数,其实编起来还是不容易。 ~_DF06G  
LJRg>8  
#include <iostream.h> g9yaNelDh)  
&\;<t, 3A~  
class Base Hv8SYQ|  
Od0S2hHO  
{ M!eoe5  
`3 f_d}b  
public: q[{:  
w)45SZ.  
virtual ~Base() { cout<< "~Base" << endl ; } F^ I\X  
5x*5|8  
}; LYd}w(}  
ES^>[2Y  
class Derived : public Base RL?u n}Qa  
mgi,b2  
{ I#"t'=9H  
<U@P=G<t  
public: [8,PO  
*ZGX-+{  
virtual ~Derived() { cout<< "~Derived" << endl ; } mND XzT&  
gKmX^A5<  
}; lp,\]]  
UppBnw  
void main(void) W[@i;f^g  
m!rwG(  
{ @O@fyAz  
?k [%\jq{a  
Base * pB = new Derived; // upcast M-{*92y& |  
c]6V"Bo}A  
delete pB; %oAL  
|J:$MX~  
} ~}h^38  
uA~YRKer  
输出结果为: o[o:A|n  
G7 1U7  
~Derived {I`B[,*  
>Y}7[XK  
~Base p lK=D#)  
!tI=`Ml[  
如果析构函数不为虚,那么输出结果为 O~.U:45t  
_)Qy4[S=d  
~Base ([Ebsj  
$Z/klSEf  
;P3>>DZ  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 :v`o6x8  
\3r3{X _<`  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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