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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 3$M3Q]z  
0vs0*;F;  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 O>DNC-m)i{  
}GHxG9!z  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Sm3u/w!  
]]iO- }  
1 H4fJ3-  
二、头文件的作用 va{#RnU  
P-z`c\Rt  
加强安全检测 ,8K'F  
R U!?-#*  
通过头文件可能方便地调用库功能,而不必关心其实现方式 |ek ak{js  
T|'&K:[TJ  
6`nR5fh  
三、* , &修饰符的位置 6p<`h^  
HD# r0)  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 mv Ov<x;l  
~I_owCVZ  
8<PKKDgbfd  
四、if语句 E[Bo4?s&^  
k&s; {|!  
不要将布尔变量与任何值进行比较,那会很容易出错的。 XQ;I,\m  
['Z{@9  
整形变量必须要有类型相同的值进行比较 Sgj/s~j~1  
)r!e2zc=Q  
浮点变量最好少比点,就算要比也要有值进行限制 V 7<eQ0;m  
Px4/O~bLk  
指针变量要和NULL进行比较,不要和布尔型和整形比较 oNRG25  
NCt~9xS.  
Up?=m^  
五、const和#define的比较 CB}BQd  
;El <%{(  
const有数据类型,#define没有数据类型 H7IW"UkBR  
{7#03k  
个别编译器中const可以进行调试,#define不可以进行调试 WfVMdwz=  
K; kM_%9u  
在类中定义常量有两种方式 T)\NkM&  
-}<g-*m"q  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; snMQ"ju  
+l\<?  
2、 用枚举代替const常量。 T1~)^qQ  
eK_*q -  
;) pl{_  
六、C++函数中值的传递方式 ~$aTM_4  
n9}RW;N+u  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) YF[$Q=7.  
pC^[[5A  
void fun(char c) //pass by value Cd~LsdKE5  
v}`1)BUeF  
void fun(char *str) //pass by pointer 9m!7|(QV  
|cTpw1%I~  
void fun(char &str) //pass by reference ' iQ9hQjD  
_X%Dw  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 yq*JdTF  
fi=?n{e'  
函数的类型不能省略,就算没有也要加个void H-&3}   
zl)&U=4l  
YN#XmX%  
七、函数体中的指针或引用常量不能被返回 :WX0,-Gn  
!C`20,U  
Char *func(void) +i)AS0?d  
/yK"t< p  
{ YX;nMyD?~  
=~,l4g\  
char str[]=”Hello Word”; |\{Nfm=:%  
&z ksRX  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 nEVbfNo0  
aL )Hv k:  
return str; YN^jm  
l\aUresm  
} -A;w$j6*  
Hja^edLj  
函数体内的指针变量并不会随着函数的消亡而自动释放 F@<MT<TRf  
5&(3A|P2  
hho%~^bn(  
八、一个内存拷贝函数的实现体 #Q+R%p  
"WP% REE!  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) )[ b#g(Y(  
`]&*`9IK{  
{ g< )72-h  
MCd F!{  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); J!<#Nc  
v>:=w|.HC  
byte *pbTo=(byte*)pvTo; //防止地址被改变 m+7`\|`jQ  
6`W|V+6|7  
byte *pbFrom=(byte*)pvFrom; D"`[6EN[  
jMqx   
while (size-- >0) 5% 'S  
x Ty7lfSe  
pbTo++ = pbForm++; D+hB[*7Fs  
MC6)=0:KX  
return pvTo; 4L11P  
<vLdBfw&N  
} /Mx.:.A&$  
1W0.Ufl)  
&58 {  
九、内存的分配方式 , | <jjq)  
!c."   
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 {70 Ou}*  
bkkSIl+Q  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 XK3!V|y`  
]'6'<S  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 K7S754m  
O&52o]k5l  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 d[" x= [f  
3Cd<p[%3#,  
[xWEf#', !  
十、内存分配的注意事项 mDlCt_h  
W0U`Kt&~a  
用new或malloc分配内存时,必须要对此指针赋初值。 /t$*W\PL@  
niQ+EAD  
用delete 或free释放内存后,必须要将指针指向NULL i<bxc  
5U3qr*/;m  
不能修改指向常量的指针数据 J+0/ :00(  
)FV6,  
1O23"o5=  
十一、内容复制与比较 s9G)Bd 8  
oFb\T iLu  
//数组…… &b!vWX1N  
` %l&zwj>  
char a[]=”Hello Word!”; '%);%y@v  
Xn PJC'  
char b[10]; u*U_7Uw$  
A%P 8c  
strcpy(b,a); \4/:^T}*  
VZt;P%1;h  
if (strcmp(a,b)==0) \u{Jf'g  
R !Fx)xj  
{} G I&qwA  
An/>0 5|  
//指针…… 9}.,2JE  
j6RJC  
char a[]=”Hello Word!”; Lblet  
+{ S Maq  
char *p; L!?v BL  
2 ae w6~  
p=new char[strlen(a)+1]; `!<x"xKu  
2.!1kije  
strcpy(p,a); F9v)R #u~  
"OVi /:*B  
if (strcmp(p,a)==0) 0 -!?W  
`S5>0r5[  
{} g%+ql[(4  
,eyp$^2  
V/@[%w=  
十二、sizeof的问题 fYb KmB  
<=$rU232}  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 SgyqmYTvZw  
23)F-.C}j  
char a[]=”Hello World!” E1^aAlVSD  
(_s;aK  
char *p=a; B,r5kQI4  
V[4(~,9  
count<<sizeof(a)<<end; //12字节 KSF5)CZ5  
G% o7BX  
count<<sizeof(p)<<endl; //4字节 H]Y#pL u|  
i<'{Y  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 ~K4k'   
$,}Qf0(S  
void fun(char a[1000]) ) )fDOJ  
9)#gtDM%J  
{ f&=K]:WDe  
jM6uT'Io  
count<<sizeof(a)<<endl; //输出4而不是1000 bta0? O #  
UENYJ*tnP  
} jQY >9+t  
-[G/2F'  
[[#xES21F  
十三、关于指针 GTT5<diw  
U p_>y>x  
1、 指针创建时必须被初始化 Ngn\nkf  
;Gjv9:hUn  
2、 指针在free 或delete后必须置为NULL jB*9 !xrd,  
5}<.1ab3V  
3、 指针的长度都为4字节 z\X60T  
H?rSP0.  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 #&;m<%  
E6,`Ld;c[  
char *p=new char[100]; OJnPP>  
-OHvK0~  
strcpy(p,”Hello World”); pI'8>_o  
;5&k/CB1  
delete []p; //注意前面的[]号 '=KuJ0`nE9  
Wpiv1GZ%c8  
p=NULL; HR/k{"8W4Q  
L#@l(8.  
5、数组指针的内容不能超过数组指针的最大容易。 , LCH2r  
PpX{+^z-%  
如: L-^# 02  
 Bq~AU#  
char *p=new char[5]; \W3+VG2cA  
s#'|{  
strcpy(p,”Hello World”); //报错 目标容易不够大 "r5'lQI  
[{hLF9yPx  
delete []p; //注意前面的[]号 6^7)GCq [  
U'JP1\  
p=NULL; Y9z:xE  
s98: *o3  
D<+ bzC  
十四、关于malloc/free 和new /delete U)&H.^@r$  
$M:4\E5(  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 [V!^\g\6  
Ws2prh^e(  
l 注意:malloc/free是库函数,new/delete是运算符  9OrA9r  
FE$M[^1_  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 9$B)hrJo  
`XQx$I  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 ;`X`c  
J>,'P^  
l 两者都必须要成对使用 |U;w!0  
5^G7pI7  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 N[|by}@n  
h$#4ebp  
(.jO:#eE%  
十五、C++的特性 ?^e*UJNM  
n?TO!5RZK  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 ;Xnk+  
f~n' Ki+'  
重载和内联:即可用于全局函数,也可用于类的成员函数; RW|UQY#  
<8F->k1"3  
Const和Virtual:只可用于类的成员函数; 2dp*>F0L  
20SF<V  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 I1eb31<  
hr/xpQW  
覆盖是指派生类函数覆盖基类函数 mI _ 6f~  
;ph+ZV  
函数名相同; DYy@t^sC  
LaAgoarN  
参数相同; .HH,l  
S4@117z5  
基类函数必须有Virtual关键字; yKX:Z4I/  
vZ1D3ytfG  
不同的范围(派生类和基类)。 s5_1}KKCs  
^^j|0qshL  
隐藏是指派生类屏蔽了基类的同名函数相同 J8`1V `$  
tA;ZW2$#  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 bKZAJLnd  
m%BMd  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 jS5t?0  
f"} 0j|Gg  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 ;I0yQlx|U  
a8lo!e9q  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 'xu7AKpU)  
ul5::  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 A_X^k|)T  
IArpCF/"8  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: uMq\];7I  
6 ^6uK  
将void Func(A a) 改为void Func(const A &a)。 cSHtl<UY  
B<|q{D$N/  
而void func(int a)就没必要改成void func(const int &a); $yR{ZFo  
@eG#%6">  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 ^YB\\a9  
T^f&58{ 7  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 NZi'eZ{^`  
\a~;8):q=i  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; XH_qA[=c]  
Cbf,X[u  
:">~(Rd ZH  
十六、extern“C”有什么作用? *I;Mp  
$yxIE}  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 CO6XIgTe  
zL[U;  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 @N:3`[oB  
m8j#{[NE  
:jN;l  
十七、构造函数与析构函数 G41$oalQ1  
G1n>@Y'j''  
派生类的构造函数应在初始化表里调用基类的构造函数; g'l7Jr3  
Q%b46"  
派生类和基类的析构函数应加Virtual关键字。 (t"YoWA#m  
PHB\)/  
不要小看构造函数和析构函数,其实编起来还是不容易。 *< SU_dAh  
N]<~NG:6b  
#include <iostream.h> F0o18k_"  
Ov{B-zCA  
class Base J3!k*"P  
f|HgLFx  
{ 8mQd*GGu1  
mSvTnd8  
public: nG(|7x   
Xb07 l3UG  
virtual ~Base() { cout<< "~Base" << endl ; } )I0g&e^Tzy  
b "AHw?5F  
}; v*T@ <]f3j  
;tIIEc  
class Derived : public Base 0$dY;,Q.  
'rcsK  
{ | Y,X=Ed  
XQ?)  
public: W1M/Z[h6)5  
KTS7)2ci  
virtual ~Derived() { cout<< "~Derived" << endl ; } h11bK'TIv  
f<x t3  
}; @o-evH;G  
rt4|GVa  
void main(void) s13 d*  
rH9|JEz  
{ {Ac3/UM/  
h: (l+jr  
Base * pB = new Derived; // upcast kv`3Y0R-"  
R|^t~h-  
delete pB; BtDgv.;GH  
HoQ(1e$G-  
} <MDFf nj  
c9TkIe  
输出结果为: >5YYij5Aj  
s!zr>N"  
~Derived 1,sO =p)Yg  
_KlPbyLU  
~Base )Z`viT  
.~/;v~bL  
如果析构函数不为虚,那么输出结果为 }N=zn7W  
I5AjEp  
~Base jq]\oY8y  
]{l O  
;Q%19f3,6  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 ckkM)|kK  
p RfHbPV?  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

您目前还是游客,请 登录 或 注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八