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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 5!V%0EQqw  
@Lk!nP  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 Uz$.sa  
(Ee5Af,4  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 (Rs052m1  
LZ-&qh  
<yg! D21Y  
二、头文件的作用 n5s2\(  
UY~N4IR8  
加强安全检测 <!G%P4)  
+DwE~l  
通过头文件可能方便地调用库功能,而不必关心其实现方式 /kH 7I  
dh0nB  
I:=rwnd  
三、* , &修饰符的位置 dW#T1mB  
{"WfA  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 j[Z<|Da  
}[mLtv%&  
PHU$<>  
四、if语句 HF;$Wf+=J  
#Mm1yXNu  
不要将布尔变量与任何值进行比较,那会很容易出错的。 &OXm^f)K  
D&-cNxh  
整形变量必须要有类型相同的值进行比较 7 <<`9,  
q .s'z}  
浮点变量最好少比点,就算要比也要有值进行限制 }-N4D"d4o  
F9Co m}  
指针变量要和NULL进行比较,不要和布尔型和整形比较 6R'z3[K9  
?)V|L~/  
r(OH  
五、const和#define的比较 CAbR+ y  
Y{D?&x%yq  
const有数据类型,#define没有数据类型 PUbfQg  
# ~(lY}  
个别编译器中const可以进行调试,#define不可以进行调试 opfg %*  
v7b +  
在类中定义常量有两种方式 . ytxe!O  
a%*W( 4=Y  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; }P\J?8  
#I}w$j i  
2、 用枚举代替const常量。 W'{o`O=GGr  
)Nt'Z*K*  
pv"QgH  
六、C++函数中值的传递方式 z*e`2n#\  
B+4WnR1%T  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) M~l\rg8  
-58Sb"f  
void fun(char c) //pass by value r,Tq";N'  
q_86nvB<  
void fun(char *str) //pass by pointer OfPv'rW{x  
 N~vK8j@  
void fun(char &str) //pass by reference AB=Wj*f r  
-GODM128 ^  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 /RemLJP F  
>=K~*$&>  
函数的类型不能省略,就算没有也要加个void :V~ AjV  
8SOfX^;o  
v9MliD'  
七、函数体中的指针或引用常量不能被返回 }iRRf_   
1 &-%<o  
Char *func(void) vRMGNz_P7[  
>A>_UT_"  
{ _#y=T20'3  
@m+FAdA 0  
char str[]=”Hello Word”; 8d[!"lL  
iJSyi;l|  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 6F; |x  
p+}eP|N  
return str; 6ANA oWg*  
>2ny/AK|  
} q DPl( WXb  
`P jS  
函数体内的指针变量并不会随着函数的消亡而自动释放 Lm7fz9F%  
FF~VV<a  
q8H9au&/  
八、一个内存拷贝函数的实现体 l 9bg  
;\ gat)0n%  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) [m6%_3zV  
<4Ik]Uz^  
{ jBU!xCO  
Ns6C xE9  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); uO4R5F|tL  
15ImwQ  
byte *pbTo=(byte*)pvTo; //防止地址被改变 T;#:Y  
dF'oZQz  
byte *pbFrom=(byte*)pvFrom; !Q{~f;L  
0pA>w8mh  
while (size-- >0) H iEQs|""'  
?<~P)aVVj  
pbTo++ = pbForm++; qhOV>j,d  
vjd;*ORB  
return pvTo; #R# |hw  
gPF5|% 3)  
} :s#&nY  
ZqfoO!Ta  
PY[!H<tt  
九、内存的分配方式 ,S-zY\XB  
`sM^m`yE  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 L87=*_!B;  
]lA.?  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 2fG[q3`  
"2GssBa  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 {%QWv%|  
vf?m-wh  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 ` W{y  
I=|}%WO#  
J#Agk^Y 5  
十、内存分配的注意事项 5 0<  
0ae}!LO  
用new或malloc分配内存时,必须要对此指针赋初值。 `:5W1D(  
AUPTtc`#Y  
用delete 或free释放内存后,必须要将指针指向NULL tV9K5ON  
L%fJH_$_s  
不能修改指向常量的指针数据 ;\gHFG}  
$<d3g :  
<26Jif:  
十一、内容复制与比较 -](3iPy}  
U&L?IT=x  
//数组…… O*PJr[Zou  
W(jP??up  
char a[]=”Hello Word!”; tkf^sGgNO  
dPyZzMes=  
char b[10]; YHI@Cj  
8&++S> <  
strcpy(b,a); #<gD@Jybu  
HsAKz]Mq  
if (strcmp(a,b)==0) H6i;MQ  
R2dCp|6A  
{} <amdPo+2D  
R;F z"J  
//指针…… VB@M=ShKK  
w[s}#Q  
char a[]=”Hello Word!”; %<;PEQQ|C  
gIcm`5+T  
char *p; Ugv"A;l  
~\[\S!"  
p=new char[strlen(a)+1]; fz`\-"f]  
[ h~#5x  
strcpy(p,a); Gcd'- 1  
[:bYd}J  
if (strcmp(p,a)==0) j$}W%ibj  
QHbjZJ N  
{} Hy#<fKz`!  
.eG_>2'1  
p^?]xD(  
十二、sizeof的问题 ^.(i!BG'  
D|X@aUp 8}  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 !&@!:=X,  
QOKE9R#Y  
char a[]=”Hello World!” D7OPFN 7`  
yZqX[U  
char *p=a; Ah1fcXED  
S_Ug=8r4  
count<<sizeof(a)<<end; //12字节 Nt P=m @  
v="2p8@F  
count<<sizeof(p)<<endl; //4字节 [Z{0|NR  
0Nq6>^ %  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 Q*l_QnfG  
ad'C&^o5  
void fun(char a[1000]) pTIE.:g(  
-KFozwr5/  
{ @#KZ2^  
^{w]r5d  
count<<sizeof(a)<<endl; //输出4而不是1000 E>3(ff&  
\KT}T  
} q8P$Md-=b1  
&kNJ s{  
j3)fmlA  
十三、关于指针 kSH|+K\M4  
Pq)C(Z  
1、 指针创建时必须被初始化 6A*k  
,pMH`  
2、 指针在free 或delete后必须置为NULL fKjUEMRK  
K!BS?n;  
3、 指针的长度都为4字节 MNZD-[  
.Pi8c[  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 D+xHTQNTL  
={gfx;  
char *p=new char[100]; '}.Z' %;  
kqyPb$Wy  
strcpy(p,”Hello World”); >{huaN B  
jj8h>"d  
delete []p; //注意前面的[]号 ?5MOp  
O6Jn$'os1#  
p=NULL; + 4*jO5EZ  
y7WO:X&  
5、数组指针的内容不能超过数组指针的最大容易。 s6| S#  
^YwTO/Q|  
如: / 1R` E9  
tNbZ{=I>  
char *p=new char[5]; o2#_CdU   
cop \o4ia  
strcpy(p,”Hello World”); //报错 目标容易不够大 N#"(  
qKL mL2O  
delete []p; //注意前面的[]号 Y6r<+#V  
YdNmnB %J  
p=NULL; ofIw7D*h  
T0=%RID%=  
XlGDv*d:#d  
十四、关于malloc/free 和new /delete S eTn]  
N5\]VCX  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 ~v+A6N:qC  
"hi)p9 _cR  
l 注意:malloc/free是库函数,new/delete是运算符 2J5RZg9jL  
 8%W(",nd  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 xvx+a0 A  
WY 'QhieH  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 6o4Bf| E]  
%;-] HI  
l 两者都必须要成对使用 Oj?  |g_  
+#a_Y  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 i{+W62k*  
u|}p3-z|Y  
B(TE?[ #  
十五、C++的特性 jj$D6f/mOG  
ub,GF?9  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 ZN `D!e6  
pX~X{JTaL)  
重载和内联:即可用于全局函数,也可用于类的成员函数; 6mAaFDI,R  
&W@#p G  
Const和Virtual:只可用于类的成员函数; k9Xv@v  
-0 o1iU7  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 >.X& v  
zm7IkYF  
覆盖是指派生类函数覆盖基类函数 fCa*#ME  
V+'C71-P  
函数名相同; y/(60H,{{  
d=v{3*a_4,  
参数相同; \p%,g& ^ x  
wYLi4jYm  
基类函数必须有Virtual关键字; 0 P]+/  
MJDW-KL-  
不同的范围(派生类和基类)。 Q?uHdmY*X  
Z>)M{25  
隐藏是指派生类屏蔽了基类的同名函数相同 -m"9v%>Y  
z +NwGVk3  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 Q6lC:cB<  
2#hfBJg@  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 oZCjci-  
M8p6f)l3  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 e#/SFI0m  
ZqK1|/\ rh  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 _d`)N  
} S,KUH.  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 ]b6gZ<  
yy(.|  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: Q%Fa1h:2&  
WH6Bs=G\}  
将void Func(A a) 改为void Func(const A &a)。 #vs=yR/tn{  
![l`@NH[U  
而void func(int a)就没必要改成void func(const int &a); $(=0J*ND"  
XQhbH^  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 ["65\GI?  
2k]Jkd,E  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 dum(T  
S+* g  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 8uD%  
&o]ic(74c?  
c*c 8S~6  
十六、extern“C”有什么作用? ~qu}<u)P  
D]StDOmM  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 YM<F7tp4  
Gj ka %  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 31)eDs  
>5c38D7k)  
k0^t$J W  
十七、构造函数与析构函数 =f\BAi  
sG K7Uy  
派生类的构造函数应在初始化表里调用基类的构造函数; d"U'\ID2y  
f~ -qjEWm  
派生类和基类的析构函数应加Virtual关键字。 5`QN<4?%  
eX3|<Bf  
不要小看构造函数和析构函数,其实编起来还是不容易。 FNy-&{P2  
U3OXO 1  
#include <iostream.h> JuM4Njz|  
#-{^={p "  
class Base I\WBPI  
dR@XwEpP  
{ \F5d p  
K^f&+`v6_  
public: trm-&e7q?;  
3"HX':8x  
virtual ~Base() { cout<< "~Base" << endl ; } \yKYBfp-p  
t=BXuFiu  
}; m&{%6  
~;D5j) 9I  
class Derived : public Base uz'MUT(68  
RQQ\y`h`  
{ sHn-#SGm  
,WgEl4  
public: t^5xq8w8  
gt|:K)[,6  
virtual ~Derived() { cout<< "~Derived" << endl ; } ''3b[<  
?f&O4H  
}; 8h'*[-]70u  
,cCBAO ueO  
void main(void) DC+l3N  
m>&:)K}m  
{ R!y`p:O C  
>(BAIjF E\  
Base * pB = new Derived; // upcast E;-*LT&{  
vH)V\V  
delete pB; .F^372hH3  
;JV(!8[  
} rGUu K0L&  
07#e{   
输出结果为: }y&tF'qG  
_,bDv`>Ra  
~Derived ukwO%JAr  
h;JO"J@H  
~Base ;q&2$Mb  
cVuT|b^  
如果析构函数不为虚,那么输出结果为 "?r_A*U  
r9y(j z  
~Base X3Yi|dyn T  
u)9YRMl  
Y wu > k  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 )=5 ,S~IT  
6O| rI>D  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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