析构函数与构造函数的区别联系

上一篇 / 下一篇  2012-09-03 14:30:21 / 个人分类:C++

51Testing软件测试网(Bo9N/L9HL&pQ

  在备战C++的学习当中,由于很多都用到函数,再次要求自己加深对函数的理解,C++中知识是并不多,我们只有不断的理解函数的真正用法,下面学习才会顺水推舟!加油!

oe.D~X^051Testing软件测试网/j$\'PONX `5z8Ez

  析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。51Testing软件测试网@7ynQ&nf

51Testing软件测试网Lz8[g&m,IQ&qe

  C++语言析构函数格式51Testing软件测试网.?6W%wlHP\

C++当中的析构函数格式如下:
NN V}-O(F7{-B'C!V q0  class <类名>
eP!^Xu3e\"O0  {51Testing软件测试网sB]*gUfZ {'G
  public:
\J sl.q Mv0P0  ~<类名>();51Testing软件测试网9C Fm$o2h`"R
  };
[)v)BSN y0  <类名>::~<类名>()
L4P2hN,IHyY0  {
m5T mt1u;h'L4M0  //函数体
_-T a*c,@_0  }
W |;p8KeE0  如以下定义是合法的:51Testing软件测试网nbH@/m'Dm]
  class T51Testing软件测试网 W N4{/E{6[ZOZN
  {51Testing软件测试网S/]l\@ z$Q
  public:
@A c1C U&] j)[9F0  ~T()
!M2K8rQOz3@ A0  };51Testing软件测试网_$I/iE[^r#QhpO
  T::~T()51Testing软件测试网9hB d:_7V!k
  {
n%D8?,U P3E7j.I:[9`0  //函数体
Zofy0Rt0  }

  当程序中没有析构函数时,系统会自动生成以下析构函数:

(y#R P~~SO0

  <类名>::~<类名>(){},即不执行任何操作。

)W BfzHY$[ o0

  下面通过一个例子来说明一下析构函数的作用:

2^$lfQ ?:P0#include<iostream>51Testing软件测试网}y ]n%v
  using namespace std;51Testing软件测试网tTp B4c.n
  class T51Testing软件测试网hk9XT2HuM$U
  {
-Mc\Vu0  public:
}-O:\ n!w+K f9bP)G0  ~T(){cout<<"析构函数被调用。";} //为了简洁,函数体可以直接写在定义的后面。51Testing软件测试网qS0FY6Jp+X
  };51Testing软件测试网*a0NPty Eo
  int main()
!a7CpO*Q)h,YP0  {51Testing软件测试网S!B+h1Y)Va
  T *t=new T;//建立一个T类的指针对象t51Testing软件测试网_7\a U+sgV
  delete t;51Testing软件测试网[._ L$NH{gM
  cin.get();51Testing软件测试网9vl+jc1ep
  }51Testing软件测试网L W:]rAhK
  最后输出:51Testing软件测试网J3Q Q k#UVJ Y

`"[Awl`2G9J~0  构造函数是一种特殊的方法,主要用来在创建对象时初始化对象。即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中,特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们。即构造函数的重载。51Testing软件测试网L+uE1] [m

#g4^\9W D!CF.f0  C++的构造函数定义格式为:

4Ms,zLEux#UG0

L?{C]%G*L }`+Bj051Testing软件测试网2v`)VF2yp

class <类名>
7p,V+Mw1_w1^0  {
8lE|S,?uM*fEhS0  public:
7w5eC~1C(a0  <类名>(参数表)51Testing软件测试网'My4s2x~m{-[
  //...(还可以声明其它成员函数)51Testing软件测试网Pi;U@+Iuel
  };
.K%U X.@W5bL0  <类名>::<函数名>(参数表)
W*WdZ%p-D)whK\0h0  {51Testing软件测试网/yP9H3s-K @I
  //函数体51Testing软件测试网X-gah~_
  }
