一、#include “filename.h”和#include <filename.h>的区别 Q <ulh s
.,f]'!5
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 qERJEyU?
&W3Hj$>
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 49ehj1Se
WmkCV+thA
J:@yG1VIp
二、头文件的作用 %2\6.c=c
b94+GLU8b
加强安全检测 c-"vQ>ux+
= |E8z
u%
通过头文件可能方便地调用库功能,而不必关心其实现方式 \,#;gS"
Qq%~e41ec
0mNL!"
三、* , &修饰符的位置 $/
g<h
DOOF--ua
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 tRo` @eEX
{Ve3EYYm
qP-_xpu]R
四、if语句 sL,|+>7T^M
-EP(/CS!
不要将布尔变量与任何值进行比较,那会很容易出错的。 0\Tp/Ph
bB)$=7\
整形变量必须要有类型相同的值进行比较 >7r%k,`
#/5eQTBD
浮点变量最好少比点,就算要比也要有值进行限制 vdigw.=z
qHvU4v
指针变量要和NULL进行比较,不要和布尔型和整形比较 i-?mghe8
{<1uV']x
4 !m'9
五、const和#define的比较 4I9Yr
2Bi?^kQ#
const有数据类型,#define没有数据类型 @?RaU4e
}$[@*
个别编译器中const可以进行调试,#define不可以进行调试 T\#Gc4
jrpki<D
在类中定义常量有两种方式 8n["/5,
^\[c][fo
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; N,UUM|?9_
"MK2QIo
2、 用枚举代替const常量。 $)~ :H-
%{rPA3Xoy
U "r)C;5
六、C++函数中值的传递方式 ss6{+@,
ky&wv+7
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) o_BRsJy
u}P:9u&h6X
void fun(char c) //pass by value BLAF{vVaf
my/KsB
void fun(char *str) //pass by pointer FzykC
QNXoAx%I
void fun(char &str) //pass by reference _.E{>IFw
AxeQv'e
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 6"NtVfui
X(BX+)YR
函数的类型不能省略,就算没有也要加个void eeBW~_W
*sau['Ha
RF;[:[*W
七、函数体中的指针或引用常量不能被返回 WX]O1Y
EdTL]Xk
Char *func(void) olr-oi`4C
Yf/e(nV
{ +43~4_Oj
^Ku]8/ga
char str[]=”Hello Word”; l`uMtv/Wp
yo(MJ^=d
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 X|&H2y|*7
$xK\$kw\
return str; "ZPgl 8
0FLCN!i1
} "?kDR1=7A
22;B:
函数体内的指针变量并不会随着函数的消亡而自动释放 +o'xyR'(
fwmXIpteK
o5sw]R5
八、一个内存拷贝函数的实现体 uF1&m5^W
^vTx%F
void *memcpy(void *pvTo,const void *pvFrom,size_t size) mkfDDl2 GP
[qxU
\OSC
{ Vf.*!`UH
\B:k|Pw6~
assert((pvTo!=NULL)&&(pvFrom!=NULL)); _CTg")0o
eo@8?>}{X
byte *pbTo=(byte*)pvTo; //防止地址被改变 >ts}\.(]
R]o0V*n
byte *pbFrom=(byte*)pvFrom; Z9MR"!0
O} (sn
while (size-- >0) {p$@)b
m9\"B3sr
pbTo++ = pbForm++; sCP|d`'
1B:5O*I!J
return pvTo; :R3iLy
*B\ @L
} 6 !?]
(
V;^N:I\js
FFcIOn
九、内存的分配方式 +'+Nr<
X
y`2ux+>/
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 N-t"CBTO
iz)r.TJ
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 ]N;nq
mq:WBSsV
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 US=K}B=g
)Vrp<"v
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 ` AD}6O+x
edCVIY'1
%IE;'aa
}
十、内存分配的注意事项 B2* 7H
Ke3~o"IQ
用new或malloc分配内存时,必须要对此指针赋初值。 GU9G5S.
u!HX`~q+A
用delete 或free释放内存后,必须要将指针指向NULL (+0(A777M
^*+M9e9Z
不能修改指向常量的指针数据 z@o6[g/*Q
(C1~>7L
CE!cZZ
十一、内容复制与比较 >,tJq%
bfEH>pQ>#
//数组…… $7]?P;$
U;*t5l
char a[]=”Hello Word!”; sDR Av%w
==gL!e{
char b[10]; mdQe)>
xpCZlOld
strcpy(b,a); 7[uN;B#V
'r ^.Ao5
if (strcmp(a,b)==0) w{lj'3z I
r%WHYhD
{} Oo-4WqRJ
tQYV4h\Qj
//指针…… eK5~gnv,
2{Dnfl'k
char a[]=”Hello Word!”; <#;5)!gr{
Mk=*2=d
char *p; h-sO7M0E]
U1 *P
p=new char[strlen(a)+1]; H=*0KX{
%Y0BPTt$
strcpy(p,a); Nn-k hl|11
)4-!]NsV
if (strcmp(p,a)==0) `s Im&.d
L+T'TC:
{} @o*~\E<T
M(:bM1AD`u
9Iq<*\V 4
十二、sizeof的问题 +'iqGg-
$aB`A$'hK
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 oM^vJ3
Q4*{+$A
char a[]=”Hello World!” &/2+'wCp5
Gc*=n*@^K
char *p=a; DfU= i'R
!fd>wvJ,:
count<<sizeof(a)<<end; //12字节 0VNpd~G$
gR
gB=
C{
count<<sizeof(p)<<endl; //4字节 D5({&.X[-
8z7eL>)
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 PhV/WjCZ
X8}\m%gCU
void fun(char a[1000]) *GY8#Az
=Ti@Y
{ z_ '!?K{
oR!h
eCnu
count<<sizeof(a)<<endl; //输出4而不是1000 lq]8zm<\)]
M;'GnGFf
} {QmK4(k?|c
*93=}1gN
;$1x_
Cb
十三、关于指针 2A =Y
X[dH*PV
1、 指针创建时必须被初始化 ^!i4d))
-{J0~1'#-
2、 指针在free 或delete后必须置为NULL e-UWbn'~
fx4#R(N
3、 指针的长度都为4字节 g:xg ~H2
$%!06w#u
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 <n2'm
b{)kup
char *p=new char[100]; qmGHuQVe
AS:k&t
strcpy(p,”Hello World”); f<$*,P
( xzruI5P
delete []p; //注意前面的[]号 N?#L{Yt
Zn40NKYc
p=NULL; t2.jg?`k
X(17ESQ/Y
5、数组指针的内容不能超过数组指针的最大容易。 \6.dGKK
|
2<zYY
如: WBJn1
.HGK 3
char *p=new char[5]; t5S|0/f
J}4RJ9
strcpy(p,”Hello World”); //报错 目标容易不够大 VPuo!H
p\#;(pf}s
delete []p; //注意前面的[]号 'rFLG+W
[ +CFQf>
p=NULL; ]\>MDH
c&%3k+j
<^Y#q
十四、关于malloc/free 和new /delete 7mv([}Va
nRw.82eK.
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 kB5y}v.3 S
7h!nt=8Y
l 注意:malloc/free是库函数,new/delete是运算符 EbVC4uY
nGK=Nf.5
l malloc/free不能执行构造函数与析构函数,而new/delete可以 $7xfLS8Vo
uh#E^~5S
l new/delete不能在C上运行,所以malloc/free不能被淘汰 a #s
Nd
<;>k[P'
l 两者都必须要成对使用 $Jn.rX0}$
&z*4Uij
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 sAs`O@
w8cnSO
U8HuqFC
十五、C++的特性 tj8o6N#
;}KJ[5i-V
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 4AvIU!0w
TV_a(#S
重载和内联:即可用于全局函数,也可用于类的成员函数; =>Z4vWX*
Sx Bo%
Const和Virtual:只可用于类的成员函数; ;0$qT$,
)' ,dP)b
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 -`Zk`s|!
=%>E8)Jb
覆盖是指派生类函数覆盖基类函数 <&B]p
Rf>V]R
函数名相同; rTJU)4I^h
$ntC{a>&
参数相同; XgKYL<