一、#include “filename.h”和#include <filename.h>的区别 2![.Kbqa%
wGE:U`
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 1_THBL26d
;GO>#yg4Eh
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 NWSBqL5v
16[>af0<g
_* ] ~MQ=
二、头文件的作用 c-!rJHL`
eZ
y)>.6Z
加强安全检测 ?ZDXT2b~~
[L8Bgw1
通过头文件可能方便地调用库功能,而不必关心其实现方式 !MNUp(:
a5:Q%F<!
W~
XJ ']e
三、* , &修饰符的位置 DF/p{s1Y3
hVI
$r
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 -@-cG\{
xXM`f0s@+]
iTi<X|X
四、if语句 b&B<'Wb
&C<B=T"I
不要将布尔变量与任何值进行比较,那会很容易出错的。 qC40/1-m8K
5 @bLDP
整形变量必须要有类型相同的值进行比较 a= ;7
I2(5]85&]s
浮点变量最好少比点,就算要比也要有值进行限制 ZkkXITQkPM
$ckX H,l_
指针变量要和NULL进行比较,不要和布尔型和整形比较 f*7/O |Gp
xxgS!J
?h"+q8&
五、const和#define的比较 P*XLm
i2/:'
i
const有数据类型,#define没有数据类型 5bR;R{:x
)V%xbDd S
个别编译器中const可以进行调试,#define不可以进行调试
qm&}^S
qi_[@da f?
在类中定义常量有两种方式 h #Od tc1)
R$4&>VBu
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; ~mx me6"v
1+v&SU
2、 用枚举代替const常量。 MbC7`Sp&i
n;)!N
[
/w{,+U
六、C++函数中值的传递方式 ^[Cpu_]D
K?,eIZ{.S
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) N&U=5c`Q'
lwaxj7
void fun(char c) //pass by value 8i=J(5=
\,i9 m9;y
void fun(char *str) //pass by pointer z;@;jQ7
O E0w/{
void fun(char &str) //pass by reference tbF>"?FY/
PuqT&|wP l
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 a H'iW)
\:]Clvc
函数的类型不能省略,就算没有也要加个void uA7~`78
2i*-ET
'{p/F
$
七、函数体中的指针或引用常量不能被返回 -gefdx6ES
$]Kgs6=r
Char *func(void) j|TcmZGO
H%>
E6rVB
{ hC?:XVt
3r!6Z5P7{'
char str[]=”Hello Word”; ,y>,?6:>
O%;H#3kn&s
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 Nl,M9
n~l9`4wJY
return str; \:9dt8(-U
7T9m@
} 2%i_SX[
~+}w>jIm{|
函数体内的指针变量并不会随着函数的消亡而自动释放 k'E3{8<!
R7}=k)U?d@
|9T3" _MmJ
八、一个内存拷贝函数的实现体 5drc8_fZ
ma[%,u`
void *memcpy(void *pvTo,const void *pvFrom,size_t size) je@F:5
A}pmr
{ =/Pmi_
Xptb4]
assert((pvTo!=NULL)&&(pvFrom!=NULL)); A Vf'"~?
GOuBNaU{
byte *pbTo=(byte*)pvTo; //防止地址被改变 A&X(\ c M
q&OF?z7H
byte *pbFrom=(byte*)pvFrom; :so2 {.t-
)Kkw$aQI"d
while (size-- >0) 0YK`wuZGS
]Ir{9EE
v
pbTo++ = pbForm++; ^F2OTz4n
~sj'GEhEg
return pvTo; ?=,4{(/)
]=\vl>W
} qpzzk9ba[
s\i:;`l:=5
e^2e[rp0
九、内存的分配方式 2u9O+]EP
BK`NPC$a
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 ,(&jG^IpVJ
s+IU%y/9$a
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 A/V"&H[
81Ixs
Qt
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 z-};.!L^
7R9.g6j
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 Cq\1t
eD5:0;X2
WeyH;P=
十、内存分配的注意事项 X,-QxV=lc)
ML@-@BaN
用new或malloc分配内存时,必须要对此指针赋初值。 !-%fCg(B
f}{ lRk
用delete 或free释放内存后,必须要将指针指向NULL uG<VQ2LM
xuBXOr4"P
不能修改指向常量的指针数据 V6l~Aj}/
xS.Rpx/8
|m{Q_zAB
十一、内容复制与比较 ]gHxvT\E
N6K%Wkz
//数组…… pkTg.70wU
h1O^~"x
char a[]=”Hello Word!”; R-odc,P=
/8m2oL\<
char b[10]; |]=. ^
,K4*0!TXP
strcpy(b,a); T.ZPpxY
kkWqP20q
if (strcmp(a,b)==0) fzcPi9+
w1Ar[
P
{} Arvxl(R\4
MtE18m"z
//指针…… yLv jfP1
5gP<+S#>T
char a[]=”Hello Word!”; @ qFE6!
X3nt*G1dL
char *p; &qR1fbw"
dzA5l:5
p=new char[strlen(a)+1]; 6 0C;J!D
iMgfF_r
strcpy(p,a); BPf;!.
$xx5+A%,
if (strcmp(p,a)==0) )HZUCi/F]
dFdll3bC
{} P
"S=RX#+
*Nfn6lVB
W40GW
十二、sizeof的问题 7\ .Ax
ZHPsGHA
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 PqOy"HO
1-z*'Ghys
char a[]=”Hello World!” lo }[o0X
In1VW|4h
char *p=a; -I, _{3.S
9`[#4'1Mik
count<<sizeof(a)<<end; //12字节 G'|Emu=4
R<r"jOd]
count<<sizeof(p)<<endl; //4字节 n])-+[F
y&y(<
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 5f54E|vD
_ F0qqj
void fun(char a[1000]) ]U :1NC"
@ mzf(Aq
{ O5"o/Y~m
j
s(E-d/
count<<sizeof(a)<<endl; //输出4而不是1000 #xWC(*Ggp
'WqSHb7
} Sr7+DCr
6r"PtHr
tE)%*z@<Lt
十三、关于指针 ETu7G5?
id^U%4J
1、 指针创建时必须被初始化 dhW; |
,v"/3Ff{,
2、 指针在free 或delete后必须置为NULL YK#
QH"}
Kuh! b`9
3、 指针的长度都为4字节 f;/t7=>d
Z=: oIAe
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 >40B
Fxc
-KRHcr \
char *p=new char[100]; V/5hEo Dt
`I$qMw,@
strcpy(p,”Hello World”); &77]h%B>
'-jKv=D+
delete []p; //注意前面的[]号 7R\!'`]\M
&`7~vA&c
p=NULL; Tb-`0^y&X1
]{9oB-;,
5、数组指针的内容不能超过数组指针的最大容易。 2|k*rv}l
4'BzW Z;_a
如: c%.f|/.k
.?SClTqg
char *p=new char[5]; F"a^`E&
@4:cn
strcpy(p,”Hello World”); //报错 目标容易不够大 ~A0E4UJgq
YQR*?/?a
delete []p; //注意前面的[]号 3)f=Z2U>
< %Qw
dEO
p=NULL; ]\nG1+ta
zIbl[[M&
!DnG)4#
十四、关于malloc/free 和new /delete H+zn:j@~L
*jWU8.W
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 ;>=hQC{f>
u)P$xkf
l 注意:malloc/free是库函数,new/delete是运算符 f}4c#x
&Q