程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC++深入詳解:構造函數

VC++深入詳解:構造函數

編輯:vc教程

  按下鍵盤上的F7功能鍵編譯例2-5的代碼,然後按下鍵盤上的Ctrl+F5執行程序,出現如圖2.10所示的運行結果。

  從圖中可以看到,輸出了兩個很大的負數。這是因為在構造pt對象時,系統要為它的成員變量x和y分配內存空間,而在這個內存空間中的值是一個隨機值,在程序中我們沒有給這兩個變量賦值,因此輸出時就看到了如圖2.10所示的結果。這當然不是我們所期望的,作為一個點的兩個坐標來說,應該有一個合理的值。為此,我們想到定義一個初始化函數,用它來初始化x和y坐標。這時程序的代碼如例2-6所示,其中加灰顯示的部分為新添加的代碼。

  

圖2.10 EX03程序的運行結果

  例2-6

  #include <iOStream.h>
  class point
  {
  public:
     int x;
     int y;
     void init()
     {
       x=0;
       y=0;
     }
     void output()
     {
       cout<<x<<endl<<y<<endl;
     }
  };
  void main()
  {
     point pt;
     pt.init();
     pt.output();
  }

  然而,對於我們定義的init函數,在編寫程序時仍然有可能忘記調用它。那麼,能不能在我們定義pt這個對象的同時,就對pt的成員變量進行初始化呢?在C++當中,給我們提供了一個構造函數,可以用來對類中的成員變量進行初始化。

  C++規定構造函數的名字和類名相同,沒有返回值。我們將init這個函數刪去,增加一個構造函數point。這時程序的代碼如例2-7所示,其中加灰顯示的部分為新添加的代碼。

  例2-7

  #include <iOStream.h>
  class point
  {
  public:
     int x;
     int y;
     point()  //point類的構造函數
     {
       x=0;
       y=0;
     }
     void output()
     {
       cout<<x<<endl<<y<<endl;
     }
  };
   
  void main()
  {
     point pt;
     pt.output();
  }

  在程序中,point這個構造函數沒有任何返回值。我們在函數內部對x和y變量進行了初始化,按F7編譯代碼,按Ctrl+F5執行程序,可以看到輸出結果是兩個0。

  構造函數的作用是對對象本身做初始化工作,也就是給用戶提供初始化類中成員變量的一種方式。可以在構造函數中編寫代碼,對類中的成員變量進行初始化。在例2-7的程序中,當在main函數中執行“point pt”這條語句時,就會自動調用point這個類的構造函數,從而完成對pt對象內部數據成員x和y的初始化工作。

  如果一個類中沒有定義任何的構造函數,那麼C++編譯器在某些情況下會為該類提供一個默認的構造函數,這個默認的構造函數是一個不帶參數的構造函數。只要一個類中定義了一個構造函數,不管這個構造函數是否是帶參數的構造函數,C++編譯器就不再提供默認的構造函數。也就是說,如果為一個類定義了一個帶參數的構造函數,還想要無參數的構造函數,則必須自己定義。

  知識點 國內很多介紹C++的圖書,對於構造函數的說明,要麼是錯誤的,要麼沒有真正說清楚構造函數的作用。在網友backer的幫助下,我們參看了ANSI C++的ISO標准,並從匯編的角度試驗了幾種主流編譯器的行為,對於編譯器提供默認構造函數的行為得出了下面的結論:

  如果一個類中沒有定義任何的構造函數,那麼編譯器只有在以下三種情況,才會提供默認的構造函數:

  1.如果類有虛擬成員函數或者虛擬繼承父類(即有虛擬基類)時;

  2.如果類的基類有構造函數(可以是用戶定義的構造函數,或編譯器提供的默認構造函數);

  3.在類中的所有非靜態的對象數據成員,它們所屬的類中有構造函數(可以是用戶定義的構造函數,或編譯器提供的默認構造函數)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved