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

c++常识点~

级别: 终身会员
发帖
3743
铜板
8
人品值
493
贡献值
9
交易币
0
好评度
3746
信誉值
0
金币
0
所在楼道
一、#include “filename.h”和#include <filename.h>的区别 iz^a Qx/  
r]-n,  
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 Ae=JG8Ht~  
hlre eXv  
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 )n"0:"Ou  
2u-J+  
u`wD6&y*  
二、头文件的作用 QDj%m%Xd  
c|3oa"6T>  
加强安全检测 )-"<19eu  
]35`N<Ac  
通过头文件可能方便地调用库功能,而不必关心其实现方式 MA_YMxP.'  
M._E$y,5  
[(a3ljbRX  
三、* , &修饰符的位置 ..h@QQ  
=}tomN(F~[  
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 (`slC~"  
=RXeN+ &R  
Id^q!4Th9  
四、if语句 DZmVm['l  
S0OL;[*.  
不要将布尔变量与任何值进行比较,那会很容易出错的。 ZD]{HxGL!  
fJ\?+,  
整形变量必须要有类型相同的值进行比较 ] 7[#K^  
q_ ^yma  
浮点变量最好少比点,就算要比也要有值进行限制 P7T'.|d  
,d*1|oUw  
指针变量要和NULL进行比较,不要和布尔型和整形比较 A",}Ikh='`  
$,O8SW.O$  
&\ca ? #  
五、const和#define的比较 Z,AY<[/C  
lO|LvJyx  
const有数据类型,#define没有数据类型 y+Nw>\|S  
FO(QsR=\s  
个别编译器中const可以进行调试,#define不可以进行调试 %5+X  
L<oQKe7Q:  
在类中定义常量有两种方式 T~$Eh6 D  
_'Jjt9@S  
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; L|<j/bP  
)H]L/n  
2、 用枚举代替const常量。 i._RMl5zg  
zqrqbqK5R  
8ZbXGQ  
六、C++函数中值的传递方式 b3_P??yp  
3n)Kzexh  
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) '/XP4B\(E  
.|u`s,\  
void fun(char c) //pass by value Q=%W-  
$bKXP(  
void fun(char *str) //pass by pointer E@otV6Wk[@  
]v5/K  
void fun(char &str) //pass by reference )uAY_()/  
VJw7defc  
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 &n8Ja@Y]  
Fab]'#1q4  
函数的类型不能省略,就算没有也要加个void rSt5 @f?  
'hWA&Xx +  
m;4ti9  
七、函数体中的指针或引用常量不能被返回 ceJ#>Rj  
"9^b1UH<  
Char *func(void) :sK4mRF  
s* u1n+Zq  
{ 'bLP#TAzf  
j&/+/s9N  
char str[]=”Hello Word”; lijT L-3  
(Nz`w  
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 "CC"J(&a  
8pA<1H%  
return str; [ *It' J^  
55ec23m  
} N;YFr  
a+J>  
函数体内的指针变量并不会随着函数的消亡而自动释放 6Q>:vQ+E  
oV['%Z'  
VI9rezZ*  
八、一个内存拷贝函数的实现体 Oq% TW|a#  
G"m0[|XH  
void *memcpy(void *pvTo,const void *pvFrom,size_t size) oB!Y)f6H1  
b==jlYa=  
{ qov<@FvE0  
T=~d. &J  
assert((pvTo!=NULL)&&(pvFrom!=NULL)); un!v1g9O  
!pRu?5  
byte *pbTo=(byte*)pvTo; //防止地址被改变 ?[bE/Ya+S  
2V% z=  
byte *pbFrom=(byte*)pvFrom; kl~/tbf  
.]KC*2  
while (size-- >0) glo G_*W  
B%u[gNZ  
pbTo++ = pbForm++; +J{ErsG?6P  
_3%:m||,XP  
return pvTo; Y)lr+~84f  
?kZ-,@h:  
} 3mYW]  
k ?6d\Q  
SXl~lYUL  
九、内存的分配方式 (O(TFE5^  
~.G$0IJY  
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 ^{IZpT3  
H[s+.&^  
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 GTfM *b  
aj|PyX3P:  
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 #6#n4`%ER  
R!/JZ@au<  
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 4P)#\$d:  
hTO 2+F*  
Va.TUz4  
十、内存分配的注意事项 NL `  
MUZ]*n&0  
用new或malloc分配内存时,必须要对此指针赋初值。 >Ho=L)u  
vf>d{F^rv  
用delete 或free释放内存后,必须要将指针指向NULL Bi;a~qE  
}OnU32P  
不能修改指向常量的指针数据 #l&*&R~>  
03|nP$g  
1;kMbl]  
十一、内容复制与比较 8;"%x|iBoL  
g8'8"9:xC  
//数组…… "]p&7  
`{K-eHlrM9  
char a[]=”Hello Word!”; b@4UR<  
9&zR i  
char b[10]; HH6H4K3Zj  
\fC;b"j  
strcpy(b,a); bG"FN/vg  
u=s,bt,"5  
if (strcmp(a,b)==0) a""9%./B  
;aD~1;q  
{} \VIY[6sn\M  
G8w@C  
//指针…… mYJ8O$  
+PsR*T  
char a[]=”Hello Word!”; 7;'UC','  
aw lq/  
char *p; 52# *{q}  
ND?"1/s  
p=new char[strlen(a)+1]; E]&N'+T  
%nq<nfDT  
strcpy(p,a); /<[_V/g[t?  
ZHeue_~x4  
if (strcmp(p,a)==0) dn])6Xl;i  
0Qeda@J  
{} yp=sL' E  
h7K,q  S  
5M'cOJ  
十二、sizeof的问题 9cN@y<_I  
$4ZV(j]  
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 tFn[U#'  
=Oh$pZRymu  
char a[]=”Hello World!” "8z Me L  
Si~wig2  
char *p=a; ljrJC  
#k>n5cR@0  
count<<sizeof(a)<<end; //12字节 rmvrv.$3  
ZW"f*vwQo  
count<<sizeof(p)<<endl; //4字节 : Gi8Jo  
?Q=(?yR0]  
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 am.d^'  
@##}zku  
void fun(char a[1000]) 4mp)v*z  
CpX[8>&osD  
{ zCA8}](C^  
3K~^H1l  
count<<sizeof(a)<<endl; //输出4而不是1000 "N &ix*($  
cC$YD]XdIA  
} b|x B <  
x%@M*4:&  
~MB)}!S:  
十三、关于指针 /#: *hn  
<x;g9Z>(  
1、 指针创建时必须被初始化 jM6$R1HX  
] X]!xvN@  
2、 指针在free 或delete后必须置为NULL B&59c*K  
Z \ @9*  
3、 指针的长度都为4字节 .@mZG<vg  
s/~[/2[bnf  
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 ? B|i  
BOvJEs!UX  
char *p=new char[100]; f`>\bdz  
5M)B  
strcpy(p,”Hello World”); {*CG&-k2D  
L&NpC&>wD  
delete []p; //注意前面的[]号 qx >Z@o  
';v2ld 9  
p=NULL; G^|b*n!!  
UDJ#P9uy  
5、数组指针的内容不能超过数组指针的最大容易。 PPpaH!(D  
t,XbF  
如: zTG1 0  
FChW`b&S  
char *p=new char[5]; xk8NX-:  
G5 )"%G.  
strcpy(p,”Hello World”); //报错 目标容易不够大 c??m9=OX1  
Wx;%W"a  
delete []p; //注意前面的[]号 fIx|0,D&7L  
h;} fdk  
p=NULL; S$wC{7?f  
'i3-mZ/|8  
]NWcd~"b!Z  
十四、关于malloc/free 和new /delete KU+u.J  
l&] %APL  
l malloc/free 是C/C+的内存分配符,new /delete是C++的内存分配符。 R"t2=3K  
+ZE"pA^C  
l 注意:malloc/free是库函数,new/delete是运算符 Avljrds+7  
zKYN5|17  
l malloc/free不能执行构造函数与析构函数,而new/delete可以 h= YTgJ  
<R2SV=]Sq#  
l new/delete不能在C上运行,所以malloc/free不能被淘汰 i+I.>L/S  
n3/ Bs  
l 两者都必须要成对使用 l_ x jsu  
qIzv|Nte  
l C++中可以使用_set_new_hander函数来定义内存分配异常的处理 eK3d_bF+  
bccf4EyQ Y  
 UiK)m:NU  
