1. 程式人生 > >C++學習筆記——建構函式(二)

C++學習筆記——建構函式(二)

委託建構函式:使用類的其他建構函式執行初始化過程

Clock(int newH, int newM, int newS):
hour(newH), minute(newM), second(newS){
}
Clock:Clock(0,0,0){} //無參建構函式呼叫有參建構函式,將預設初始化值傳給有參建構函式

複製建構函式:是一中特殊的建構函式,其形參為本類的物件引用。作用是用一個已知的物件去初始化同類型的新物件。

class 類名{
public:
    類名(形參); //建構函式
    類名(const 類名 &物件名); //複製建構函式  const起限定作用,不讓實參被修改
    //...
};

類名::類(const 類名 &物件名) //複製建構函式的實現
{ 函式體 }

複製建構函式被呼叫的三種情況

  • 定義一個物件時,一本類另一個物件作為初始值,發生複製構造;
  • 如果函式的形參是類的物件,呼叫函式是,將使用實參物件初始化形參物件,發生複製構造;
  • 如果函式的返回值是類的物件,函式執行完成返回主調函式時,將使用return語句中的物件初始化一個臨時無名物件,傳遞給主調函式,此時發生複製構造。(這種情況也可以通過移動構造避免不必要的複製)

隱含的複製建構函式:如果沒有為類宣告拷貝初始化建構函式,則編譯器自己生成一個隱含的複製建構函式。功能是用初始值物件的每個資料成員初始化將要建立的物件的對應資料成員。

如果不希望物件被複制構造

  • C++98:將複製建構函式宣告為private,並且不提供函式的實現。
  • C++11:用“=delete”指示編譯器不生成預設複製建構函式。
class Point{  //Point類的定義
public:
    Point(int xx=0, int yy=0){x = xx; y = yy;}//建構函式,內聯
    Point(const Point &p) = delete; //指示編譯器不生成預設複製建構函式
private:
    int x, y;
};

 

例子

int main(){
    Point a; //第一個物件A
    Point b(a); //情況一,用A初始化B,呼叫
    fun1(b); //情況二,物件B作為fun1的實參,呼叫
    b = fun2(); //情況三,函式的返回值是類物件,函式返回時,呼叫
    return 0;
}

解構函式:完成物件被刪除前的一些清理工作

在物件的生存期結束的時刻系統自動呼叫解構函式

如果在類中沒有定義解構函式,編譯器將自動生成一個預設的解構函式,其函式體為空,什麼都不做。

解構函式的原型 : ~類名();

解構函式沒有引數,沒有返回型別