C++ 構造函數

例一(類初始化錯誤用法):

struct thing
{
    char * pn;
    int m;
};
thing amabob = {"wodget", -23};    // valid initialization
Stock hot = {"Sukie's Autos, Inc.", 200, 50.25};    // No! compile error

  出錯緣由:數據訪問狀態私有(可改成公有,但違背數據隱藏的初衷)程序員

特殊成員函數——類構造函數(可用於類初始化):

專門用於構造新對象(建立對象)、將值賦給它們的數據成員(初始化)。函數

  • 原型位於類聲明的公有部分
  • 沒有聲明類型,名稱與類名相同
  • 程序聲明對象時,將自動調用構造函數
  • 參數名不能與類成員名相同
    • 緣由:此時構造函數內直接使用類成員名稱會發生混亂
    • 解決
      • 方案一:數據成員名中使用m_前綴
      • 方案二:成員名中使用後綴_

使用構造函數:

  • 顯示調用:
    Stock food = Stock("World Cabbage", 250, 1.25);    // 顯示調用
  • 隱式調用:
    Stock garment("Furry Mason", 50, 2.5)    // 隱式調用
    

      結構更緊湊設計

  • 能夠與new結合使用:
    Stock *pstock = new Stock("Electroshock Games", 18, 19.0)    // 結合new使用隱式調用
    
  • 接受一個參數的構造函數容許使用賦值語法將對象初始化爲一個值:
    Classname object = value;    // 初始化
    

      這項特性可能致使問題,但能夠關閉(之後補上方法)對象

  • 構造函數被用來建立對象,而不能經過對象來調用(在構造函數構造出對象前,對象不存在)

默認構造函數:

——在未提供顯示初始值時,用來建立對象的構造函數:blog

Stock fluffy_the_cat;    // use the default constructor
  • 沒有提供構造函數,C++將自動提供默認構造函數,它不作任何工做
    Stock::Stock() {}
    

      相似於未初始化的int x;get

  • 僅當沒有定義任何構造函數時,編譯器才提供默認構造函數。爲類定義了構造函數後,程序員就必須爲它提供默認構造函數才能使用默認構造函數。
  • 定義默認構造函數的方式:
    • 方式一:給全部參數提供默認值(千萬注意在提供默認值時,只能在類聲明中提供,若在類定義提供會出錯,由於編譯器在類聲明中查找符合要求的函數聲明,但禁止在單獨的函數定義時聲明默認值)
      Stock(cost string & co = "Error", int n = 0, double pr = 0.0);    // 定義構造函數時添加參數默認值  
    • 方式二:函數重載一個無參構造函數
      Stock();
    • 隱式地調用默認構造函數時,不要使用圓括號
      Stock first;    // calls default constructor
      Stock second();    // declare a function
      

        如第二個:變成了返回Stock對象的函數的聲明原型

    • 在設計類時,一般應提供對全部類成員作隱式初始化的默認構造函數
相關文章
相關標籤/搜索