一、#include “filename.h”和#include <filename.h>的区别 {moNtzE;
XKIJ6M~5k
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 k5
l~
q2i~<;Z)9
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Md{f,,E'^@
zz*[JIe
Vp4]
二、头文件的作用 D$
z!wV
$>m<+nai'
加强安全检测 4;{CR. D
B6&Mtm1
通过头文件可能方便地调用库功能,而不必关心其实现方式 vLS6Gb't
8#B;nyGD1I
Xxw.{2Ji!q
三、* , &修饰符的位置 DO{4n1-U
QV1%Zou
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 X[6z
ghiElsBU
cXH?'q'vZ
四、if语句 )}5rs
/Vc!N)
不要将布尔变量与任何值进行比较,那会很容易出错的。 }$U6lh/Ep
!1R
整形变量必须要有类型相同的值进行比较 "rJL ^ \r
iOxygs#p
浮点变量最好少比点,就算要比也要有值进行限制 _;W|iUreb
TUr}p aw_
指针变量要和NULL进行比较,不要和布尔型和整形比较 {eV_+@dT
p(%x&*)f
1]~}0;,
五、const和#define的比较 EZV$1pa
N%yFL
const有数据类型,#define没有数据类型 2[eY q1f!
eyV904<F
个别编译器中const可以进行调试,#define不可以进行调试 u{ /gjv
]f?LQCTq<b
在类中定义常量有两种方式 v>R.ou(
Mt>DAk
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; K.~U%v}
]=Q'1%
2、 用枚举代替const常量。 V y$\.2=
9mZ1 a6,x
=|/b[Gd(
六、C++函数中值的传递方式 t60m:k4J
Ygb#U'|
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) g&V.o5jIhc
wDk[)9#A
void fun(char c) //pass by value ~MX@-Ff
HS7!O
void fun(char *str) //pass by pointer zO,sq%vQn'
Khl7Ez
void fun(char &str) //pass by reference 19 _F\32
~S9nLb:O{
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 Jo ^o`9
I$&/?ns@O
函数的类型不能省略,就算没有也要加个void #0c`"2t&M
frt?*|:
=Ao;[j)*!
七、函数体中的指针或引用常量不能被返回 pFuQ!7Uk
6~s,j({^
Char *func(void) gE&f}M-
7~&Y"&
{ ='FEC-f95
g7pFOcV
char str[]=”Hello Word”; cD\Qt9EI
j.K yPWO
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 {BF\G%v;+
{SJLM0=Z
return str; m:t$&
E$T#o{pai
} lc#H%Qlg
(bw;zNW
函数体内的指针变量并不会随着函数的消亡而自动释放 LLE~V~j
U6Qeode
@l8?\^N
八、一个内存拷贝函数的实现体 ^$(|(N[;
\?o%<c5{
void *memcpy(void *pvTo,const void *pvFrom,size_t size) )q,}jeM8
d7&PbITN
{ Z6=!}a%
#SdaTMLFf
assert((pvTo!=NULL)&&(pvFrom!=NULL)); cA*%K[9
&
2bf
byte *pbTo=(byte*)pvTo; //防止地址被改变 gSC@uf
[Xrq+O,
byte *pbFrom=(byte*)pvFrom; ;KhYh S(q
g^idS:GtX5
while (size-- >0) mH?hzxa+
{*2A%}S
pbTo++ = pbForm++; %/s1ma6q
sw&Qks?V
return pvTo; ..!yf e"5
%F7aFvl*
} XEuv
aM
AIeYy-f
FR <wp
九、内存的分配方式 &.}zZ/
Kq*^*vWC
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 29GiNy+ob
c]9OP9F
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 B5cTzY.h-
s^U^n//
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 $qvNv[
f9$98SI
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 {hl_/
aG
T|m+ULp~
41.+3VP
十、内存分配的注意事项 Wj3H
y4
2|cIu ' U
用new或malloc分配内存时,必须要对此指针赋初值。 ZGrV? @o,6
t!~mbx+
用delete 或free释放内存后,必须要将指针指向NULL w 8E,zH
Pa.!:N-
不能修改指向常量的指针数据 6e*JCf>
$OJ*Kul
C/E3NL8
十一、内容复制与比较 ."lY>(HJ
QW!'A`*x
//数组…… 4M:oa#gh@
qjWgyhL
char a[]=”Hello Word!”; u66w('2
CkP!4^J qQ
char b[10]; G0^PnE0-
* T-XslI
strcpy(b,a); OS!47Z /q
PvM<#zq_
if (strcmp(a,b)==0) c(~M<nL0
sC#Ixq'ls7
{} :\>UZ9h #
zJ\I%7h*
//指针…… A_g'9
)TWf/Lcp
char a[]=”Hello Word!”; BG|Kw)z*KM
t512]eqhb(
char *p; w90y-^p%
3B_S>0H"$
p=new char[strlen(a)+1]; A(C3kISM
*Vc}W
strcpy(p,a); :ortyCB:H
~E)I+$,
if (strcmp(p,a)==0) ]s<Q-/X
)I*V('R6|
{} ;[|x5o/<
E{FN sa
@}[)uH
十二、sizeof的问题 xNx!2MrR;
k'{lo_
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 3U}z?gP[
Lrk^<:8;
char a[]=”Hello World!” f5O*Njl
)Ev [o#y
char *p=a; `aC#s3[
VA]%i P,O-
count<<sizeof(a)<<end; //12字节 kt@+UK."
Q8P;AN_JS
count<<sizeof(p)<<endl; //4字节 $k!t&G
3Y=S^*ztd
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 *zmbo >{(
Wima=xYe\5
void fun(char a[1000]) l\S..B
+
SI@I
{ %7{6>6%
$1w8GI\J
count<<sizeof(a)<<endl; //输出4而不是1000 F<I-^BY)
T\]z0M
} I5-/KVWb
3GaM>w}>W
6#.R'O
十三、关于指针 ^+}<Q#y-
yJr' \(
1、 指针创建时必须被初始化 &^z~wJ,]
Z'u`)jR
2、 指针在free 或delete后必须置为NULL /at#[Pw~01
643 O(0a
3、 指针的长度都为4字节 D,J's(wd
>0f5Mjug
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 &gq\e^0CRZ
$biCm$a
char *p=new char[100]; inp= -
hLBX,r)u
strcpy(p,”Hello World”); s'i1!GNF
B
K}Aaflq
delete []p; //注意前面的[]号 'a4xi0**I
m+1MoeR
p=NULL; >bmL;)mc&
{At1]>
5、数组指针的内容不能超过数组指针的最大容易。 z<)?8tAgq
sYeZ.MacU
如: b`1P%OjC
Mq6"7L
char *p=new char[5]; 3{
`fT5]U
Tl 9_Wi
strcpy(p,”Hello World”); //报错 目标容易不够大 |3vQmd !2}
}"_S;[{d
delete []p; //注意前面的[]号 .O~)zMx
#K
]k
p=NULL; *-gS u
M)Y`u
}`>u+iH#a
十四、关于malloc/free 和new /delete D
@T,j4o
cl^tX%
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 1 aIJ0#nE
e PlEd'Z
l 注意:malloc/free是库函数,new/delete是运算符 @|r*yi
N!$y`nwiw'
l malloc/free不能执行构造函数与析构函数,而new/delete可以 sexnO^s
/G\-v2i D
l new/delete不能在C上运行,所以malloc/free不能被淘汰
}9{6{TD
pbAQf3
l 两者都必须要成对使用 wB"&K;t
o9>r
-
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 G{YLyl/9
Xv6z>z.
Trm)7B*
十五、C++的特性 8%2*RKj
w#]%I+
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 0l{').!_
TRG"fVR
重载和内联:即可用于全局函数,也可用于类的成员函数; )k=8.j4
%0. o(U
Const和Virtual:只可用于类的成员函数; ,Rz,[KI|
/6b(w=pk
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 3,W2CN}
5fM/y3QPsZ
覆盖是指派生类函数覆盖基类函数 hAKyT~[n0
8K7zh.E
函数名相同; 7DXT1+t
A\k@9w\Ll;
参数相同; 'd(OFE-hn
%TvunV7NQS
基类函数必须有Virtual关键字; \snbU'lfP
)%f]`<