一、#include “filename.h”和#include <filename.h>的区别 R?Q@)POW
,diV;d
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 K`@GNT&
eb)S<%R/
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 QH%{r4
OwQ 9y<v
3
SQ_9{
二、头文件的作用 OX?9 3AlG
>29eu^~nh
加强安全检测 Z<|caT]Q(
P$)9osr
通过头文件可能方便地调用库功能,而不必关心其实现方式 x
c-=;|s
4.3Bz1p
i)0*J?l=
三、* , &修饰符的位置 'PlKCn`(w
IjDG
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ~`{HWmah
U3^T.i"R
+MQf2|--
四、if语句 A;h0BQm/j
I/GZ
不要将布尔变量与任何值进行比较,那会很容易出错的。 %f@VOSs
C/[2?[
整形变量必须要有类型相同的值进行比较 Z$,1Tk"O/s
dox QS ohS
浮点变量最好少比点,就算要比也要有值进行限制 "$#x+|PyC
-{ZTp8P>
指针变量要和NULL进行比较,不要和布尔型和整形比较 AdB5D_ Ir
.l*]W!L]
*kxk@(lT?
五、const和#define的比较 6yF4%Sz9
B{|P}fN5}
const有数据类型,#define没有数据类型 =?57*=]0M
_-Aw`<_*-
个别编译器中const可以进行调试,#define不可以进行调试 fZXJPy;n
5-w6(uu
在类中定义常量有两种方式 xGqe )M>8?
a'Qy]P}'Ug
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; LIVVb"V|,
/PIU@$DV
2、 用枚举代替const常量。 >.#uoW4ZV
JPiC/
k-T_,1l{
六、C++函数中值的传递方式 \nx^=4*yk
Xt8;Pl
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) C
did*hxJ
o)?"P;UhJX
void fun(char c) //pass by value [/*854
|n=kYs
void fun(char *str) //pass by pointer ,_Fq*6
@}x)>tqD
void fun(char &str) //pass by reference bsPw Tp^
.dp~%!"Sn,
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 x-Z`^O
:%A1k2
函数的类型不能省略,就算没有也要加个void ix]3t^
@^;WC+\0
%I%F
!M
七、函数体中的指针或引用常量不能被返回 '8k\a{t_z
(1(3:)@S6
Char *func(void) mw`%xID*
\J-O b
{ ?i(Tc!
pp#Kb 2*
char str[]=”Hello Word”; GwwxSB&y
4I^6[{_
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 _e8@y{/~Fd
?YgK]IxD
return str; 4\2p8__
+]CKu$,8
} IVkKmO(qO
bR*T}w$<
函数体内的指针变量并不会随着函数的消亡而自动释放 $z{HNY*2
/43DR;4
ssi{(}H/Jv
八、一个内存拷贝函数的实现体 JO7IzD\
BaiC;&(
void *memcpy(void *pvTo,const void *pvFrom,size_t size) YT,1E>rd
`U!eh1*b
{ ED"5y
`-s+ zG
assert((pvTo!=NULL)&&(pvFrom!=NULL)); R`ZU'|
< W/-[ M
byte *pbTo=(byte*)pvTo; //防止地址被改变 /n?5J`6
**-%5~
byte *pbFrom=(byte*)pvFrom; ?$;_a%v6
vo uQ.utl
while (size-- >0) .(CzsupY_q
tmK@Veb*a'
pbTo++ = pbForm++; k'%c| kx8U
\#2,1W@
return pvTo; ?_W "=WpC
D}cq_|mmn[
} G5=(3 V%
U`:#+8h-}
5:CC\!&QBV
九、内存的分配方式 >eAlz4
LD_aJ^(d
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 A0O$B7ylQ
V[+ Pb]
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 Cl<`uW3
SP
HeI@i
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 I^M3>}p
}
%S1OQC
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 A[ /0on5r
'4dnC2a]
$hndb+6q
十、内存分配的注意事项 HQ@X"y
n
gl.P#7X
用new或malloc分配内存时,必须要对此指针赋初值。 *[W! ng
4=F~^Xc`
用delete 或free释放内存后,必须要将指针指向NULL t}nZrD
_rs!6tp
不能修改指向常量的指针数据 9<[RXY
lJKhP
XuR!9x^5
十一、内容复制与比较 3{d1Jk/S
rI;e!EW
//数组…… $3Wl~
G}
'n!;7*
char a[]=”Hello Word!”; 0
"pm7
"M_X9n_
char b[10]; <diI*H<G
pgU54Ef
strcpy(b,a); GsqrKrbJ
8EbYk2j
if (strcmp(a,b)==0) Zn#ri 8S
f} }Bb8
{} 8C4Tyms
K{M_ 4'\
//指针…… Xb$)}n\9
_a15R/S
char a[]=”Hello Word!”; T{sw{E*
qUpMq:Uw
char *p; ]jY->NsA]
BR5$;-7W
p=new char[strlen(a)+1]; cQ3Dk<GZ
qZ_^#%zO
strcpy(p,a); z<^HohT
eg?vYW
if (strcmp(p,a)==0) ru'Xet
^!pagt^
{} Fo?2nQ<
u@|GQXC
Pb]s+1
十二、sizeof的问题 .~W7{SY[
,"j|0Q
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 ix7N q7!N
bmt2~!
char a[]=”Hello World!” wG^{Jf&@$
[(#ncR8B
char *p=a; )
I-8.
w?!@fu
count<<sizeof(a)<<end; //12字节 UnW,|n8
s`H}NjWx
count<<sizeof(p)<<endl; //4字节 @#8F5G#
j24BB}mBB
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 {CQA@p:Y}
m:p1O3[R
void fun(char a[1000]) `n5)oU2q
YEVH?`G
{ #@y4/JS&2
42#
rhgW
count<<sizeof(a)<<endl; //输出4而不是1000 'Ur$jW
)W*S6}A
} 8#7z5:_
!\?? [1_e
v9M;W+J
十三、关于指针 "hs`Y4U
/A<L
1、 指针创建时必须被初始化 2,NQ(c_c$
EVRg/{X
2、 指针在free 或delete后必须置为NULL kCN9`9XI{
,VJ0J!@
3、 指针的长度都为4字节 bS*
"C,b~s
AbLOq@lrK
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 V/762&2X
8Jxo;Y
char *p=new char[100]; /0"Y.
@L
/o8h1L=
strcpy(p,”Hello World”); 7c+TS--
%Vive2j C
delete []p; //注意前面的[]号 %3z-^#B=
MK~viSgi
p=NULL; /p X\)wi
Ds0^/bYp&
5、数组指针的内容不能超过数组指针的最大容易。 Cd6^aFoK!
0QEVL6gw
如: UKk~)Of
;wTl#\|w0
char *p=new char[5]; m./lrz
oryoGy=(yk
strcpy(p,”Hello World”); //报错 目标容易不够大 }1d
6d3b
C4Bh#C
delete []p; //注意前面的[]号 {!'AR`|
g4I(uEJk
p=NULL; *Pw;;#\B
mm:\a-8j
Os?~U/
十四、关于malloc/free 和new /delete 8BLtTpu
"{L%5:H@
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 AP/5,M<
yy/wSk
l 注意:malloc/free是库函数,new/delete是运算符 Ngh9+b6[
Q@/wn
l malloc/free不能执行构造函数与析构函数,而new/delete可以 !cp
,OrO\
dbE $T
l new/delete不能在C上运行,所以malloc/free不能被淘汰 K.b-8NIUW
ddlLS
l 两者都必须要成对使用 eNN% %Q
V:My1R0
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 H%Q@DW8~@
(K^9$w]tf
7(Y!w8q&^
十五、C++的特性 _YO`x
R;'Pe>
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 q=UKL`;C}U
IqcPml{\
重载和内联:即可用于全局函数,也可用于类的成员函数; }_gCWz-5?
c?>Q!sC
Const和Virtual:只可用于类的成员函数; XSn^$$S
:6N{~ [:4
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 fLct!H3
Fgt/A#`fz
覆盖是指派生类函数覆盖基类函数 OHM.xw*?.
xREqcH,vU
函数名相同; 3DMfR
ofg
|giK]Z
参数相同; t<~riFs]
:}e*3={4
基类函数必须有Virtual关键字; ?Z*LTsPr
,?<jue/bd
不同的范围(派生类和基类)。 y%`^*E&
!|!:MYn
隐藏是指派生类屏蔽了基类的同名函数相同 Wi
hQj
gWv/3hWWB
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 @H1pPr
>77
/e@
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 =>4>Z_q
K?(ls$
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 }bAd@a9>3
X -w#E3
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 r >u0Y
Yg<o 9x$
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 86vk"
.LN&EfMenF
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 9k& lq$
cQ1oy-paD
将void Func(A a) 改为void Func(const A &a)。 ce1KUwo]
'O
\YL(j_e
而void func(int a)就没必要改成void func(const int &a); v9u/<w68!
~EpMO]I
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 ^['% wA%
ov*zQP
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 Ga+\b>C
fw|r{#d
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; XDz1RTVx
{ w`c9_V
p! zC
public: D$YAi%*H
HC?yodp^
virtual ~Base() { cout<< "~Base" << endl ; } h34|v=8d
/-8v]nRB
}; DN&ZRA
5R{
{FD`h
class Derived : public Base >Y1?`
7h&$^
{ 818</b<yn
.gG<08Z
public: gupB8 .!
gTH1FR8$y
virtual ~Derived() { cout<< "~Derived" << endl ; } T9*\ITA
\-#~)LB]M
}; ?0DCjh8We
#fk)Y1
void main(void) /h0-qW
ie
2X.#
{ 5w@ ;B
v"F.<Q
Base * pB = new Derived; // upcast dt',)i8D
one^XYy1%
delete pB; _B8e1an
2t<
dCw
} f"k?Ix\
e
lqF{Y<l
输出结果为: o~NeS|a
l(v$+
~Derived l#\z3"b
!6@xX08z
~Base {l0;G)-
rPaD#GA[7
如果析构函数不为虚,那么输出结果为 #E{aN?_
6mep|![6
~Base bhOyx
5y(irbk7
YRG+I GX
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 ::j'+_9
bsuUl*l)
仿止该头文件被重复引用