一、#include “filename.h”和#include <filename.h>的区别 Gu5%P ou
d <Rv~F@
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 BM_Rlcx~
]hjA,p@Q
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 Y(Q!OeC
2; ~jKR[~
&]P1IQ
二、头文件的作用 }e4#Mx
$\vTiS'
加强安全检测 4A\>O?\
MT(G=r8
通过头文件可能方便地调用库功能,而不必关心其实现方式 P"ATqQG%D
MfK}DEJK,
(#5TM1/A
三、* , &修饰符的位置 N]7#Q.(~
O+*<^*YyD
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 \p{$9e;8yT
~-K<gT/
~pve;(e=
四、if语句 X@up=%(
: ?J0e4.]
不要将布尔变量与任何值进行比较,那会很容易出错的。 xe9V'wICp(
k!=
jO#)Rd
整形变量必须要有类型相同的值进行比较 mYw9lM
2kV{|`1
浮点变量最好少比点,就算要比也要有值进行限制 :+$/B N:iO
0="U'|J_
指针变量要和NULL进行比较,不要和布尔型和整形比较 eO?@K$I
sB'Z9
x>*#cOVz;C
五、const和#define的比较 )]P%=
4Up\_
const有数据类型,#define没有数据类型 VVVw\|JB>
n|Smy\0
个别编译器中const可以进行调试,#define不可以进行调试 e!.r- v9
9#D?wR#J=
在类中定义常量有两种方式 -wUw)gJbM
yjB.-o('
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; _{ f7e^;
Q=T/hb
2、 用枚举代替const常量。 +VdC g_
LG>lj$hO
XX;MoE~MM
六、C++函数中值的传递方式 n1
kh8,
{Bm7'%i
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) OF/DI)j3
6O#
xV:Uc<
void fun(char c) //pass by value >+E
VT~jgsY
void fun(char *str) //pass by pointer "j] r
[7*$Sd
void fun(char &str) //pass by reference mb_~
"}A
ITf,
)?|]Y
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 c>pbRUMH
;"j>k>tg
函数的类型不能省略,就算没有也要加个void Ki{]5Rz
3IHA+Zz
TOvpv@?-
七、函数体中的指针或引用常量不能被返回 <$ oI
^,WXvOy
Char *func(void) NP< {WL#
:HTV 8;yc
{ g W(7jFl
6i.!C5YX]
char str[]=”Hello Word”; ,8/Con|o
)mvD2]fK
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 A:5B6Z
"Oj2B|:s&
return str; Wp0L!X=0
C0.bjFT|
} _8eN^oc%
"- XJZ;5
函数体内的指针变量并不会随着函数的消亡而自动释放 QGI_aU
Z{gJ m9
EXD Qr'"
八、一个内存拷贝函数的实现体 /UAcN1K!B
8M9}os
void *memcpy(void *pvTo,const void *pvFrom,size_t size) ZuIw4u(9
-D-]tL6w
{ 4~YPLu
z=/xv},
assert((pvTo!=NULL)&&(pvFrom!=NULL)); 0^IHBN?9
x8q3 Njr
byte *pbTo=(byte*)pvTo; //防止地址被改变 k),!%6\(
s`E^1jC
byte *pbFrom=(byte*)pvFrom; Mu?hB{o1
'"QN{ja
while (size-- >0) k~+(X|!5w
1p |}=R
pbTo++ = pbForm++; 5Dv;-G;
]pi8%.d
return pvTo; X5`#da
rs?"pGz;
} 1y)|m63&
~DJ>)pp
lmjoSINy
九、内存的分配方式 5l
ioL)
Zz@0Oj!`
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 5^W},:3R
0>KW94
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 JE$aYs<(TF
q;{# ~<"+
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 tF@hH}{;
/Q8glLnM
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 PpF"n[j
gPrIu+|F
k@i+gV%
十、内存分配的注意事项 sVjM^y24
UNB'Xjp}@
用new或malloc分配内存时,必须要对此指针赋初值。 ',<Bo{
Ka$YKY,
用delete 或free释放内存后,必须要将指针指向NULL dLq)Z*r
q=H
dGv
不能修改指向常量的指针数据 ?h*Ngbj>
Vs0T*4C=n
O=Cz*j
十一、内容复制与比较 @! gJOy
1aQR9zg%
//数组…… | ]DJz
;[ag|YU$Y
char a[]=”Hello Word!”; C~&~Ano,
QlmZ4fT[r
char b[10]; 4Sq[I
NWt `X!
strcpy(b,a); x?unE@?\S
@},25"x)
if (strcmp(a,b)==0) /I>o6 CI
=d{B.BP(
{} {xGM_vH1
JQtBt2
//指针…… IJ`%Zh{f
rrSs Qq
char a[]=”Hello Word!”; _+vE(:T
,+gU^dc|hq
char *p; 2qF
?%
g2&%bNQ-5
p=new char[strlen(a)+1]; {H5a.+-(bE
U^n71m>]%T
strcpy(p,a); g{_wMf
H:d@@/
if (strcmp(p,a)==0) ~KW|<n4m
!FqJP
OGm
{} 007(k"=oV
^4\hZ
~'[0-_]=f
十二、sizeof的问题 _XO3ml\x@
<K(qv^C
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 iB]xYfQ&@V
. paA0j
char a[]=”Hello World!” O7M8!3Eqm
E=H>|FgS
char *p=a; bc?\lD$$
ko2T9NI:S
count<<sizeof(a)<<end; //12字节 klwC.=?(j"
ji|+E`Nii
count<<sizeof(p)<<endl; //4字节 [{i"Au]
/e2CB "c
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 iOFp 9i=j
O ;34~k
void fun(char a[1000]) <Z nVWER
8l?mNapy
{ StuQ}
zeHf(N
count<<sizeof(a)<<endl; //输出4而不是1000 )g()b"Z
#>
Y#/mE!&
} Z~?1xJ&