十五、C++的特性 ZS_  z  
T|YMU?4  
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制 yQu/({D  
98zJ?NaD&  
重载和内联:即可用于全局函数,也可用于类的成员函数; ~ U8#yo  
9K&YHg:1  
Const和Virtual:只可用于类的成员函数; K;\fJ2ag  
1Nv qtVC  
重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。 4.kn , s  
M M @&QaK  
覆盖是指派生类函数覆盖基类函数 rO1N@kd/  
yG#x*\9  
函数名相同; 7Fa1utV I  
5wvh @Sc\  
参数相同; 9Z 6  
hG9Mp!d91  
基类函数必须有Virtual关键字; vHPsHy7y  
KUq(&H7  
不同的范围(派生类和基类)。 ^\VVx:]  
#.}&6ZP  
隐藏是指派生类屏蔽了基类的同名函数相同 XK0lv8(  
[Q8vS;.  
1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。 <1~_nt~(*  
/W}"/W9  
2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。 K7qR  
\Q?#^<O  
内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。 *'n=LB8R  
BH$hd|KD<  
Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 URr{J}5  
V3 ~&R:Z9e  
1、 参数做输入用的指针型参数,加上const可防止被意外改动。 YZ->ep}  
vBY?3p,0p  
2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如: kk CoOTe&  
[-)BI|S:  
将void Func(A a) 改为void Func(const A &a)。 !.|A}8nK  
te>Op 1R  
而void func(int a)就没必要改成void func(const int &a); x+Ly,9nc$  
RtaMrG=D  
3、 给返回值为指针类型的函数加上const,会使函数返回值不能被修改,赋给的变量也只能是const型变量。如:函数const char*GetString(void); char *str=GetString()将会出错。而const char *str=GetString()将是正确的。 \:Hh'-77q  
3Z}m5f`t  
4、 Const成员函数是指此函数体内只能调用Const成员变量,提高程序的键壮性。如声明函数 int GetCount(void) const;此函数体内就只能调用Const成员变量。 mI;\ UOh'  
NeewV=[%  
Virtual:虚函数:派生类可以覆盖掉的函数,纯虚函数:只是个空函数,没有函数实现体; W{}M${6&  
2rf#Bq?7  
K1- 3!G  
十六、extern“C”有什么作用? sa"!ckh  
~Bt >Y  
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。 )o::~ eu  
u@4khN: ^p  
Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可。 0SZ:C(]  
5S7ATr(*  
BUBtK-n~"3  
十七、构造函数与析构函数 ^w jMu5f  
"@xL9[d  
派生类的构造函数应在初始化表里调用基类的构造函数; "t>H B6^  
d&DQ8Gm ^  
派生类和基类的析构函数应加Virtual关键字。 Hv =7+O$  
/XuOv(j  
不要小看构造函数和析构函数,其实编起来还是不容易。 |A)a ='Ap  
~\O,#j`_  
#include <iostream.h> ~.S/<:`U  
$|19]3T@Z  
class Base 3HndE~_C&  
-ozcK  
{ t0ZaIE   
#6 $WuIG  
public: k,/2]{#53d  
v@:m8Y(t  
virtual ~Base() { cout<< "~Base" << endl ; } 5lE9UoG[Q  
pf&SIG  
}; t1o_x}z4.  
3`njQvI\  
class Derived : public Base VQ2B|v  
o~'UWU'#  
{ 1L _(n  
h7}P5z0F  
public: ;'4Kg@/  
}~ga86:n0  
virtual ~Derived() { cout<< "~Derived" << endl ; } #4& <d.aw'  
-D_xA10  
}; |f[:mO   
((fFe8Rn)q  
void main(void) *,XT;h$'>  
T FK#ign  
{ Ehtb`Ms  
t)l^$j !h@  
Base * pB = new Derived; // upcast @p9YHLxLjQ  
;.d{$SO  
delete pB; 0(|36 ;x  
]Mgxv>zRbs  
} `n%8y I%  
?Aky!43  
输出结果为: ue!wo-|#G  
Q~)A fa{  
~Derived )m10IyUAY  
9P-I)ZqL  
~Base kO8oH8Vt  
%uy?@e  
如果析构函数不为虚,那么输出结果为 SrvC34<7  
ia%U;M  
~Base n'<F'1SWv  
@9h6D<?  
[F^j(qTR  
十八、#IFNDEF/#DEFINE/#ENDIF有什么作用 e:iqv?2t  
J<ZG&m362p  
仿止该头文件被重复引用
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

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

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