一、#include “filename.h”和#include <filename.h>的区别 9$n+-GSK
"Wxo[I
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 1*TXDo_T
OA\vT${5
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 %-T}s`Z
?=TL2"L
+!D=SnBGs
二、头文件的作用 tuX =o
`"i^'VL,
加强安全检测 EolE?g@l8
B!$V\Gs
通过头文件可能方便地调用库功能,而不必关心其实现方式 x;<oaT$X
[%HYh7ua<
.dy#n`eP
三、* , &修饰符的位置 (K!M*d+
2(@LRl>:
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 nYmf(DV
mrw]yu;2<n
8') .ohD
四、if语句 };4pZceV
~5x4?2
不要将布尔变量与任何值进行比较,那会很容易出错的。 ~NTDG
JS }_q1H
整形变量必须要有类型相同的值进行比较 @2)t#~Wc4h
m
T>b;
浮点变量最好少比点,就算要比也要有值进行限制 q}wl_ku9+
gK&5HTo
指针变量要和NULL进行比较,不要和布尔型和整形比较 %g2/o^c*
GGYX!=]~
z_5rAlnwT.
五、const和#define的比较 u?LW+o
"H
wVK
const有数据类型,#define没有数据类型 BT
y]!%r'
v4nvZ6
个别编译器中const可以进行调试,#define不可以进行调试 gPF}aaB6
Nv}U/$$S
在类中定义常量有两种方式 )*q7pO\cty
&<\4q
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; IBn'iE[>
TyxU6<>4J4
2、 用枚举代替const常量。 9;;]q?*
,(1vEE[9-
(,d4"C
六、C++函数中值的传递方式 v9X7-GJ~
`</=AY>
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) C}dKbs^g|
_stI?fz*4k
void fun(char c) //pass by value #`fi2K&]j
0R2S@4%Y
void fun(char *str) //pass by pointer pe`TH::p
uOivnJ?
void fun(char &str) //pass by reference tal>b]B;
)3D+gu
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 f}evw K[S
(1saof*p%
函数的类型不能省略,就算没有也要加个void llTQ\7zP
LLXg
0{^l2?mgSb
七、函数体中的指针或引用常量不能被返回 rw40<SS"Z
Pl>nd)i`
Char *func(void) y{&{=1#
>S-N|uR6
{ : pE-{3I
@M1yBN
char str[]=”Hello Word”; z<3}TD
.&*
({UM
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 ^^t]vojX
;:8jxkx6%
return str; eY6gb!5u
gnKU\>2k
} }5fI*v
'aSZ!R
函数体内的指针变量并不会随着函数的消亡而自动释放 flm,r<*}
"R\\\I7u
3Aqe;Wf9%+
八、一个内存拷贝函数的实现体 dZ;~b(CA
y<'2BTf
void *memcpy(void *pvTo,const void *pvFrom,size_t size) ATXx?
b8h
ya*q; D
{ a-UD_|!
<Vr]2mw
assert((pvTo!=NULL)&&(pvFrom!=NULL)); zn?a|kt
]ukj]m/@
byte *pbTo=(byte*)pvTo; //防止地址被改变 LzEE]i
F_M~!]<na
byte *pbFrom=(byte*)pvFrom; ^c[CyZ:a
+^]PBMM1w
while (size-- >0) ,Rr&.
q9a
wzj
pbTo++ = pbForm++; zYgK$u^H
DY+8m8!4H
return pvTo; @]VvqCk
a s<q
} ui#1 +p3G
|]2eGrGj4
Yf2+@E
九、内存的分配方式 s_Ge22BZ
\PtC
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 'mY,>#sT
:BZx)HxQ
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ~M9n<kmE
nF!_q;+Vp
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 zf!\wY"`
;6&=]I
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 hz~CW-47
qeO6}A"^|
<J_,9&\J
十、内存分配的注意事项 A](}"Pi!n
krnk%ug
用new或malloc分配内存时,必须要对此指针赋初值。 3vGaT4TDx
;(iUY/ h[h
用delete 或free释放内存后,必须要将指针指向NULL EA@$^e[
mLxwJ
不能修改指向常量的指针数据 .]P;fCQmM
bEXHB
J/&*OC
十一、内容复制与比较 ]zR;%p
(9[C0e S
//数组…… '8pPGh9D
DSG +TA"
char a[]=”Hello Word!”; Ai_|)
+q,n}@y=
char b[10]; M0IqQM57N
",
Rw%_
strcpy(b,a); !vo '8r?&
'FA)LuAok
if (strcmp(a,b)==0) yLa5tv/
uB&I56
{} 'N,NG$G2
hw.demD
//指针…… u9~V2>r\
9C'+~<l
char a[]=”Hello Word!”; w#bbm'j7r
c68$pgG
char *p; d~bH!P
T7Qd
I[K%b
p=new char[strlen(a)+1]; ,xM*hN3A
=d4',[O
strcpy(p,a); j
tkPi)QR
g<0%-p
if (strcmp(p,a)==0) T[9jTO?W2
ScmzbDu
{} 52R.L9Ai
l{SPV8[i
hnLgsz
十二、sizeof的问题 `,]PM)iC
0+`*8G)
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 Jt^JE{m9%
0_Z|y/I.
char a[]=”Hello World!” Ox1QP2t6Y
1UWgOCc
char *p=a; k#G7`dJl
]Lft^,7
count<<sizeof(a)<<end; //12字节 qBrZg
>N"PLSY1
count<<sizeof(p)<<endl; //4字节 ~l(tl[
C^v- &*v
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 ?PtRb:RHt
_@?Jx/`;bk
void fun(char a[1000]) ,colGth54
nk.Eq[08
{ X51$5%
/3%xQK>%
count<<sizeof(a)<<endl; //输出4而不是1000 tdK^X1
m8A1^ R
} TTak[e&j3
4^9_E&Fa
9 9BK/>R
十三、关于指针 AdW7 vn
epyYo&x}
1、 指针创建时必须被初始化 ``CADiM:S
UeeV+xU
2、 指针在free 或delete后必须置为NULL [<$d@}O
YhR"_
3、 指针的长度都为4字节 6MQ:C'8T&=
=xP{f<`
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 Qj[O$L0 $
X}^gmu<Vla
char *p=new char[100]; 4u7>NQUDu
?saVk7Z[|5
strcpy(p,”Hello World”); k;X1x65uP
Lxrn#Z eM
delete []p; //注意前面的[]号 N'.+ezZ;h
Vtk|WV?>P+
p=NULL; >:|q J$J.
9F!&y-
5、数组指针的内容不能超过数组指针的最大容易。 !qv;F?2
<g
DlO;EH
如: g+*[CKO{
y Dw!u[:
char *p=new char[5]; IbwRb
brot&S2P><
strcpy(p,”Hello World”); //报错 目标容易不够大 >Sah\u`
x*)O<K
delete []p; //注意前面的[]号 9x,+G['Zt
)CQ}LbX Zy
p=NULL; 4N:
;Mo&B
S45_-aE
Ba~Iy2\x
十四、关于malloc/free 和new /delete Wno5B/V
KR0
x[#.*
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 w7u >|x!
[N)M]u
l 注意:malloc/free是库函数,new/delete是运算符 "
z{w^k
OK(d&
l malloc/free不能执行构造函数与析构函数,而new/delete可以 g.s oNqt=
1YL5 ![T
l new/delete不能在C上运行,所以malloc/free不能被淘汰 ?Pc3*.
c
@R6p+
l 两者都必须要成对使用 XvY-C
_TF>c:m3
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 ,pzCJ@5
=oJiNM5_u
Nig-D>OS
十五、C++的特性 g (k|"g`*
H=C;g)R
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 :_*Q
IyW
_!zY(9%
重载和内联:即可用于全局函数,也可用于类的成员函数; ;\N*iN#K
Ip0q&i<6
Const和Virtual:只可用于类的成员函数; s=4.Ovd\
#C^m>o~R
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 u7d]%<~'$F
J7xmf,76w
覆盖是指派生类函数覆盖基类函数 q0wVV
oV`sCr5%
函数名相同; !=:c8V
at!?"u
参数相同; ,e2va7}3
HV@:!zM
基类函数必须有Virtual关键字; }T,uw8?f!
c3##:"wr
不同的范围(派生类和基类)。
s25012
jxvVp*-=<j
隐藏是指派生类屏蔽了基类的同名函数相同 N;Bal/kd2
VM[8w`
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 |k+^D :
YVT^}7#
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 N"TD$NrK\
i7FEjjGtG
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。
Xc!w
y9m
_Gu ;U@
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 D_Y;N3E/rS
|wDCIHzQ
1、 参数做输入用的指针型参数,加上const可防止被意外改动。
cO:x{~
Z>l>@wN m
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: y.zQ `
`f'P
将void Func(A a) 改为void Func(const A &a)。 (]:G"W8f
.
fIodk
而void func(int a)就没必要改成void func(const int &a); Q *he%@w
?@_dx=su
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 Gsb]e
7u zN/LAF
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 >qE$:V"_5
]arP6iN+
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; cQ`,:t#[
<