一、#include “filename.h”和#include <filename.h>的区别 `Pa z
4+fWIY1
"
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 `w@8i[2J
&)4#0L4
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 E! '|FJ
X 4\
1"pvrX}
二、头文件的作用 3o=R_%r
*3;H6
加强安全检测 9os>k*
!]1'?8
通过头文件可能方便地调用库功能,而不必关心其实现方式 9$)I=Rpk=
CmyCne
d~NvS-u7
三、* , &修饰符的位置 @edx]H1~^
k/MrNiC
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 =+{SZh@
X6lkz*M.
(* WO<V
四、if语句 ~ ;CnwG
B(+J?0Dj
不要将布尔变量与任何值进行比较,那会很容易出错的。 I_|@Fn[>
#~(J
J
整形变量必须要有类型相同的值进行比较 koQ\]t'*As
6M({T2e
浮点变量最好少比点,就算要比也要有值进行限制 x<_uwL2a
0q6$KP}q
指针变量要和NULL进行比较,不要和布尔型和整形比较 |Tn+Aq7
VKI`@rY4
@w?y;W!a>
五、const和#define的比较 _ISIq3A?
`;?`XC"m
const有数据类型,#define没有数据类型 WvV!F?uqZ
IGKF&s*;{[
个别编译器中const可以进行调试,#define不可以进行调试 8_yhV{
W dM?{;
#
在类中定义常量有两种方式 H{Fww4pn
0$8iWL
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; Mi+<|5is
VJp; XM
2、 用枚举代替const常量。 ;- ~}g 7$
Fp3NWvu
(-'Jf#&X^
六、C++函数中值的传递方式 <kJ,E[4`
PNNY_t +I
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) :xd)]Ns
6|h~pH
void fun(char c) //pass by value <#c/uIN
2`2S94'
void fun(char *str) //pass by pointer ;3~+M:{2
re\pE2&B
void fun(char &str) //pass by reference ZdcG6IG+
,OGXH2!h
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 uvbXsO"z]]
PH6!T/2[
函数的类型不能省略,就算没有也要加个void ElBpF8xJ|o
QQ1|]/)
CF|4, K)
七、函数体中的指针或引用常量不能被返回 nQy %av$
)SJ18 no|l
Char *func(void) Ft} h&aYP
?4G/f<ou
{ W7R`})F
IYZ$a/{P
char str[]=”Hello Word”; 3m2hB%SNb
$F^p5EXkc6
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 ExJch\
'fIBJ3s[o
return str; |2ttdc.
6;JlA})
} sr|afqjXD
2D`_!OG=
函数体内的指针变量并不会随着函数的消亡而自动释放 j,:vK
B)^uGSW
-pb>=@Yq
八、一个内存拷贝函数的实现体 o3=2`BvJ
1MVzu7
void *memcpy(void *pvTo,const void *pvFrom,size_t size) ^p@ #
8ux?K5_
{ 1$A7BP
;ty08D/
assert((pvTo!=NULL)&&(pvFrom!=NULL)); CAs8=N#H%
71)DLGL
byte *pbTo=(byte*)pvTo; //防止地址被改变 nqnVFkGd9
/b
]Yya#
byte *pbFrom=(byte*)pvFrom; cN]e{|
"$@Wy,yp
while (size-- >0) 5(+9(
\x
-FxE!K
pbTo++ = pbForm++; JZc"4qf@OT
d z-
return pvTo; RxeyMNd
#KFpT__F
} 5:"zs
@'D ,T^I
-D?-ctFYj^
九、内存的分配方式 u)NmjW
:h(r2?=7
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 =zetZJg
Y1=.46Ezf
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 j B.ZF7q
Oo-%;l`&
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 KV1/!r+*
;XUiV$
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 `fL81)!jI#
06r-@iY.]
@_:Jm
tH<
十、内存分配的注意事项 i,3[0*ge
J/-&Fa\(
用new或malloc分配内存时,必须要对此指针赋初值。 IN{ 1itE
-JMlk:~
用delete 或free释放内存后,必须要将指针指向NULL O /S: S
czp .q
不能修改指向常量的指针数据 rhr(uCp/
v \xuq`
x!@ 3.$
十一、内容复制与比较 X{-@3tG<r
cVR#\OM
//数组…… _,G^#$pH
H0 %;t
char a[]=”Hello Word!”; [UW%(N
AJ%x"
char b[10]; E <O:
IegZ)&_n
strcpy(b,a); I"_``*/1
+DpiX&^h
if (strcmp(a,b)==0) 6`V2-zv$
)^D:VY92
{} KeIk9T13O
cW|M4`
//指针…… cD!yd^QE
[Y%H8}
char a[]=”Hello Word!”; @a[Y[FS
)9PP3" I
char *p; eG
F{.]
5VLJ:I?0O
p=new char[strlen(a)+1]; u` j9m@`
#("/ 1N6
strcpy(p,a); @An "ClDa
O=A(x m#
if (strcmp(p,a)==0) mqIcc'6f
Y,
?- []
{} ruf*-&Kr7
3%J7_e'
DXH"`1[-
十二、sizeof的问题 aYC[15?'
`g~T #U\>d
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 vT&xM
c!2j+ORz
char a[]=”Hello World!” L'KgB=5K&i
CnvM>]
char *p=a; X
(0`"rjg
L{i,.aE/nO
count<<sizeof(a)<<end; //12字节 [=otgVteN"
*pOdM0AE
count<<sizeof(p)<<endl; //4字节 .=u8`,sO
sC ^9
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 kpQXnDm2
!K0:0:
void fun(char a[1000]) zHT22o56X
SFaG`T=
{ i_KAD U&mP
4uSC>
count<<sizeof(a)<<endl; //输出4而不是1000 .w@o%AO_
dh;
L!
} B0&W wa:
|Qa [N(
<q dM
十三、关于指针 =Ll:Ba Q
;t_'87h$y
1、 指针创建时必须被初始化 vnrP;T=^
);~JyoDo
2、 指针在free 或delete后必须置为NULL gTby%6-\|
S.Z2gFE&tu
3、 指针的长度都为4字节 w QnW2)9!
LKx<hl$O
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 Alh"ZT^*
"'8^OZR
char *p=new char[100]; o/6'g)r*
e2@{Ab
strcpy(p,”Hello World”); i!U,qV1
x U1](O
delete []p; //注意前面的[]号 ux
7^PTgcO
Te :4z@?
p=NULL; ;hcOD4or
uv}?8$<\
5、数组指针的内容不能超过数组指针的最大容易。 -76l*=|
}0%~x,
如:
oRbG6Vv/
,{tK{XpS
char *p=new char[5]; `RriVYc<
s>VpbJ3S
strcpy(p,”Hello World”); //报错 目标容易不够大 oU`J~6.&S
OZ'=Xtbn
delete []p; //注意前面的[]号 o(w xu)
/Mg$t6vM
p=NULL; a'U}.w}
T/b%,!N)
)T_o!/\*|*
十四、关于malloc/free 和new /delete Jh)x_&R&Q
e=yQFzQT)
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 ?f{--|V
;]/emw=a
l 注意:malloc/free是库函数,new/delete是运算符 +wwb+aG6{
2yt)"DnFk
l malloc/free不能执行构造函数与析构函数,而new/delete可以 7v8V0Gp
x?*)
l new/delete不能在C上运行,所以malloc/free不能被淘汰 *nj={Ss&
VPAi[<FzOG
l 两者都必须要成对使用 z3\WcW7|
u3Qm"? $`
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 5,;>b^gXY`
9 K.B
!T<4em8
十五、C++的特性 U<