一、#include “filename.h”和#include <filename.h>的区别 PYiO l
DJb9] ,=a
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 )lU9\"?o
@^.o8+Pp
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 DN;|?oNZ
]Q#k"Je
E?FUr?-[
二、头文件的作用 *)L~1;7j>
PsM8J
加强安全检测 3qkPe_<I
Z~]G+(
通过头文件可能方便地调用库功能,而不必关心其实现方式 srhI%Zj
dVSQG947i:
Pq,iR J
三、* , &修饰符的位置 {dYz|O<
$;rvKco)%
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 W[:CCCDL
c{j)beaS
uann'ho?q
四、if语句 *!9=?
L=dQ,yA
不要将布尔变量与任何值进行比较,那会很容易出错的。 F#^/=AR'
2B"tT"f
整形变量必须要有类型相同的值进行比较 *j<{3$6Ii
?}U?Q7vx@@
浮点变量最好少比点,就算要比也要有值进行限制 M'VJE|+t
Z^Yy
sf
指针变量要和NULL进行比较,不要和布尔型和整形比较 n&2OfBJ
tgj5l#P
LIll@2[
五、const和#define的比较 F!g;}_s9
P$.$M}rMv
const有数据类型,#define没有数据类型 &crR nv?
K >Q6
个别编译器中const可以进行调试,#define不可以进行调试 OAaLCpRp
Dq-[b+bm
在类中定义常量有两种方式 &W3Hj$>
Wm4C(y@
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; &Im-@rV!
)J?8"+_Y
2、 用枚举代替const常量。 ]X> I(p@
BO2s(8
,H_d#Koa.
六、C++函数中值的传递方式 rX0 ?m:&m
R'pfA
B|!
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) M+I9k;N6&
,/&|:PkS
void fun(char c) //pass by value JNo[<SZb
^<_rE- k
void fun(char *str) //pass by pointer mkq246<D~
mWUd-| Ul
void fun(char &str) //pass by reference h]vEXWpG ]
J%lrXm(l{
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 ^r,0aNzAs
97/ 4J
函数的类型不能省略,就算没有也要加个void EQQ@nW{;
xd\ml
37~
L)qUBp@MW
七、函数体中的指针或引用常量不能被返回 }a;H2&bu
egAYJK-,!
Char *func(void) qcC(#0A>
z<%dWz
{ "ruYMSpU
3
2"f'{
char str[]=”Hello Word”; T[<554
raZkH8
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 _5S||TuNS
G7i0P j
return str; N) PkE>%X
9z`72(
} {yB0JL}n
]L2b|a3
函数体内的指针变量并不会随着函数的消亡而自动释放 !MVf(y$
x.$cP
eJ6 #x$I,
八、一个内存拷贝函数的实现体 >f4[OBc
i(;.Y
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 6uTC2ka[&R
%`~+^{Wp
{ x4h.WDT$
G9Noch9
g
assert((pvTo!=NULL)&&(pvFrom!=NULL)); 4 Dy1M}7
@R<z=n"
byte *pbTo=(byte*)pvTo; //防止地址被改变 W.%p{wB|
8llXpe
byte *pbFrom=(byte*)pvFrom; NwdrJw9
XpYd|BvW
while (size-- >0) e.^?hwl
K4]#X"
pbTo++ = pbForm++; x!7r7|iV
fg lN_
return pvTo; L2_[M'
Q}cti/
} lEw;X78+
|~#A?mK-
+43~4_Oj
九、内存的分配方式 ^Ku]8/ga
l`uMtv/Wp
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 yo(MJ^=d
X|&H2y|*7
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 YWJ$Pp
"ZPgl 8
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 0FLCN!i1
"?kDR1=7A
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 w`D$W&3>
r)Vpt
fg;
|KZX_4
十、内存分配的注意事项 MK1#^9Zr
5;G0$M0
用new或malloc分配内存时,必须要对此指针赋初值。 X&h?1lMJ /
PVIZ
Y^64
用delete 或free释放内存后,必须要将指针指向NULL q[+h ~)
G
B,O
不能修改指向常量的指针数据 ti$60Up
;nJ2i?"
NpCQ4K
十一、内容复制与比较 H:OpS-b
s5 {B1e
//数组…… 8B]\;m
J"@X>n
char a[]=”Hello Word!”; ';!-a]N
}p-/R'
char b[10]; :>Bk^"
ZJ~0o2xZ'
strcpy(b,a); .z=%3p8+
V;^N:I\js
if (strcmp(a,b)==0) FFcIOn
+'+Nr<
{} CrSBN~
N-t"CBTO
//指针…… N=7iQ@{1
]N;nq
char a[]=”Hello Word!”; mq:WBSsV
US=K}B=g
char *p; )Vrp<"v
` AD}6O+x
p=new char[strlen(a)+1]; edCVIY'1
%IE;'aa
}
strcpy(p,a); B2* 7H
Ke3~o"IQ
if (strcmp(p,a)==0) GU9G5S.
u!HX`~q+A
{} (+0(A777M
zg@i7T
J#FHR/zV
十二、sizeof的问题 ;MK|l,aIQ
CE!cZZ
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 >,tJq%
bfEH>pQ>#
char a[]=”Hello World!” KATf9-Sz
A.@wGy4
char *p=a; _cC1u7U9
10.ZBfn
count<<sizeof(a)<<end; //12字节 $E[M[1j
AWPgrv/
count<<sizeof(p)<<endl; //4字节 ]=ZPSLuEm%
'h7x@[|
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 ,3c25.,*
/er{sKVX<
void fun(char a[1000]) -3ANNj
k3e6y
{ 7E#h(bt j
^i2>Ax&T
count<<sizeof(a)<<endl; //输出4而不是1000 EVBOubV
F|y0q:U
} 'Z=_zG/RX
vM]5IHqeE
cHR*.
十三、关于指针 p&u\gSo
=cb!2%?}
1、 指针创建时必须被初始化 Y2'HP)tfIw
rBU)@I pDG
2、 指针在free 或delete后必须置为NULL e=p_qhBt
N 3O!8A_
3、 指针的长度都为4字节 _?y3&4N)
|Kjfh};-C
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 8B-mZFXpK
Cg%Owe/E?0
char *p=new char[100]; ki }Li*)7
<P ?gP1_zi
strcpy(p,”Hello World”); kOdpW
kP/<S<h,g
delete []p; //注意前面的[]号 &cT