国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C++ 對象的初始化

2019-11-17 05:29:17
字體:
供稿:網(wǎng)友
構(gòu)造函數(shù)和析構(gòu)函數(shù)

  構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中說明的兩種非凡的成員函數(shù)。構(gòu)造函數(shù)的功能是在創(chuàng)建對象時(shí),使用給定的值來將對象初化。析構(gòu)函數(shù)的功能是用來釋放一個(gè)對象的,在對象刪除前,用它來做一些清理工作,它與構(gòu)造函數(shù)的功能正好相反。下面舉一例子來說明構(gòu)造函數(shù)和析構(gòu)函數(shù)的特點(diǎn):

  class TDate
  {
    public:
    TDate(int y, int m, int d);
    ~TDate();
    int IsLeapYear();
    void PRint();
  private:
    int year, month, day;
  };

  //類的實(shí)現(xiàn)部分
  TDate::TDate(int y, int m, int d)
  {
    year = y;
    month = m;
    day = d;
  cout<<"構(gòu)造函數(shù)已被調(diào)用。/n";
  }

  TDate::~TDate()
  {
    cout<<"析構(gòu)函數(shù)被調(diào)用。/n";
  }

  int TDate::IsLeapYear()
  {
    return(year%4==0 && year%100!=0)  (year%400==0);
  }

  void TDate::Print()
  {
    cout<
  }

  類體內(nèi)說明的函數(shù)TDate()是構(gòu)造函數(shù),而~Tdate()是析構(gòu)函數(shù)。構(gòu)造函數(shù)的特點(diǎn)如下:

  1、構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可定在類體外。

  2、構(gòu)造函數(shù)是一個(gè)非凡的函數(shù),該函數(shù)的名字與類名相同,該函數(shù)不指定類型說明,它有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。該函數(shù)可以一個(gè)參數(shù),也可以有多個(gè)參數(shù)。

  3、構(gòu)造函數(shù)可以重載,即可以定義多個(gè)參數(shù)個(gè)數(shù)不同的函數(shù)。

  4、程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對象時(shí)系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)。

  析構(gòu)函數(shù)的特點(diǎn)如下:

  1、析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可定在類體外。

  2、析構(gòu)函數(shù)也是一個(gè)非凡的函數(shù),它的名字同類名,并在前面加“~”字符,用來與構(gòu)造函數(shù)加以區(qū)別。析構(gòu)函數(shù)不指定數(shù)據(jù)類型,并且也沒有參數(shù)。

  3、一個(gè)類中只可能定義一個(gè)析構(gòu)函數(shù)。

  4、析構(gòu)函數(shù)可以被調(diào)用,也可以系統(tǒng)調(diào)用。在下面兩種情況下,析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用。

  ·假如一個(gè)對象被定義在一個(gè)函數(shù)體內(nèi),則當(dāng)這個(gè)函數(shù)結(jié)束時(shí),該對象的析構(gòu)函數(shù)被自動(dòng)調(diào)用。

  ·當(dāng)一個(gè)對象是使用new運(yùn)算符被動(dòng)態(tài)創(chuàng)建的,在使用delete運(yùn)算符釋放它時(shí),delete將會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。

  下面用一程序說明構(gòu)造函數(shù)和析構(gòu)函數(shù)的應(yīng)用:

  #include 
  #include 
  #include "tdate.h"    //類的定義存放在該文件中

  void main()
  {
  TDate today(1998, 4, 9), tomorrow(1998, 4, 10);
  cout<<"Today is:";
  today.Print();
  cout<<"Tomorrow is:";
  tomorrow.Print();
  getch();
  }

  讀者可以自行調(diào)試該程序,并分析其結(jié)果。要在VC環(huán)境下調(diào)試該程序,要對程序進(jìn)行一些參數(shù)設(shè)置,否則無法正常運(yùn)行(主要是去掉MFC的支持——該程序無需MFC的支持)。

  缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)

  在類定義時(shí)沒有定義任何構(gòu)造函數(shù)時(shí),則編譯器自動(dòng)生成一個(gè)不帶參數(shù)的缺省構(gòu)造函數(shù),其格式如下:

  <類名>::<缺省構(gòu)造函數(shù)名>()
  {
  }

  按構(gòu)造函數(shù)的規(guī)定,缺省構(gòu)造函數(shù)名同類名。缺省構(gòu)造函數(shù)的這樣格式也可由程序員定義在類體中。在程序中定義一個(gè)對象而沒有指明初始化時(shí),則編譯器便按缺省構(gòu)造函數(shù)來初始化該對象。用缺省構(gòu)造函數(shù)對對象初始化時(shí),則將對象的所有數(shù)據(jù)成員都初始化為零或空。

  同理,假如一個(gè)類中沒有定義析構(gòu)函數(shù)時(shí),則編譯系統(tǒng)也生成一個(gè)稱為缺省析構(gòu)函數(shù)數(shù),其格式如下:

  <類名>::~<缺省析構(gòu)函數(shù)名>
  {
  }

  <缺省析構(gòu)函數(shù)名>即為該類的類名。缺省析構(gòu)函數(shù)是一個(gè)空函數(shù)。 拷貝初始化構(gòu)造函數(shù)

  拷貝初始化構(gòu)造函數(shù)是一種非凡的成員函數(shù),它的功能是用一個(gè)已知的對象來初始化一個(gè)被創(chuàng)建的同類的對象。拷貝初始化構(gòu)造函數(shù)實(shí)際上也是構(gòu)造函數(shù),它是在初始化時(shí)被調(diào)用來將一個(gè)已知對象的數(shù)據(jù)成員的值拷貝給正在創(chuàng)建的另一個(gè)同類的對象。

  拷貝衩始化構(gòu)造函數(shù)的特點(diǎn)如下:

  1、該函數(shù)名同類名,因?yàn)樗彩且环N構(gòu)造函數(shù),并且該函數(shù)也不被指定返回類型。

  2、該函數(shù)只有一個(gè)參數(shù),并且是對某個(gè)對象的引用。

  3、每個(gè)類都必須有一個(gè)拷貝初始化構(gòu)造函數(shù),其格式如下:

  <類名>::<拷貝初始化構(gòu)造函數(shù)名>(const<類名>&<引用名>)

       其中,<拷貝初始化構(gòu)造函數(shù)名>是與該類名相同的。const是一個(gè)類型修飾符,被它修飾的對象是一個(gè)不能被更新的常量。

  假如類中沒有說明拷貝初始化構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)具有上術(shù)形式的缺省拷貝初始化構(gòu)造函數(shù)。作為該類的公有成員。

  下面舉一例子說明拷貝初始化構(gòu)造函數(shù)

  class TPoint
  {
    public:
    TPoint(int x, int y) {X=x; Y=y;}
     TPoint(TPoint & p);
    ~TPoint() {cout<<"析構(gòu)函數(shù)被調(diào)用。/n";}
    int Xcoord() {return X;}
    int Ycoord() {return Y;}
    private:
    int X, Y;
  };

  TPoint::TPoint(TPoint & p)
  {
    X = p.X;
    Y = p.Y;
    cout<<"拷貝初始化構(gòu)造 函數(shù)被調(diào)用。/n";
  }

  #include 
  void main()
  {
  TPoint P1(5, 7);
  TPoint P2(P1);
  cout<<"P2="<
  }

  該程序的輸出結(jié)果為:

  拷貝初始化構(gòu)造函數(shù)被調(diào)用。
  P2=5,7
  析構(gòu)函數(shù)被調(diào)用。
  析構(gòu)函數(shù)被調(diào)用。

  關(guān)于拷貝初始化構(gòu)造函數(shù)的其他用法,可從下例看出:

  #include 
  #include "tpont.h"    //類的定義放于該文件中
  TPoint f(TPoint Q);
  void main()
  {
  TPoint M(20, 35),P(0, 0);
  TPoint N(M);
  P = f(N);
  cout<<"P="<
  }

  TPoint f(TPoint Q)
  {
  cout<<"ok/n";
  int x, y;
  X = Q.Xcoord()+10;
  Y = Q.Ycoord()+20;
  TPoint R(x, y);
  return R;
  }

  請大家自行調(diào)試該程序,并分析其結(jié)果

  總結(jié):拷貝初始化構(gòu)造函數(shù)的功能就是用一個(gè)已知的對象來初始化另一個(gè)對象。在下述三種情況下,需要用拷貝初始化構(gòu)造函數(shù)來用一個(gè)對象初始化另一個(gè)對象。

  1、明確表示由一個(gè)對象初始化另一個(gè)對象時(shí),如:TPoint P2(P1);

  2、當(dāng)對象作為函數(shù)實(shí)參傳遞給函數(shù)形參時(shí),如:上例 P = f(N);

  3、當(dāng)對象用為函數(shù)返回值時(shí),如:上例 return R;


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青川县| 囊谦县| 闵行区| 太保市| 澄城县| 仁化县| 老河口市| 夏津县| 会昌县| 金昌市| 红桥区| 颍上县| 长葛市| 吉隆县| 恩平市| 张家口市| 永和县| 波密县| 上栗县| 阜新| 分宜县| 桑植县| 乌拉特后旗| 新安县| 萨迦县| 灵丘县| 安阳市| 万年县| 曲靖市| 曲阳县| 朝阳县| 通道| 凤凰县| 四子王旗| 乌拉特前旗| 宣武区| 永泰县| 永泰县| 杨浦区| 景宁| 台中县|