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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 Vbp@n  
XkqsL0\  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 U~yPQ8jD  
5g-1pzP9  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 l^bak]9 1  
vqT) =ZC1  
cLL2 '  
二、头文件的作用 >wqWIw.w>  
+76ao7d.  
加强安全检测 ?H_@/?  
"})OLa  
通过头文件可能方便地调用库功能,而不必关心其实现方式 V_$<^z|  
'>|K d{J0  
*^[6uaa  
三、* , &修饰符的位置 ckFPx l.  
x4kQGe(  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ]lGkZyU hI  
NKFeND  
<Af&Q0J  
四、if语句 #s\yO~F-  
`dX0F=Ag?  
不要将布尔变量与任何值进行比较,那会很容易出错的。 6W YVHG  
Z"Lr5'}  
整形变量必须要有类型相同的值进行比较 =jm\8sl~~  
Ew.6y=Ba  
浮点变量最好少比点,就算要比也要有值进行限制 w]xr ~D+  
#lMIs4i.  
指针变量要和NULL进行比较,不要和布尔型和整形比较 w$&;s<0  
.u&X:jOE  
=[aiW|Y  
五、const和#define的比较 :##$-K*W"  
y]R+/  
const有数据类型,#define没有数据类型 vD#kH 1  
~FAk4z=Ed  
个别编译器中const可以进行调试,#define不可以进行调试 = YO<.(Lu  
J0&-UnJ  
在类中定义常量有两种方式 (g[WZB3x  
#G(ivRo  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; E Y !o#m  
e:MbMj6`  
2、 用枚举代替const常量。 /: -&b#+  
'e<8j  
FU*q9s`  
六、C++函数中值的传递方式 PQ_A^95  
AwuhF PG  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) be-HF;lZe'  
@`B_Q v@  
void fun(char c) //pass by value UT{`'#iT  
w `d9" n  
void fun(char *str) //pass by pointer H0B=X l[  
dhP")@3K;p  
void fun(char &str) //pass by reference '?I3&lYz{  
Lf<urIF  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 s4f{ziLp  
PpLh j  
函数的类型不能省略,就算没有也要加个void hd/'>]  
+:aNgO#e8  
e+#k\x   
七、函数体中的指针或引用常量不能被返回 _'y`hKeI[  
W4P\HM>2  
Char *func(void) q3v5gz^t  
(u@X5O(a  
{ c*<BU6y  
C %j%>X`  
char str[]=”Hello Word”; pIpdVKen  
lOb(XH9  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 S 1~EJa5H  
<f)T*E^5%  
return str; @|w/`!}9q  
x@)cj  
} M.qv'zV`xG  
qOQ8a:]?  
函数体内的指针变量并不会随着函数的消亡而自动释放 H;AMRL o4z  
%)d7iT~M  
`25<;@  
八、一个内存拷贝函数的实现体 )3|a_   
p74Nd4U$s  
void *memcpy(void *pvTo,const void *pvFrom,size_t size)  |#xBC+  
3H>\hZ  
{ P%R9\iajH  
;ioF'ov  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); Zf??/+[  
BVus3Y5IJQ  
byte *pbTo=(byte*)pvTo; //防止地址被改变 BSr#;;\  
c1R[Hck  
byte *pbFrom=(byte*)pvFrom; PN J&{4wY  
HHgv, bC!  
while (size-- >0) 23ho uS   
spQr1hx<  
pbTo++ = pbForm++; ^)`e}}  
2"}Vfy  
return pvTo; Ed_Fx'  
t1yfSStp  
} >@a7Zzl0H  
F_/ra?WVH  
9@Cu5U]  
九、内存的分配方式 eQ[}ALIq  
;jPiD`Kyv  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 5w~J"P6jg  
c;a<nTLn  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 V4n;N  
~(Q#G" t  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 d mTZEO  
<wd;W;B  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 ?} E M,  
%SCt_9u  
/#t::b+>x  
十、内存分配的注意事项 1@TL>jq  
/&czaAR-  
用new或malloc分配内存时,必须要对此指针赋初值。 ;Vf{3  
5vS[{;<&  
用delete 或free释放内存后,必须要将指针指向NULL tU!Yg"4Q  
fb[lL7  
不能修改指向常量的指针数据 Zrgv*  
+.rOqkxJ  
k3Puq1H  
十一、内容复制与比较 {}RU'<D  
{z;K0  
//数组…… 0#m=76[b  
NP4u/C<  
char a[]=”Hello Word!”; f1U8 b*F<  
v7hw%9(=  
char b[10]; m9D Tz$S.  
VT~%);.#  
strcpy(b,a); dd +lQJ c  
k#/cdK!K  
if (strcmp(a,b)==0) #2Vq"Zn  
p)m5|GH24  
{} w~=xO_%  
#IDLfQ5g  
//指针…… ,S`F xJcE  
DH i@ujr  
char a[]=”Hello Word!”; <{YzmN\Z  
;v.J D7  
char *p; .SSyW{a3w  
]HXHz(?;F  
p=new char[strlen(a)+1]; X1[zkb  
cT&lkS  
strcpy(p,a); ~Dw% d;  
 =Uo*-EH  
if (strcmp(p,a)==0) ,":_CY4(  
^Q+z^zlC  
{} q['3M<q  
,C_MB1u  
YV>&v.x0;  
十二、sizeof的问题 _)YB*z5  
%503 <j  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 XgeUS;qtta  
L`9.Gf  
char a[]=”Hello World!” 7:JGrO  
bwszfPM  
char *p=a; *&+zI$u(  
^'+#BPo9@  
count<<sizeof(a)<<end; //12字节 %t74*cX  
u{D]Kc?n  
count<<sizeof(p)<<endl; //4字节 Ri::Ek3qu  
WOeLn[  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 v5?ct?q  
 Yg2P(  
void fun(char a[1000]) hew"p(`  
GyFA1%(o  
{ Q+_z*  
`@u9 fx.  
count<<sizeof(a)<<endl; //输出4而不是1000 =n@\m <  
BXz g33  
} m<*+^JN  
+<B"g{dLuX  
q$ j  
十三、关于指针 iHQ$L# 7  
g~9b_PY9  
1、 指针创建时必须被初始化 EF9Y=(0|  
q,;wD1_wG  
2、 指针在free 或delete后必须置为NULL W58%Zz4a  
?Ho>  
3、 指针的长度都为4字节 +-5YmN'  
C?<-`$0  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 K]dR%j  
e$rPXRf  
char *p=new char[100]; $_\x}`c~.  
<R_)[{ 7  
strcpy(p,”Hello World”); #60gjHYaV  
;W\?lGOs{  
delete []p; //注意前面的[]号 3+iryW(\  
Cj YI *  
p=NULL; dAM]ZR<  
?@6Zv$vZ  
5、数组指针的内容不能超过数组指针的最大容易。 - _ %~b  
NJQy*~P  
如: $}us+hGZ  
hVd_1|/X  
char *p=new char[5]; =OTu8_ d0t  
)?6%d  
strcpy(p,”Hello World”); //报错 目标容易不够大 :$P1ps3B  
w2lO[o~x}  
delete []p; //注意前面的[]号 'UuHyC2Ha3  
z+zEH9.'  
p=NULL; HTm`_}G9  
1vJj?Uqc  
rcH{"\F_/  
十四、关于malloc/free 和new /delete h$%h w+"4  
d(KK7SQg  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 KYz@H#M  
"2 :zWh7|  
l 注意:malloc/free是库函数,new/delete是运算符 LIyb+rH#yg  
-%V~ 1  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 M<Dvhy[  
 um2}XI  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 gplrJaH@  
f=8{cK0j  
l 两者都必须要成对使用 ~I~lb/  
( iJ /  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 OO,EUOh-T:  
QpS7 nGev  
#GUD^#Jh  
十五、C++的特性 8VC%4+.FF  
T!^v^m@>y  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 l701$>>  
rdAy '38g  
重载和内联:即可用于全局函数,也可用于类的成员函数; 3[ xHY@c  
!lM.1gTTC  
Const和Virtual:只可用于类的成员函数; ,&Vir)S  
'X ?Iho  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 FiXqypT_(  
D/,(xWaT  
覆盖是指派生类函数覆盖基类函数 sG^{ cn  
O.-A)S@  
函数名相同; *R7bI?ow  
Q~KzcB<  
参数相同; J-5kvQi8  
%:OX^ ^i;  
基类函数必须有Virtual关键字; SQMtR2  
b%0@nu4  
不同的范围(派生类和基类)。 XQtV$Lw  
vV"I}L  
隐藏是指派生类屏蔽了基类的同名函数相同 +HgyM0LFg  
0vMKyT3 c  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 r-Y7wM`TZ  
BbPRPkV  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 :% +9y @%  
o'Y/0hkh  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 w?Cho</Xu  
uh>"TeOi  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 [<d_#(]h'  
Y3 -f68*(  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 Q:'r p  
*&V"x=ba,  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 9Sl5jn  
}j!C+i  
将void Func(A a) 改为void Func(const A &a)。 CdtCxy5  
mXyg\5  
而void func(int a)就没必要改成void func(const int &a); BA8!NR|  
C^:{y  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 1 qp"D_h  
y'z9Ya  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 8m#y>`  
6}Rb-\N  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; bw!*=<  
Ylgr]?Db*  
7|o}m}yVx  
十六、extern“C”有什么作用? m/< @Qw  
ofsLx6Po  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 GgE 38~A4  
xlh<}V tp  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 s{42_O?,c  
V?-2FK]  
~D`  
十七、构造函数与析构函数 E 5mYFVK  
FV/lBWiQQ  
派生类的构造函数应在初始化表里调用基类的构造函数; [+!+Yn6:  
57_AJT hR  
派生类和基类的析构函数应加Virtual关键字。 vYq"W%  
zy|h1 .gd  
不要小看构造函数和析构函数,其实编起来还是不容易。 ll?Qg%V[t  
:4LWm<P  
#include <iostream.h> $&i8/pD  
jLw|F-v-l<  
class Base Zq:c2/\c}  
_,f7D/dq  
{ L D%SLJ:  
{s=c!08=  
public: .k%/JF91n  
AXv-%k};  
virtual ~Base() { cout<< "~Base" << endl ; } @ *5+ZAF  
aPX'CG4m  
}; cs[nFfM  
08g2? 5w"  
class Derived : public Base $^YHyfh  
Jn9 {@??  
{ is^5TL%@  
J6@RIia  
public: <<-BQ l~  
/PG%Y]l0b  
virtual ~Derived() { cout<< "~Derived" << endl ; } 474 oVdGx  
u]]mbER*t#  
}; 4y $okn\}i  
FS*J8)  
void main(void) (@=h(u.  
}^*`&Lh  
{ G}aM~,v  
y`cL3 xr4R  
Base * pB = new Derived; // upcast V|<'o<h8  
f{|n/j;n=C  
delete pB; 7Oi<_b  
7lr;S(C  
} Dj3,SJ*x  
7_eV.'h  
输出结果为: XMaw:Fgr  
;R3o$ZlY  
~Derived IU"8.(;o  
2/x~w~3U  
~Base :]LW,Eql  
QHtN_Q_F  
如果析构函数不为虚,那么输出结果为 E_{P^7Z|Jg  
TjpAJW@-  
~Base :\%hv>}|  
v2YU2-X[  
]|[mwC4  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 'G`xD3 E3,  
9MbF:  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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