一、#include “filename.h”和#include <filename.h>的区别 gI "ZhYI
b3F)$UQ
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 ^ gMoW
#%O|P&rA
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 h/ 5|3
Z<L}ur
7/+I"~
二、头文件的作用 4&X
D
cWjb149@)
加强安全检测 kH~ z07:
m0QE
S
通过头文件可能方便地调用库功能,而不必关心其实现方式 6!zBLIYFI
vT~ey
i)y8MlC{
三、* , &修饰符的位置 3n;>k9{
3}dTbr4y
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 i0Ejo;dB
waI?X2
[p3{d\=*?
四、if语句 uP, iGA
(
m/ujz
不要将布尔变量与任何值进行比较,那会很容易出错的。 :B{Wf 2<z
`NYu|:JK:
整形变量必须要有类型相同的值进行比较 |_."U9!Z^
ze2%#<
浮点变量最好少比点,就算要比也要有值进行限制 M.fAFL
<}7 5Xo
指针变量要和NULL进行比较,不要和布尔型和整形比较 ,1/O2aQ%\0
Zc 9@G-
oC
?UGY~xL
五、const和#define的比较 \4Uhc3
!C\$=\$
const有数据类型,#define没有数据类型 9d&@;&al
6&|hpp#[
个别编译器中const可以进行调试,#define不可以进行调试 9gq+,g>E_
#1*#3p9UL
在类中定义常量有两种方式 [wU e"{
R!i\-C1 S
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; ` _aX>fw
_U.|$pU
2、 用枚举代替const常量。 G0#<SJ,)
`-t8ag3
OT0%p)
六、C++函数中值的传递方式 ]1hyv m3
/pY-how%!
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) O6*2oUKqK
(
jAC Lo
void fun(char c) //pass by value GuK3EM*_
S[ch/
void fun(char *str) //pass by pointer n*A?>NV
a-e_ q
void fun(char &str) //pass by reference "I)/|x\G*
u7&q(Z&&O
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 8\WV.+
RW~!)^
函数的类型不能省略,就算没有也要加个void mtU{d^B
Q g~cYwX
Hg&.U;n
七、函数体中的指针或引用常量不能被返回 o|:c{pwq
n%|og^\0
Char *func(void) :HW| mqKd
Y5c,O>T5Y
{ +*RaX (&
CvhVV"n
char str[]=”Hello Word”; 'oKen!?A
u9nJ;:
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 |I[/Fl:
a\m_Q{:
return str; >``sM=W at
BG|m5f
} :FT x#cZ
U$yy7}g
函数体内的指针变量并不会随着函数的消亡而自动释放 QyghNImp
}7non
IOA2/WQu
八、一个内存拷贝函数的实现体 xU/7}='T
kEgpF{"%n
void *memcpy(void *pvTo,const void *pvFrom,size_t size) clG@]<a`_
pfBe24q
{ oyB
gF\
}y%c.
assert((pvTo!=NULL)&&(pvFrom!=NULL)); J>l?HK
apOXcZ
byte *pbTo=(byte*)pvTo; //防止地址被改变 :KmnwYm
Y5CDdn
byte *pbFrom=(byte*)pvFrom; XGuxd
l-Be5?|{_
while (size-- >0) ]p8zT|bv
zmU@ k
pbTo++ = pbForm++; SZ29B
r<$o [,W
return pvTo; 8`<e\g7-
qk~m\U8r
} X=+|(A,BdY
m"@o
HYg! <y
九、内存的分配方式 h1t~hrq
C. BlB
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 ZDG~tCh=@
%afN&T
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 {E; bT|3z
cJMi`PQ;
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 }*
\*<d
3
,ZghV1z
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 [
*Dj7zt:
fat;5XL@
3eg6 CdT
十、内存分配的注意事项 f8
BZk h
E!'6vDVC:
用new或malloc分配内存时,必须要对此指针赋初值。 [~PR\qm
Ur]/kij
用delete 或free释放内存后,必须要将指针指向NULL 6P3h955c
fy]c=:EmD
不能修改指向常量的指针数据 Jd^Lnp6?
T|8:_4/l
QM![tZt%;
十一、内容复制与比较 %s497'
Bn9#F#F<
//数组…… m]vS"AdX
m/Erw"Z
char a[]=”Hello Word!”; hq&|
@DIEENiM
char b[10]; #dKy{Q3he
RIQ-mpg~(k
strcpy(b,a); eF]8Ar1
y XKddD
if (strcmp(a,b)==0) s`ZP2"`f
$*VZa3B\
{} MVnN0K4
>23$_'2
//指针…… U?an\rv
r<'DS9m
char a[]=”Hello Word!”; %3O))Ug5
J%-4ZB"
char *p; x3g4 r_
_1Q6FI5iR
p=new char[strlen(a)+1]; cnS;9=,&
+ %v1X&_\
strcpy(p,a); Unv'm5/L
L2+cVR
if (strcmp(p,a)==0) y>.t[*zT
n\)1Bz
{} <}:` Y"
4(sHUWT
d!w3LwZ
十二、sizeof的问题 u7^(?"x
~+j2a3rv-{
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 P3`$4p?
T>]T=
char a[]=”Hello World!” s;YbZ*oaMe
{1Y@%e
char *p=a; =Q{?!
3<Zp+rD
count<<sizeof(a)<<end; //12字节 xu_,0ZT]{
]+46r!r|
count<<sizeof(p)<<endl; //4字节 y+T[="W
~uH_y-
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 04jvrde8-O
70GBf"
void fun(char a[1000]) 'AX5V-t
l 9
wO x
{ yhYF "~CM
2mnAL#
count<<sizeof(a)<<endl; //输出4而不是1000 ^P^%Q)QXl
Gc"hU:m
} [nZIV
-&sY