一、#include “filename.h”和#include <filename.h>的区别 Fv
%@k{
SG\ /m'F
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 G<<;a
Q(yg bT
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 !^98o:"x
;}U]^LT=
8J$1N*J|
二、头文件的作用 :{Z%dD
Y%eW6Y#
加强安全检测 v@yqTZ
c!wRq4
通过头文件可能方便地调用库功能,而不必关心其实现方式 dJnKa]X
~aQR_S
C6a-
三、* , &修饰符的位置 85[
7lO)[
|zP~/
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 \#w8~+`Gq
c7@/<*E+
kv2o.q
四、if语句 {fl[BX]kZ
\I4Uj.'>\
不要将布尔变量与任何值进行比较,那会很容易出错的。 W?E,"z
g4Dck4^!4
整形变量必须要有类型相同的值进行比较 2W_[|.;'
O NcLhwH
浮点变量最好少比点,就算要比也要有值进行限制 _ eBNbO_J
JLo E)\Mi
指针变量要和NULL进行比较,不要和布尔型和整形比较 R[v<mo[s
L&:A59)1k
0Qvr
g+
五、const和#define的比较 DO*6gzW
^/%Y]d$
const有数据类型,#define没有数据类型 Op~:z<z
7]5~ml3:
个别编译器中const可以进行调试,#define不可以进行调试 w%)RX<h dI
PyHL`PZZ
在类中定义常量有两种方式 V/"RCqY4
;Wk3>\nT-
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; +,ar`:x&a
H\<0{#F
2、 用枚举代替const常量。 C\BKdx5;
yY49JZ
h;r^9g
六、C++函数中值的传递方式 G,Eh8HboK
&Fuk+Cu{
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) Zj ` ;IYFG
fB]2"(
void fun(char c) //pass by value OiZ-y7;k^
'@#(jY0_
void fun(char *str) //pass by pointer V3VTbgF
|r;>2b/ x
void fun(char &str) //pass by reference e<`?$tZ3
>Jn` RsuV
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 lnjs{`^
"10\y{`v^
函数的类型不能省略,就算没有也要加个void )AdwA+-x
UCj+V@{
s Iaehe'B
七、函数体中的指针或引用常量不能被返回 m3P7*S5NJ7
,f,+) C$
Char *func(void) IV':sNV
~.U\Y
{ hH;i_("i(h
f]?&R c2C
char str[]=”Hello Word”; 06.8m;{N
w^nA/=;r
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 `VGw5o
z%+rI
return str; [U^Cz{G
g;AW
} d*k5h<jM
Rb:?%\=
函数体内的指针变量并不会随着函数的消亡而自动释放 z+wegF
c>/7E-T
'3Fb[md54
八、一个内存拷贝函数的实现体 N:+EGmp
tIod=a)
void *memcpy(void *pvTo,const void *pvFrom,size_t size) Zj ^e8u=T
\j wxW6>
{ p*YV*Arv
7MJ\*+T|03
assert((pvTo!=NULL)&&(pvFrom!=NULL)); Ujvm|ml
:cXN
Fu\C
byte *pbTo=(byte*)pvTo; //防止地址被改变 MuzQz.C
*x p_#
byte *pbFrom=(byte*)pvFrom; D[6sy`5l
".#h$
while (size-- >0) ~Cyn w(
e F}KOOfC
pbTo++ = pbForm++; Y@MxKK uj
UM21Cfqex
return pvTo; kqo4
v;r
z/QYy)_j
} i7 YUyU
OR|Jc+LT
bi@'m?XwJ
九、内存的分配方式 -T+'3</T
Nqd9)WQ
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 +`B^D
0xCe6{86
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 DOkuT/+
v6L]3O1
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 w6mYLK%
ZzR0k
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 y[S9b(:+
yqtHlz%
? }`mQ <~
十、内存分配的注意事项 ==%5Ci7qMy
e8(Qx3T?b
用new或malloc分配内存时,必须要对此指针赋初值。 j*f\Z!EeZ
uXUuA/O5-
用delete 或free释放内存后,必须要将指针指向NULL u%"5<ll
;Kg7}4`I
不能修改指向常量的指针数据 D97 vfC
>X"\+7bw
hPgYKa8u
十一、内容复制与比较 pSYEC,0B
SsfC
m C
//数组…… CMv8n@ry
DZH2U+K
char a[]=”Hello Word!”; Hm|N{
P39oHW
char b[10]; ~P~q'
OmfHrlA
strcpy(b,a); S-7 C'dc
pbWjTI $
if (strcmp(a,b)==0) c_.Fe'E
i?eVi
{} % hH> %
$ZB`4!JxG
//指针…… W* v3B.
A>FWvlLw'm
char a[]=”Hello Word!”; N
Mx:Jh-YN
NB.'>Sar
char *p; #67 7,dn
;7H^;+P
p=new char[strlen(a)+1]; +/ M%%:>mY
@*=5a(#
strcpy(p,a); jPx}-_jM
{L.uLr_?e
if (strcmp(p,a)==0) _nX8f
&
-m
;n}ECg
{} 08%Bx~88_%
K,U8 vc
37jrWe6xwp
十二、sizeof的问题 44YKS>Cq
#ZnNJ\6
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 7i#/eRui
?FR-aXx
char a[]=”Hello World!” +.|RH
S9%,{y
char *p=a; .EH1;/
I6@"y0I
count<<sizeof(a)<<end; //12字节 [U"/A1p
JB.U&
count<<sizeof(p)<<endl; //4字节 uq54+zC
]0|A\bE\S
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 1_Av_X
t&EY$'c
void fun(char a[1000]) Nqz6_!
0bIgOLP
{ n:k4t
+#< Z/
count<<sizeof(a)<<endl; //输出4而不是1000 M1*bT@6
H?xYS|
n
} QH,(iX6RY
M#m;jJqON
N0NFgW;
十三、关于指针 YB2gxZ
%so{'rQl
1、 指针创建时必须被初始化 Qj(ppep\U"
G\V*j$}!
2、 指针在free 或delete后必须置为NULL r}D#(G$
Jo~fri([%Q
3、 指针的长度都为4字节 0!$y]Gr
yq^Ma
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 n%4/@M
(-&d0a9N
char *p=new char[100]; +PKsiUJ|
Y}<%~z#.4
strcpy(p,”Hello World”); YV@efPy}n
B##X94aTT
delete []p; //注意前面的[]号 GCfVH?Vx
R-1MD
p=NULL; mF jM6pmo
#reW)P>
5、数组指针的内容不能超过数组指针的最大容易。 IvI..#EzG
6h %rt]g
如: WBm)Q#1:
ae]6F_Qtc*
char *p=new char[5]; d~{$,"!-f
1)zXv
strcpy(p,”Hello World”); //报错 目标容易不够大 Q {BA`Q@V
;/JXn
delete []p; //注意前面的[]号 MOnTp8
mo(>SnS<
p=NULL; K'
<[kh:cl
_5x]BH6f
Ude?[6
十四、关于malloc/free 和new /delete Y~UAE.
CXyb8z4/+
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 +"=ydF.9
A=p'`]Yld
l 注意:malloc/free是库函数,new/delete是运算符 oVPr`]
4neO$^i8J
l malloc/free不能执行构造函数与析构函数,而new/delete可以 Ek6g?rj_
c/v|e&q
l new/delete不能在C上运行,所以malloc/free不能被淘汰 xk7Dx}
*kYGXT,f]
l 两者都必须要成对使用 N#t`ZC&m'
c$tX3ug6I
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 :XG~AR/
>V)"TZH
gw[Eu>I
十五、C++的特性 !@N?0@$/
uN>5Eh&=Pf
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 h8(>$A-
Q>rr?L`
重载和内联:即可用于全局函数,也可用于类的成员函数; cY kb3(
>!a- "
Const和Virtual:只可用于类的成员函数; rPGj+wL5-
/@\R
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 BzO,(bd!PI
N@}h
覆盖是指派生类函数覆盖基类函数 ?2dI8bG
YhS_ ,3E
函数名相同; c<MF:|(}
=+ >>l0=_v
参数相同; @h!Z0}dX(
, c{ckm
基类函数必须有Virtual关键字; i.`n^R;N
150-'Q
不同的范围(派生类和基类)。 N
fG9a~
~T-uk
隐藏是指派生类屏蔽了基类的同名函数相同 ar}-~~h 5
>8=lX`9f{
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 -57~7
<N
9:-7.^`P
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 }f?[m&<
E]GbLU;TH
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 A~<!@`NjB
[(5.?
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 `&