一、#include “filename.h”和#include <filename.h>的区别 Tr4\ `a-i
C-@M|K9A'
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 _VM}]A
XbeT x
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 h,-i\8gq
#Ye0*`
p&0 G
二、头文件的作用 H;@0L}Nu+}
gNZ"Kr o6
加强安全检测 `Fe/=]<$
bD3 dT>(+
通过头文件可能方便地调用库功能,而不必关心其实现方式 k2 _y84;D
I2NMn5>
<g\:By^
三、* , &修饰符的位置 aqI m W
:;hm^m]Y
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ,1-idpnX
<Wj/A/
,`'A"]"
四、if语句 O3dQno
Eh|6{LDn!
不要将布尔变量与任何值进行比较,那会很容易出错的。 BT^=p
V\Y,4&bI
整形变量必须要有类型相同的值进行比较 0S
}\ML
4PR&67|AH_
浮点变量最好少比点,就算要比也要有值进行限制 V?>&9D"m
MSp)Jc
指针变量要和NULL进行比较,不要和布尔型和整形比较 F x$W3FIO]
%s5(''a.
blP8"(U
五、const和#define的比较 y5D3zqCG
JDp=w,7LF
const有数据类型,#define没有数据类型 gx eu2HG
n$h+_xN
个别编译器中const可以进行调试,#define不可以进行调试 $GQEdVSNo
^JY:$)4["
在类中定义常量有两种方式 .b!HEi<F
ti]8_vP}*
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; x>Dix1b:.
5p-vSWr!
2、 用枚举代替const常量。 hYA1N&yz@
c=a;<,Rzb
: Q2=t!
六、C++函数中值的传递方式 %kH,Rl\g
X'%BS
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) -]YsiE?r
Nr"GxezU+A
void fun(char c) //pass by value _j{)%%?r
:RYYjmG5;
void fun(char *str) //pass by pointer t: ,lz8Y~
C.H(aX)7
void fun(char &str) //pass by reference <]#_&Na
W'E3_dj+
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 BvH I}=
-- IewW
函数的类型不能省略,就算没有也要加个void CPY|rV
W>,D$
AT2D+Hi=E
七、函数体中的指针或引用常量不能被返回 xa
!/.
B[f:T%
Char *func(void) !wKNYe
jd"YaZOQ
{ >>;He7
>m=XqtP
char str[]=”Hello Word”; v0;dk(
An,TunX
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 .Rb1%1bdc
,wHlU-%
return str; =BV_?
bIk4?S
} yV6U<AP$3
})q8{Qj!
函数体内的指针变量并不会随着函数的消亡而自动释放 &4M,)Q (
/R(
.7 N
Iu;VFa
八、一个内存拷贝函数的实现体 a",
8N"'
| OZ>5
void *memcpy(void *pvTo,const void *pvFrom,size_t size) k>E/)9%ep2
P8ns @VV
{ n2["Ln mO
Np.<&`p!
assert((pvTo!=NULL)&&(pvFrom!=NULL)); &s\/Uq
ZKB27D_vg>
byte *pbTo=(byte*)pvTo; //防止地址被改变 h<WTN_i}
+<f+kh2L
byte *pbFrom=(byte*)pvFrom; Qi9M4Yv
jq|fIP
while (size-- >0) 6}\J-A/
Gq?>Bi;`
pbTo++ = pbForm++; "Gq%^^*
:&RpB^]
return pvTo; ^~bAixH^k
H4M`^r@)'
} 4]%MrSjS
`{}DLaD9
/q"8sj/
九、内存的分配方式 )G#O# Yy
3Ea/)EB]
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 BG]|iHi
Xcg+ SOB
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 Xupwh5G2
h<!!r
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 !\\1#:*_W
|~Vq"6`
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 &iJvkt
!4$o*{9Lx:
"T>;wyGW
十、内存分配的注意事项 }\W^$e-
/AUX7
m.8
用new或malloc分配内存时,必须要对此指针赋初值。 ? 8S~R
VlxHZ
用delete 或free释放内存后,必须要将指针指向NULL edlsS}8^
\YsLVOv%:d
不能修改指向常量的指针数据 v.Q+4
k
U/\LOIs
N'%l/
十一、内容复制与比较 r+h$]OJ
irGgo-x
//数组…… 1%N[DA^<\
jF{\=&fU
char a[]=”Hello Word!”; ksAu=X:
njb{
char b[10]; "?"+1S
O[9A} g2~
strcpy(b,a); In#m~nE[M
[*Vo`WgbD
if (strcmp(a,b)==0) ~eekv5
%
+M,FgW
{} ;!H]&2`'(
r+i=P_p
//指针…… A$::|2~
h$ $i@IO0
char a[]=”Hello Word!”; >WY\P4)k
PD:lI]:s
char *p; m=^ihQ
X`k#/~+0
p=new char[strlen(a)+1]; OkQtM
nq
oUN;u*
strcpy(p,a); 8fb<hq<
a0&R! E;
if (strcmp(p,a)==0) b5^-qc6X
&2pa9i
{} y,$zSPJCi
kfkcaj4l]
?]58{O(?c
十二、sizeof的问题 9XN/ wp
2nB{oF-Z
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 H+VjY MvK
%9T|"\
char a[]=”Hello World!” vu_ u\2d
IoHYY:[-
char *p=a; -W1Apd%>
<+p{U(
count<<sizeof(a)<<end; //12字节 b./MVz
QbEb}
Jt
count<<sizeof(p)<<endl; //4字节 cGv`%
PW"uPn
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 JcW<