一、#include “filename.h”和#include <filename.h>的区别 ]n|Jc_Y
2,q*[Kh1
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 [DM0'4
^
UmYW
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 u>"0>U
K$M+"#./
mvZ#FF1,J
二、头文件的作用 *$vH]>)p
*|dr-e_j
加强安全检测 V9v20iX
XhM!pSl\
通过头文件可能方便地调用库功能,而不必关心其实现方式 TMj;NSc3
I!S Eb
yzhNl'Rz
三、* , &修饰符的位置 DpgTm&}-
BtC*]WB"_'
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 'q)g,2B%
/gZyl|kdy
vNv!fkl
四、if语句 '&![h7B
~pQN#C)CO>
不要将布尔变量与任何值进行比较,那会很容易出错的。 /qX?ca1_4^
'V]&X.=zC
整形变量必须要有类型相同的值进行比较 O[C4xq
^E.L8
浮点变量最好少比点,就算要比也要有值进行限制 !o /=,ZIx
1Hr}n6s
指针变量要和NULL进行比较,不要和布尔型和整形比较 22CET9iCe
+GI906K
Q<
:RLKVT
五、const和#define的比较 R{H[< s+n
e(?w h
const有数据类型,#define没有数据类型 K@O^\
'f-r 6'_ZX
个别编译器中const可以进行调试,#define不可以进行调试 06S
R74
~Ba=nn8Cq
在类中定义常量有两种方式 W}CM;~*L
xmvE*q"9]
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; x)~i`$
h= sNj
2、 用枚举代替const常量。 wfmM`4Y
Cf2WBX$
"r-P[EKpL
六、C++函数中值的传递方式 2jFuF71
u
S1O-Q>
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) }xk(aM_
3#>W\_FY*D
void fun(char c) //pass by value oBkhb
sE pI)9
void fun(char *str) //pass by pointer !ajBZ>Q
`5IrV&a
void fun(char &str) //pass by reference i41~-?Bc
OM*c7&
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 y?<KN0j
Tnp
P '
函数的类型不能省略,就算没有也要加个void Qq<@;4
gc.Lh~
#J"xByQKK
七、函数体中的指针或引用常量不能被返回 c1yRy|
I,{YxY[$7
Char *func(void) SO$Af!S:bB
LjI`$r.B
{ X8$i*#D
.:$(o&
char str[]=”Hello Word”; 8W\yM;'
_}R[mr/
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 4dX{an]Cz
X7},|cmD_
return str; mM,HMrgLqK
q>$MqKWM
} 51jgx,-|$
KewW8H~tb
函数体内的指针变量并不会随着函数的消亡而自动释放 X4
Arn,
AE0uBv
r)*23 &Ojs
八、一个内存拷贝函数的实现体 fMUcVTFe
lG7PM^Eb
void *memcpy(void *pvTo,const void *pvFrom,size_t size) =,6H2ew
MiT0!6Pg
{ SYCL\b
-&1(~7
assert((pvTo!=NULL)&&(pvFrom!=NULL)); D.K""*ula
\MP~}t}c
byte *pbTo=(byte*)pvTo; //防止地址被改变 W[ l
.XJ'2yKof
byte *pbFrom=(byte*)pvFrom; 7n7Xyb
)+G"57p
while (size-- >0) vMT f^V
Q(bOar5
pbTo++ = pbForm++; {R}F4k
DB/~Z
return pvTo; mmTpF]t
?`
4q}+8F`0F
} @J[@Pu O
:@(('X(".
gP2zDI
九、内存的分配方式 tT}b_r7h(1
jn<?,UABD
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 uX_H;,n
w% %q/![uy
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ~g{j)"1
*~vB6V|1
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 Er;/zxg9p
l0qaTpn
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 1Bj.MQ^
/8x';hQ
$1yO Zp5
十、内存分配的注意事项 lsz3'!%Y)
Rx-\B$G
用new或malloc分配内存时,必须要对此指针赋初值。 fN&,.UB^p
e^y9Kmd
用delete 或free释放内存后,必须要将指针指向NULL m2PUU/8B/
uo#1^`P
不能修改指向常量的指针数据 J(7#yg%5
!oWB5x~:P
daE.y_9y
十一、内容复制与比较 p='j/=
$}9jv3>)
//数组…… 6'^_*n
9@ k8$@
char a[]=”Hello Word!”; ]o6ZZK
vqm|D&HU
char b[10]; vpQ&vJfR
TeHJj`rdAU
strcpy(b,a); O~3
A>j
u{sHuVl
if (strcmp(a,b)==0) i2=- su
W/Dd7G#IC
{} GG%b"d-
"#1 \ uoH
//指针…… orGMzC 2
={g)[:(C.
char a[]=”Hello Word!”; }Fe6L;^;
@{Rb]d?&F?
char *p; 3~>-A=
@j!,8JQEd
p=new char[strlen(a)+1]; eh86-tQI~(
CMj =4e
strcpy(p,a); ,'8%'xit
8 v/H;65
if (strcmp(p,a)==0) tFmB`*!%
W A/dt2D|
{} A@A8xn%
hA7=:LG
;ku>_sG-
十二、sizeof的问题 5YY5t^T
:""HyjY!
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 \5ls
<=S.
n7t}G'*Y!^
char a[]=”Hello World!” _.5{vGyxr
nBy-/BU&
char *p=a; E'08'8y
JipNI8\r
count<<sizeof(a)<<end; //12字节 %3z[;&*3O
Rl?1|$%
count<<sizeof(p)<<endl; //4字节 .9J^\%JD
-CvmZ:n
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 dbf<k%i6
<V ?2;Gy
void fun(char a[1000]) _2fW/U54_
CIW4E
{ 6.@.k
p6DI7<C<H
count<<sizeof(a)<<endl; //输出4而不是1000 };Q}C0E
cMT7Bd
} cYSn
=H{<}>W'
m$vq%[/#
十三、关于指针 x-%O1frc
MBWoPK
1、 指针创建时必须被初始化 b}!
cEJY
"wcaJ;Os
2、 指针在free 或delete后必须置为NULL +~8Lc'0aA
8eXeb|?J
3、 指针的长度都为4字节 XGa8tI[:X
q5f QTV
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ]#o;`5'
R"cQyG4
char *p=new char[100]; iOiFkka
6n9/`D!
strcpy(p,”Hello World”); 4|x_C-@
t&?jJ7 (&8
delete []p; //注意前面的[]号 |`T7}U
-.D?Z8e
p=NULL; MJ}{Q1|*
FLmD?nw
5、数组指针的内容不能超过数组指针的最大容易。 v5[gFY(?
Vn#}f=u\
如: Ed=/w6<
\K$\-]N+
char *p=new char[5]; ;\pr05
;[y( 14g
strcpy(p,”Hello World”); //报错 目标容易不够大 gj^)T_E_
F_@B ` ,
delete []p; //注意前面的[]号 EQyX!
nCYz];".
p=NULL; hz/mNDE]
U$y9f
G&oD;NY@/
十四、关于malloc/free 和new /delete Oo|JIr7i
b7.7@Ly
y
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 Ii0\Skb
B^2r4
9vC
l 注意:malloc/free是库函数,new/delete是运算符 u62H+'k}F
-Q? i16pM
l malloc/free不能执行构造函数与析构函数,而new/delete可以 }?2X
q
\(Ma>E4PNU
l new/delete不能在C上运行,所以malloc/free不能被淘汰 @X/ 1`Mp
@qNY"c%HV
l 两者都必须要成对使用 3@~a)E}T
ilL%
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 bF _]j/
^Gk)aX
F_079~bJ
十五、C++的特性 =z. hJu
aE0R{yup Z
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 |k}<Zz1UM
8g-u
重载和内联:即可用于全局函数,也可用于类的成员函数; 4)iP%%JH
%pVsafV
Const和Virtual:只可用于类的成员函数; 0moA mfc
d/
Lz"
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 5(<O?#P
{IOc'W-C#2
覆盖是指派生类函数覆盖基类函数 3eY>LWx
'xS@cFo(
函数名相同; .>W [
R+!U.:-yz
参数相同; zY/Oh9`=v
xd{.\!q.
基类函数必须有Virtual关键字; i ;B^I8
5WI
bnV@
不同的范围(派生类和基类)。 d>[i*u,]/
O
_9r-Zt^
隐藏是指派生类屏蔽了基类的同名函数相同 "rMfe>;FJ
\PS]c9@,rc
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 `R0~mx&6G
<lzC|>BG
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 OV{v6,>O
:2j`NyLI.
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 82FEl~,^E
3w^W6hN)
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 QPm[4Fd{G
(rFkXK4^J
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 faOiNR7;h
4A+g-{d
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: 4D&