社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 4166阅读
  • 1回复

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 A94VSUDA:  
{bETHPCf  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 ObM5vrEk|  
}Pb!u9_  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 cjN4U [  
 7/7A  
Wq{'ZN  
二、头文件的作用 0[3b,  
1}jE?{V*  
加强安全检测 X_!mZ\H7  
/@#)j( eY/  
通过头文件可能方便地调用库功能,而不必关心其实现方式 ]}v`#-Px(  
rW\~sTH  
!Rb7q{@>  
三、* , &修饰符的位置 iBUf1v  
T[Gz  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 6  09=o+  
c7rYG]  
D 0n2r  
四、if语句 NZlJ_[\$C  
q',a7Tf:  
不要将布尔变量与任何值进行比较,那会很容易出错的。 8%xtb6#7M  
[2\`Wh:%P  
整形变量必须要有类型相同的值进行比较 )i!)Tv  
SbI,9<  
浮点变量最好少比点,就算要比也要有值进行限制 S?3{G@!  
k6Tpaf^  
指针变量要和NULL进行比较,不要和布尔型和整形比较 !m(6/*PAl  
q6G([h7  
H>7!+&M  
五、const和#define的比较 SiBbz4  
3:;%@4f  
const有数据类型,#define没有数据类型 b6/:reH{  
I(7gmCV  
个别编译器中const可以进行调试,#define不可以进行调试 /Cg/Rwl  
e1/|PgT(KM  
在类中定义常量有两种方式 L0_=R;.<  
dJ&s/Z/>E  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; >y8Z{ALQ5  
3o^V$N.  
2、 用枚举代替const常量。 PRah?|*0s  
?=4t~\g?  
&YMVoyVD  
六、C++函数中值的传递方式 Y-{spTI  
WI~%n  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) L+kS8D<  
a0LX<}   
void fun(char c) //pass by value "Q J-IRt &  
'+QgZ>q"  
void fun(char *str) //pass by pointer #xo&#FIH  
(@#Lk"B  
void fun(char &str) //pass by reference +es6c')  
%4-pw|':  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 hBqu,A  
U&/S  
函数的类型不能省略,就算没有也要加个void >S3 >b  
<A&R%5Vs  
*oWzH_  
七、函数体中的指针或引用常量不能被返回 <?7~,#AK  
X'F$K!o*,:  
Char *func(void)  Uh8ieb  
Q$zlxn 7\  
{ $Yxy(7d7w  
d!X?R}  
char str[]=”Hello Word”; ]s S oIT  
2M1mdkP3  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 ky%%H;  
.R"L$V$RU.  
return str; X5yhS  
N|)V/no6  
} 1lQ1 0J  
b>(l F%M  
函数体内的指针变量并不会随着函数的消亡而自动释放 Dm^kuTIG  
{2Ibd i  
;5l|-&{@*  
八、一个内存拷贝函数的实现体 [eN{Ft0x  
,5?MRqCM  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) W!^=)Qs  
w#$k$T)  
{ J|q_&MX/  
mNY z7N  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); _L72Ae(_  
xd.C&Dx5  
byte *pbTo=(byte*)pvTo; //防止地址被改变 wz#n$W3mGf  
e+WVN5"ID>  
byte *pbFrom=(byte*)pvFrom; )5v .9N 6v  
cA\W|A)  
while (size-- >0) l{AT)1;^  
;Vy'y  
pbTo++ = pbForm++; 0Q9OQqg m  
Uwk|M?94  
return pvTo; LN^8U  
&40]sxm  
} b#U%aPH  
/km3L7L%R  
*X-$* ~J0  
九、内存的分配方式 ;CZcY] ol  
BYf"l8^,  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 7EXmmB~>,  
/{va<CL  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 /0uinx  
eH8.O  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 jYF3u0 )  
5=986ci$U  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 AVWrD[ wD2  
IA4(^-9  
*2MTx   
十、内存分配的注意事项 w1b <>A?87  
2Qj)@&zKe#  
用new或malloc分配内存时,必须要对此指针赋初值。 \#r_H9&s6  
`ahXn  
用delete 或free释放内存后,必须要将指针指向NULL {;/o4[jlg  
)]R?v,9*D  
不能修改指向常量的指针数据 tK H!xit  
Zv\b`Cf}  
"!?bC#d#(  
十一、内容复制与比较 +bn w,B><  
AlxS?f2w  
//数组…… OEW,[d  
H/&Q,9sU21  
char a[]=”Hello Word!”; nE;gM1I  
?OyW|jL  
char b[10]; (c2\:hvy  
3lN+fQ>)S  
strcpy(b,a); Gp+XM  
U;@jl?jnG  
if (strcmp(a,b)==0) Se`N5hQ  
oUSG`g^P(M  
{} 8|GpfW3p 2  
W V U9NmvE  
//指针…… gi>_>zStv  
aO%FQ)BT  
char a[]=”Hello Word!”; V1`| j  
Qknc.Z}  
char *p; X%CPz.G  
$O8V!R*  
p=new char[strlen(a)+1]; ~2431<YV  
PEIr-qs%D  
strcpy(p,a); dDbC0} x/  
eb\`)MI/  
if (strcmp(p,a)==0) uek3Y[n  
G |^X:+  
{} |GQ$UB  
|lwN!KVQ,  
!ei20@  
十二、sizeof的问题 fZ fiiE~7J  
5qEdN  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节  F`.7_D  
oZ[ w  
char a[]=”Hello World!” 55b |zf  
E|  
char *p=a; e~;)-Z  
L? +|%[  
count<<sizeof(a)<<end; //12字节 #>B1$(@  
pH%c7X/[3L  
count<<sizeof(p)<<endl; //4字节 MA# !<b('  
sLp LY1X  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 rC `s;w  
oJT@'{;*z  
void fun(char a[1000]) B [ ka@z7  
]#.&f]6l  
{ &X,)+ b=  
%iC63)(M  
count<<sizeof(a)<<endl; //输出4而不是1000 y03a\K5[KQ  
O Zm[i H  
} D  .R  
\#,#_  
"Cj#bUw  
十三、关于指针 i6 ?JX@I  
guXpHF=  
1、 指针创建时必须被初始化 {OrE1WHB  
RsfT Ub)<  
2、 指针在free 或delete后必须置为NULL 5udoZ >T  
F$ p*G][  
3、 指针的长度都为4字节 z.HNb$;  
_ D}b  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 RpP[ymMZJ  
k.[) R@0%  
char *p=new char[100]; F)ld@Ydk=  
e*6` dz@  
strcpy(p,”Hello World”); f+Li'?  
Yj/nzTVJ[  
delete []p; //注意前面的[]号 kQlcT"R  
,ri--<  
p=NULL; @~G`~8   
HCkqh4  
5、数组指针的内容不能超过数组指针的最大容易。 $!!=fFX*y  
[<a%\:c m4  
如: c.A/{a  
b\m( 0/x  
char *p=new char[5]; kdPm # $-  
w!w _`7[  
strcpy(p,”Hello World”); //报错 目标容易不够大 6FIoWG"x  
R bc2g"]  
delete []p; //注意前面的[]号 FXEfD"  
D K_v{R  
p=NULL; u!Nfoq&'u  
V?dK*8s  
g] C3 lf-  
十四、关于malloc/free 和new /delete  ^-*Tn  
ixHZX<6zYT  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 GiO#1gA  
OrJlHMz  
l 注意:malloc/free是库函数,new/delete是运算符 _m?(O/BTx  
tF g'RV{  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 B5H&DqWzr  
1\{U<Oli  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 -JhjTA  
=&:f+!1$  
l 两者都必须要成对使用 B%:9P  
~w9 =Fd6  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 MGKeD+=5  
2$W,R/CLh  
8Pr7aT:,  
十五、C++的特性 #L= eK8^e  
[d~bZS|(T(  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 (Cd{#j<  
z "$d5XR  
重载和内联:即可用于全局函数,也可用于类的成员函数; !Fg4Au  
EQOP?>mWx!  
Const和Virtual:只可用于类的成员函数; p't:bR  
4FE@s0M,  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 !v4j`A;%  
^pV>b(?qw  
覆盖是指派生类函数覆盖基类函数 bKMR7&e.Ep  
n ,:.]3v%  
函数名相同; _AB9BQm  
?&<o_/`-H5  
参数相同; c[RL Yu  
a(DZGQ-as  
基类函数必须有Virtual关键字; Y{2d4VoW6  
XL/o y'_  
不同的范围(派生类和基类)。 rbuL@= S@*  
j484b2uj1  
隐藏是指派生类屏蔽了基类的同名函数相同 OC>_=i$ '  
A r7mH4M  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 Z t+FRR=  
|}p}`Mb)a  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 ~& WN)r'4y  
eGSp(o56  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 Z*9]:dG:!  
, 64t  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 ]baaOD$Z  
]F* a PV  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 CndgfOF  
27 145  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: ;!JX-Jq  
fw|+7 O  
将void Func(A a) 改为void Func(const A &a)。 oBNX8%5w  
T'b/]&0Tio  
而void func(int a)就没必要改成void func(const int &a); 11y .z^  
5+/b$mHZX  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 kAB+28A  
*xo;pe)9  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 'tu@`7*  
/sT ^lf=  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; 4,F3@m:<  
Cq*}b4^;  
9kX=99kf[  
十六、extern“C”有什么作用? =e!l=d|/  
)dIfr  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 g?[& 0r1  
Ph+X{|  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 z(` }:t  
bA<AG*  
\aVY>1`  
十七、构造函数与析构函数 z'oiyXEE3  
) {  
派生类的构造函数应在初始化表里调用基类的构造函数; }uI7 \\S  
#3Ej0"A@-B  
派生类和基类的析构函数应加Virtual关键字。 !H1tBg]5  
rx6-~0!eI=  
不要小看构造函数和析构函数,其实编起来还是不容易。 A6NxM8ybn+  
Gkv~e?Kc~^  
#include <iostream.h> <{cNgKd9  
JYg% ~tW'  
class Base 7*>S;$  
:`Uyn!w  
{ oO#xx)b  
mo;)0Vq2l  
public: x* =sRf  
y3cf[Q  
virtual ~Base() { cout<< "~Base" << endl ; } )b&-3$?  
GT'7,+<?N  
}; Zv|p>q`R2  
09 39i_  
class Derived : public Base hH1lgc  
EzIs@}  
{ 2T@L{ql  
1O7]3&L@  
public: 0Ws;|Yg  
:/v,r=Y9p  
virtual ~Derived() { cout<< "~Derived" << endl ; } cZgMA8 F  
n|x$vgb  
}; AUxM)H  
(/SGT$#8  
void main(void) jWXR__>.  
%0yS98']g  
{  k6O. H  
I%9bPQ  
Base * pB = new Derived; // upcast 3T|Y}  
Ts(t:^  
delete pB; j1puB  
-Aa]aDAz68  
} /Fe:h >6  
e2k4[V  
输出结果为: 79SqYe=&uy  
@n7t?9Bx  
~Derived L\}Pzxn  
s !#HZK  
~Base 6X7s 4  
Xb]=:x(  
如果析构函数不为虚,那么输出结果为 _\dt?(m|  
4L5o\'X  
~Base ieo|%N{'  
Z&FkLww  
x" 'KW (  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 aqs%m (  
J]}FC{CD!  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
级别: 经院高中
发帖
302
铜板
1924
人品值
102
贡献值
0
交易币
0
好评度
294
信誉值
0
金币
0
所在楼道
只看该作者 1 发表于: 2006-08-17
我看不懂~```````
物尽天长的日子,希望如同电视剧看了一集又一集,等到剧终了,才发现终结是如此不舍而无奈。
描述
快速回复

您目前还是游客,请 登录 或 注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五