一、#include “filename.h”和#include <filename.h>的区别 V*{rHp{=p
5OppK(Oi*C
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 CF2Bd:mfZ
:Ys~Lt54
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 S.)Jp-&K
}&t>j[
!7
dct#4
二、头文件的作用 18!y7
_cFT
##*]2Dy
加强安全检测 G %6P`:
2h'Wu
qO
通过头文件可能方便地调用库功能,而不必关心其实现方式 BUJ\[/
`}$o<CJ
%KXiB6<4
三、* , &修饰符的位置 {VL@U$'oI
#F.jf2h@
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ;,C]WZ.w
R2gV(L(!!
PmRvjSIG
四、if语句 J+J,W5t^
#uw&u6*\q
不要将布尔变量与任何值进行比较,那会很容易出错的。 *L$2M?xkY
Zn'tNt/
整形变量必须要有类型相同的值进行比较 uI)twry]@
RI0^#S_{
浮点变量最好少比点,就算要比也要有值进行限制 B-R#?Xn:!I
sa(.Anmlj
指针变量要和NULL进行比较,不要和布尔型和整形比较 `;E/\eG"
M .b8 -`V
4
"HX1qP
五、const和#define的比较 1!~cPD'F
Y~-y\l;Tr
const有数据类型,#define没有数据类型 ^,acU\}VqP
NEIkG>\7q
个别编译器中const可以进行调试,#define不可以进行调试 >F7w]XH
>sfg`4
在类中定义常量有两种方式 >H!Mx_fDL
BVNW1<_:
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; x8PT+KC
N8b\OTk2
2、 用枚举代替const常量。 fI613ww]
hTr5Q33y>
7{L4a\JzT
六、C++函数中值的传递方式 T)rE#"_]{
L^3&
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) /i'078F
\=AA,Il
void fun(char c) //pass by value 'J|)4OG:
.B#
.
void fun(char *str) //pass by pointer _1p8(n
DK)W
,z|
void fun(char &str) //pass by reference K^shT h8k
4hL%J=0:
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 bf"'xn9
i#]e&Bru5
函数的类型不能省略,就算没有也要加个void mm-s?+&M;
ZgP%sF
uZS :
七、函数体中的指针或引用常量不能被返回 Xv8-<Ks
L>1hiD&
Char *func(void) Y$ys4X
*?rWS"B
{ qd*}d)!
&riGzU]
char str[]=”Hello Word”; IOcQI:4.`
8Xotly
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 QF#w$%7
3@>F-N
return str; BBB@M
vk&
gR
} {LO Pm1K8Y
r9i?H
函数体内的指针变量并不会随着函数的消亡而自动释放 %lF*g
H5=kDkb
5i!Q55Yv=,
八、一个内存拷贝函数的实现体 3!"N;Q"
)/H;5 cn
void *memcpy(void *pvTo,const void *pvFrom,size_t size) >='/%Ad
$YL9 vJV
{ g* q#VmE
P[nc8z[
assert((pvTo!=NULL)&&(pvFrom!=NULL)); ~[g(@Xt
21uK&nVf^l
byte *pbTo=(byte*)pvTo; //防止地址被改变 ~s!Q0G^G
a1U|eLmUb
byte *pbFrom=(byte*)pvFrom; b(H{i}{]
/4:bx#;A
while (size-- >0) 1i76u!{U
_ E;T"SC
pbTo++ = pbForm++; Zv u6/#
Z/#_Swv
return pvTo; w,LtQhQ
CLR1CGnn7
} O
VV@
m[9.'@ye
:
\+xXb{
九、内存的分配方式 >XD?zF)6
Ott6y
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 5)k8(kH
uN|A}/hr]
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 _R4}\3}!
9%!h/m>rW
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 [GLH8R
BG>Y[u\N
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 "yn~axk7
)ZG;.j
*o6}>;
十、内存分配的注意事项 8+zW:0"[
3nq?Y8yac
用new或malloc分配内存时,必须要对此指针赋初值。 V]=22Cxi'~
M tN>5k c
用delete 或free释放内存后,必须要将指针指向NULL +\/Q
RJrz ~,}
不能修改指向常量的指针数据 sVLvnX,
v, $r.g;
1^~&"s U
十一、内容复制与比较 #@XBHJD\#
_Cmmx`ln
//数组…… ]ss[n.T0*
d>NGCe
char a[]=”Hello Word!”; Av X1*
8:ubtB
char b[10]; <Vat@e
gD,&TW
strcpy(b,a); 54
lD+%E
C"hN2Z!CD|
if (strcmp(a,b)==0) @KN+)q P
#lYyL`B+~
{} 6EqA Y`y
TBj 2(Z
//指针…… X8Z?G,[H
t*{L[c9.Uq
char a[]=”Hello Word!”; ,+=9Rp`md
}V?m
=y [
char *p; %b6$N_M{H1
_:x]'w%
p=new char[strlen(a)+1]; 9^gYy&+>6]
pwFp<O"
strcpy(p,a); ewDYu=`*
-^_m(@A<~
if (strcmp(p,a)==0) "F
F$Q#)
_jWs(OmJ
{} E$d#4x
5E!C?dv(z
OgQdyU
十二、sizeof的问题 ]?9*Vr:P^
nL@'??I1
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 mypV[
BI'>\hX/V
char a[]=”Hello World!” cc@W
6W
LC%ococ
char *p=a; -IPo/?}
<r%K i`u(p
count<<sizeof(a)<<end; //12字节 +;N]34>S7
Q@D7\<t
count<<sizeof(p)<<endl; //4字节 VtBC~?2U)B
YIQD9
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 d?,'$$ aB
xc^@"
void fun(char a[1000]) asWk]jjMG
"<,lqIqA;
{ N5Js.j>z
_&gi4)q
count<<sizeof(a)<<endl; //输出4而不是1000 z7K{ ,y
Q$%apL
} C$[d~1t6
d&AG~,&d|
Nx}nOm
十三、关于指针 *PJH&g#Ge
ZU4=&K
1、 指针创建时必须被初始化 v"*r %nCi
J_Lmy7~xbD
2、 指针在free 或delete后必须置为NULL 7!O"k#
Z,&