一、#include “filename.h”和#include <filename.h>的区别 c%=IL M4
YW{C} NA
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 N^3N[lD{
Fd0%lnui
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 HD(.BW7
;[fw]P n
s`0QA!G{-
二、头文件的作用 rF]h$Z8o
qh`t-
加强安全检测 XLH0 ;+CL{
]CoeSA`j
通过头文件可能方便地调用库功能,而不必关心其实现方式 &L^+BQ`O?
9uGrk^<t
qAw x2fPu
三、* , &修饰符的位置 fFc/
d(
w Xsmn1w9
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ~R(%D-k
)E~79!
>%wLAS",w
四、if语句 tg{H9tU;
)oyIe)
不要将布尔变量与任何值进行比较,那会很容易出错的。 u9N 1pZ~
>Z1sb n
整形变量必须要有类型相同的值进行比较 xD6@Qk
Rz.? i+
浮点变量最好少比点,就算要比也要有值进行限制 () j=5KDu
)kP5u`v
指针变量要和NULL进行比较,不要和布尔型和整形比较 ub|V\M{
Yl3n2R /U
5-M&5f.
五、const和#define的比较 ELj\[&U
z_|/5$T>U
const有数据类型,#define没有数据类型 hNzB4p
}`@728E
个别编译器中const可以进行调试,#define不可以进行调试 E2m8UBS
h=:Q-?n-
在类中定义常量有两种方式 VY3&
wu)w
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; ~J P=T
1;{Rhu7*
k
2、 用枚举代替const常量。 vvm0t"|\
|9B.mBoX
m%76i;uP
六、C++函数中值的传递方式 ~8]NK&J
7x@A%2J
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference)
YxP&7oq
7(5
4/
void fun(char c) //pass by value q}]XYys
UXh9:T'%
void fun(char *str) //pass by pointer `DC2gJKk%
)Q.>rX,F
void fun(char &str) //pass by reference 5=Di<! a;
ndkti5L,
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 Cvf[/C+
B#M5}QT|2
函数的类型不能省略,就算没有也要加个void Rp5#clsy
?#45wC
7Zh~lM
七、函数体中的指针或引用常量不能被返回 |>#{[wko
O<,\^[x
Char *func(void) k3uit+ge}
Iu <?&9t
{ F F|FU<
Pqn@ST
char str[]=”Hello Word”; O)jWZOVp >
,]d,-)KX8
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 f`;j:O
uB]b}"+l
return str; VSSu&Q
Ba!J"b]
} *3?'4"B{8
bLwAXW2K+
函数体内的指针变量并不会随着函数的消亡而自动释放 iB498t
3J5!oF{H
'JRvP!]
八、一个内存拷贝函数的实现体 `tn{ei
D8xmE2%
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 7eiV{ tYF
D/Mi^5H)
{ lk( }-
WUh$^5W
assert((pvTo!=NULL)&&(pvFrom!=NULL)); h"/<?3{
yI"6Da6|y
byte *pbTo=(byte*)pvTo; //防止地址被改变 1#ft#-g}
XR;eY:89
byte *pbFrom=(byte*)pvFrom; eb =D/
1
=M ?GDc
while (size-- >0) 7BJzMlJ1Y
BYMi6wts
pbTo++ = pbForm++; o<|P9#(U"
< Pky9o;
return pvTo; MZT23[+
<x<"n t
} ;u>DNG|.
`nZ )>
RE/~#k@a
九、内存的分配方式 1fZ(l"
e=+?K5q{P(
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 7*?}:
Mw;sLsu
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 2u5|8
i*@<y/&'
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。
%*L:sTj(
G{6;>8h
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 Qx+%"YO
[x,>?~6ek
4x 8)gE
十、内存分配的注意事项 =fO5cA6Z
/!3@]xz*
用new或malloc分配内存时,必须要对此指针赋初值。 PEW=@xj2y
%@6}GmK^
用delete 或free释放内存后,必须要将指针指向NULL N19({0+i2
<y?r!l=Am
不能修改指向常量的指针数据 1*@'-mj
Jz2N
!0vG|C;'
十一、内容复制与比较 uA#P'?
T-U}QM_e
//数组…… ~NpA".PB
A}3=561F?5
char a[]=”Hello Word!”; 5nKj
)RH7M
xo&]$W8
char b[10]; BEre*J
!Ikt '5/
strcpy(b,a); 3ZXQoC '
hMykf4
if (strcmp(a,b)==0) TztAZ2C
/(.mp<s0
{} sXD1C2o
p_${Nj
//指针…… =g|IG
[V
a- |*?{o
char a[]=”Hello Word!”; Y7*U:I+N
Aj+2;]M
char *p; Y07ZB'K
'.81zpff
p=new char[strlen(a)+1]; 5'X ]k@m_
@T'i/}nl
strcpy(p,a); P_Gw-`L5T
(q(~de
if (strcmp(p,a)==0) -UOj>{-
d~JKH&x<
{} MP4z-4Y
ZHm7Isa1
%)0*&a 4
十二、sizeof的问题 R]RZq+2^
jhb6T ?}
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 3%(N[&LU
$>u*}X9
char a[]=”Hello World!” {z")7g ]l
{l/-LZ.
char *p=a; hHT_V2*
z$?~Y(EY
count<<sizeof(a)<<end; //12字节 k[:bQ)H
<U!`J[n%
count<<sizeof(p)<<endl; //4字节 no9;<]4
&GB:|I'%7
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 9*{[buZX
)~HUo9K9
void fun(char a[1000]) &