ktM AM#W5i0  如以下定义是合法的:
$}.d#y(i#`$N"{ YwuW0  class T
zNIp(?E-GNp0  {
T(?$TCU0  public:
/n2fAG/q0  T(int a=0){i=a;}//构造函数允许直接写在类定义内,也允许有参数表。
,F/A3Odq-d5n:OV2WS~8P0  private:int i;
3L5\Ot-g)v1e0  };

j{*q E7N4eb0  如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:

&XT7F#[\%A0

N0?R#`!jqSe\0  1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;51Testing软件测试网u*a3i0?i-M2o,b

51Testing软件测试网Pv0DQ-X

  2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);

|6_HC2LJ0

&K3J"x W-g0  3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或 编译器提供的默认构造函数)。

g.nk;X4g5K,u051Testing软件测试网,TV@${+P2SZ

  <类名>::<类名>(){},即不执行任何操作。

tHo5?-k R8P051Testing软件测试网 R_'Xv7s t(bCa-i

  C++构造函数例子

%UR0BV"Xa.v?0

@"H+m C2\a6b%GL0  //注意若将本代码直接复制进编译器,可能会报错,原因是网页生成时会在代码前加一个中文占位符51Testing软件测试网Rwl{p4Ju@3q,g ^d

,s(S%E R UzF/u"^0  //最好将代码再写一次51Testing软件测试网z/?-Zz,`

51Testing软件测试网H`X+V3CzG&e)NA

my n;Pc@8S)Z0#include <iostream>51Testing软件测试网 A;QB#Juvq
  using namespace std;
m,d/HBc"l7g dY0  class time
6xv%hv+K9H6YNR0  {
t!L"Z/v)K]0  public:51Testing软件测试网qtf?7`rY*uj
  time() //constructor.构造函数51Testing软件测试网X P&Ai'wp
  {51Testing软件测试网VY]8Q6ng eez,O!V
  hour=0;
b;}0C xb&w$vK q0  minute=0;51Testing软件测试网 Bg!V,m({ x\p)z;D
  sec=0;
s TZJqx8B ?g.}M0  }51Testing软件测试网l.b8^/S6]Qv%a%X f,o9h
  void set_time();
a0b#fH2NA0  void show_time();
a@2qQ0Lwm0  private:
%~;CM+Vm.V[U0  int hour;
iG(jK0q k/C#y[0  int minute;
*i8B y+x#j0L5E0  int sec;
S c O rd(D0  };
On:L4kTMK.`0  int main()
"b+B|m(w0  {51Testing软件测试网#WBQ:P A6e
  class time t1;51Testing软件测试网E3S2tM(dVd)ED YM
  t1.show_time();
qr8`KW3O0  t1.set_time();51Testing软件测试网7msA r%xO&I3N
  t1.show_time();
?L!|5d3O(]D2_#H0  return 0;51Testing软件测试网fp\-]4p q.[P$d
  }51Testing软件测试网\ eR:o` ~t
  void time::set_time()
X(j"OT |6CG?3S0  {
0yKV&]4h&EX4v9c0y#i0  cin >>hour;
XW1y+[9v0  cin >>minute;
I v\:wb9x+^F0  cin >>sec;51Testing软件测试网"N,ZIz2FfXE
  }51Testing软件测试网G0r]-pvGf
  void time::show_time()
6Bz wBEd0  { cout<<hour<<":"<<minute<<":"<<sec<<endl;51Testing软件测试网5Q@#J*v3[#r9p
  }51Testing软件测试网CAx*W8ksRRf2aC
  程序运行情况:
l0gy-x.dC#\#D0  0:0:051Testing软件测试网 ?U*uYq h
  10 11 11 回车
\J$f Y4D3_!M0  10:11:11
p7NM'@'H(B vd0
51Testing软件测试网,n)WJ C;fgm+b

  任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。

yH:K [hX+G,Br*V0

0e? q%p%h0  构造函数与析构函数的区别51Testing软件测试网] ` o'hp$n7Ew

"{GpK%P[0  构造函数有以下特点:51Testing软件测试网\\8`E(LN? GBt0f

51Testing软件测试网"J7I4y$~EB'pKexa

  1、构造函数的名字必须与类名相同;

8^@2c*~v9W{051Testing软件测试网:f I'A pq

  2、构造函数可以有任意类型的参数,但不能具有返回类型;51Testing软件测试网(W1C/l9Y*HD%o0OJ;e$KB

51Testing软件测试网2n&R6xU ~*c

  3、定义对象时,编译系统会自动地调用构造函数;

SI.GMV051Testing软件测试网/c WzD2]N(Ef&d+t

  4、构造函数是特殊的成员函数,函数体可以在类体内,也可写在类体外;

e6T I:H zf^051Testing软件测试网G0~9z3s[6}/M

  5、构造函数被声明为公有函数,但它不能像其他成员函数那样被显式调用,它是在定义对象的同时被调用的。

g1lo zT)DH,K051Testing软件测试网x~ M-o d)x

  析构函数有以下特点:51Testing软件测试网4g@ ]CD"nD

K,G*ym&AF.b0  1、析构函数的名字必须与类名相同,但它前面必须加一个波浪号  ~  ;

;?E-CwV}2FT051Testing软件测试网L4_-ptP

  2、析构函数没有参数,也没有返回值,而且不能被重载,因此在一个类中只能有一个析构函数;

^3AG-DV/B#s051Testing软件测试网S*n gW@Z/h2\

  3、当撤销对象时,编译系统会自动地调用析构函数。51Testing软件测试网8Eh u4Y*\(e9f!u

51Testing软件测试网Z+s.Pbw K%L&z)^

TAG:

 

评分:0

我来说两句

Open Toolbar