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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 )UG<KcdI  
)L:p.E  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 TzK[:o  
R8R,!3 N  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 ZNG{:5u,  
0"$'1g^]7  
j0[9Cj^%c  
二、头文件的作用 rfxLCiV  
XxE>KeP  
加强安全检测 6B>H75S+H  
\~'+TW  
通过头文件可能方便地调用库功能,而不必关心其实现方式 qluaop  
5*7 \Yjk?  
b n<}  
三、* , &修饰符的位置 1]Gp \P}  
_ ?Z :m  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 $WK~|+"{>  
 (.B+U'6  
:HG5{zP  
四、if语句 '; Z!(r  
]AzDkKj  
不要将布尔变量与任何值进行比较,那会很容易出错的。 0^rDf L  
Se-n#  
整形变量必须要有类型相同的值进行比较 w"K;e(S  
_m|Tr*i8  
浮点变量最好少比点,就算要比也要有值进行限制 lVQy {`Ns  
-|~tZuf  
指针变量要和NULL进行比较,不要和布尔型和整形比较 kI>PaZ`i)  
\@HsMV2+zN  
EAM2t|M G.  
五、const和#define的比较 73OYHp_j  
-Lbi eS%  
const有数据类型,#define没有数据类型 E<XrXxS1O  
!*l5%H  
个别编译器中const可以进行调试,#define不可以进行调试 )w++cC4/5  
G;3N"az  
在类中定义常量有两种方式 1#<KZN =$  
D/-$~u_o  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; q k+(Ccl  
i'bUX=JK  
2、 用枚举代替const常量。 THbV],RhJ  
J#^oUq  
 rVo?I  
六、C++函数中值的传递方式 Lk~aM bw#  
78 W&  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) 60 z =bd]  
>AT T<U=  
void fun(char c) //pass by value )2jBhT  
ZeyA bo  
void fun(char *str) //pass by pointer lP:ll])p2  
0'9z XJ"  
void fun(char &str) //pass by reference 1]<w ZV}.  
P@z,[,sy"$  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 )W& $FU4JK  
RIO4`,  
函数的类型不能省略,就算没有也要加个void Ce0YO~I  
,[{)4J$MV  
8Ekk"h 6  
七、函数体中的指针或引用常量不能被返回  )6 _+  
C`0;  
Char *func(void) w_hGWpm  
LiF(#OuZ  
{ 41[1_p(  
'sCj|=y2Qc  
char str[]=”Hello Word”; p7pJ90~E  
XeT{y]lkd  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 \)Bws `  
(7qdrAeP  
return str; -}Iw!p#O3  
DVWqrK}q  
} i;XkH4E:)  
RvPC7,vh  
函数体内的指针变量并不会随着函数的消亡而自动释放 &~xzp^&  
LT3ViCZ-n  
c= }#8d.  
八、一个内存拷贝函数的实现体 R}-<ZJe  
x(Us O}  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) VkNg Vjg  
8JU9Qb]L'I  
{ pUz;e#J|  
n^Uu6  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); i.e1?Zk1  
D# "ppa}  
byte *pbTo=(byte*)pvTo; //防止地址被改变 azxGUS_i<  
tX$ v)O|  
byte *pbFrom=(byte*)pvFrom; O7_u9lz2  
Whd2mKwiO  
while (size-- >0) /@<&{_sybp  
]d}U68$T+  
pbTo++ = pbForm++; FKOTv2  
m;S!E-W  
return pvTo; _^2rRz  
k-$5H~(PZ  
} OUd&fUmH  
cF[L6{Oe  
|Mj2lZS  
九、内存的分配方式 3:XF7T  
oM&}akPE  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 .@  3  
q;^Q1[Ari  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 i58&o@.H<u  
5u<F0$qHc  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 _%xe:X+ M  
c==5cMUg  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 :/c40:[  
\lJCBb+k  
pQGlg[i2/  
十、内存分配的注意事项 5@YrtZI  
29xm66  
用new或malloc分配内存时,必须要对此指针赋初值。 5cv&`h8uo_  
F ka^0  
用delete 或free释放内存后,必须要将指针指向NULL Md4hd#z  
&DX&*Xq2  
不能修改指向常量的指针数据 {<~oa+"  
1%v!8$  
:7,j%ELic  
十一、内容复制与比较 )(?,1>k`Z  
,G q?  
//数组…… l@ amAusE  
4O TuX!  
char a[]=”Hello Word!”; B<99-7x3  
xppl6v(  
char b[10]; X=8CZq4  
r%craf  
strcpy(b,a); H2ZRUFu  
1BA/$8G  
if (strcmp(a,b)==0) <|!?V"`3  
JE a~avyJ  
{} q X"Pg  
zS9HR1  
//指针…… 6.!aJJLN  
Jv,*rQH  
char a[]=”Hello Word!”; :i?7RouO  
|61W-9;  
char *p; }f l4^F  
CFLWo1  
p=new char[strlen(a)+1]; 0eGz|J*7  
$ $=N'Q  
strcpy(p,a); DOsQVdH  
F*}.0SQ  
if (strcmp(p,a)==0) TFQX}kr]  
^$N}[1   
{} "^Ax}Jr  
?tA<:.<vtY  
q':P9 o*N?  
十二、sizeof的问题 T{USzMj  
^$!H|  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 69/br @j%`  
{o."T/?d'  
char a[]=”Hello World!” nlq"OzcH04  
`|rr<Tsy\  
char *p=a; $:RP tG  
;Y^.SR"  
count<<sizeof(a)<<end; //12字节 z#( `H6n:  
~+~^c|  
count<<sizeof(p)<<endl; //4字节 :L6,=#  
1MPn{#Ff  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 @V7HxW7RX  
M[= #%U3*N  
void fun(char a[1000]) ,&q Q[i  
?a]1$>r  
{  |Ok=aV7  
Y) ig:m]#  
count<<sizeof(a)<<endl; //输出4而不是1000 V6CRl&ZKO  
-Wt (t2  
} $q%l)]+  
 ds#om2)  
(QFu``ae+  
十三、关于指针 H wu (}  
:&'[#%h8  
1、 指针创建时必须被初始化 8%,u~ELA  
mC,:.d  
2、 指针在free 或delete后必须置为NULL Lc?q0x^s  
iiWm>yy  
3、 指针的长度都为4字节 rQ:+LVfXjA  
ukAE7O(W&  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 A4mnm6Tf  
+FGw)>g8'm  
char *p=new char[100]; a^>e| Eq|  
<`P7^ 'z!  
strcpy(p,”Hello World”); .*,W%r?1n6  
l.Yq4qW  
delete []p; //注意前面的[]号 d,:3;:CR  
OV+|j  
p=NULL; xfFsW^w  
U~l.%mui  
5、数组指针的内容不能超过数组指针的最大容易。 SU$%nK)  
Dx*tolF  
如: J^xIfV~ zt  
#sJL"GB  
char *p=new char[5]; -SeHz.` N  
SbX#$; ks~  
strcpy(p,”Hello World”); //报错 目标容易不够大 KM&bu='L^  
)"sJaHx<  
delete []p; //注意前面的[]号 DFvj  
+j!$88%Z{  
p=NULL; }u&,;]  
e'MLLC [  
_2 Hehw  
十四、关于malloc/free 和new /delete .EXxNB]%Y&  
:3 p&h[M  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 ZhnRsn9  
\O G`+"|L  
l 注意:malloc/free是库函数,new/delete是运算符 N&YQZ^o  
^>/] Qi  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 u7G9 eN  
rpn&.#KS  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 y-R:-K XH=  
: kw14?]_  
l 两者都必须要成对使用 "IMq +  
/`H{ n$  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 ;: 4PT~\*  
yh{Wuz=T  
Q~#[_Upkc  
十五、C++的特性 US2Tdmy@05  
&br_opNi  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 NU |vtD  
whb,2=gIE  
重载和内联:即可用于全局函数,也可用于类的成员函数; "Wz74ble  
S<=|i  
Const和Virtual:只可用于类的成员函数; { cMf_qQ  
,.-85isco  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 }&qr"z4  
vI1UFD D  
覆盖是指派生类函数覆盖基类函数 3lG=.yD  
e,I{+ ^P  
函数名相同; t#sw{RO  
b _%W*Q  
参数相同; rwCjNky!  
n.tJ-l5[  
基类函数必须有Virtual关键字; ly)L%hG  
fNNik7  
不同的范围(派生类和基类)。 ^eHf'^Cvvu  
X0+M|8:   
隐藏是指派生类屏蔽了基类的同名函数相同 kf>L  
C Y K W4  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 =[x @BzH  
ptvM>zw'~g  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 = }6l.9  
y+K21(z.  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 HS[N]'dc  
l! 9G  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 u[yUUYe  
zm`^=cV  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 zyF[I6Gs  
n3LCQ:]T f  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 2 }HS`) /  
E])X$:P?  
将void Func(A a) 改为void Func(const A &a)。 -YfpfNt  
N,Ys}qP  
而void func(int a)就没必要改成void func(const int &a); ?Rg8u  
Bp:i[9w  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 `Z!NOC  
b*@y/ e\u`  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 6D n[9V  
kTe0"  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; H;nq4;^yK  
Ls~F4ar$/  
4zw5?$YWO"  
十六、extern“C”有什么作用? _O*"_^6  
c7$U0JO  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 U3zwC5}BN  
$xU5vCwAo  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 %}%vey  
|[]"{Eo"}  
l<l6Ey(  
十七、构造函数与析构函数 *=O~TY<](  
kb>/R/,9  
派生类的构造函数应在初始化表里调用基类的构造函数; >kJEa8  
!b+/zXp3I  
派生类和基类的析构函数应加Virtual关键字。 5lMm8<v  
&v#*  
不要小看构造函数和析构函数,其实编起来还是不容易。 &%/kPF~<  
{Noa4i  
#include <iostream.h> HBc^[fJ^-  
`1$7. ydQ  
class Base Y=#g_(4*  
t6)wR  
{ X)K3X:~L+  
1Lf:TQB  
public: Y :0SrB!\  
Jm+hDZrW  
virtual ~Base() { cout<< "~Base" << endl ; } j+c<0,Kj  
1x^(vn#=  
}; >|[74#}7  
U_UX *  
class Derived : public Base Y M_\ ZK:  
fi2@`37PM  
{ b]NSCu*)s  
m-Uq6_e  
public: J=gerdIk  
ZMHb  
virtual ~Derived() { cout<< "~Derived" << endl ; } s C9j73 vf  
n~#%>C7  
}; ">G|\_ZF  
8W]6/st?]  
void main(void) 0.~Pzg  
)k.[Ve  
{ 'y [eH  
5Z7<X2  
Base * pB = new Derived; // upcast }/yhwijg  
:/BU-SFK^  
delete pB; (=H%VXQH  
u(7PtmV[!  
} l!plw,PYC  
%r0yBK2uOp  
输出结果为: ag-\(i;K]  
?Mg&e/^  
~Derived Bf;dp`(/   
/3! KfG  
~Base ey@]B5  
IRemF@  
如果析构函数不为虚,那么输出结果为 2NLD7A  
m ?a&XZ  
~Base [<Wo7G1s  
XHgwK @GU  
*7C t#GC  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 P"J(O<(1-:  
a W`q  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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