1. 程式人生 > >C++建構函式

C++建構函式

建構函式

  • 建構函式是類中的特殊的成員函式,其功能是對資料成員進行初始化。
  • 不能被使用者呼叫,由系統自動呼叫,而且只執行一次。
  • 建構函式是一個與類名同名的,沒有返回值的特殊成員函式。

建構函式的定義形式:

class 類名{                                  //類內定義

    ...

    建構函式名(引數列表){

        ....

}

};

或者

類名::類名(引數列表){

    ...

}

預設建構函式

這種建構函式的特點是不帶引數,其格式如下:

建構函式名(){

    ....   //函式體

}

  • 如果類體中沒有定義任何建構函式時,C++系統會自動建立一個預設的建構函式,該建構函式是一個無參建構函式,函式體也為空,該建構函式只負責建立物件,不做任何初始化工作。

系統預設的建構函式

類名::預設建構函式名(){

    空

}

定義類時,只要顯示定義了一個類的建構函式,那麼編譯器就不產生預設的建構函式

將不帶引數的建構函式註釋掉,發現編譯器報錯

沒有相對應的建構函式A::A()。

  • 產生物件時,系統必定要呼叫建構函式,所以任一物件的建構函式必須唯一。

帶引數的建構函式

由於使用者不能呼叫建構函式,所以不能用常規的呼叫函式的方法給出實參。

  • 形式一:

類名 物件名(實參1,實參2,實參3,...);//使用有引數的建構函式建立物件

或者

類名 物件名;//使用無引數的建構函式建立物件

  • 形式二:

類名 *指標變數名=new 類名(建構函式引數)

此時,編譯系統開闢一段可以存放一個類物件的記憶體空間,通過建構函式給資料成員賦初值,這個物件沒有名字,稱為無名物件,但是該物件有地址,這個地址存放在指標變數p中,訪問new運算子動態建立的物件一般是不用物件名的,而是通過指標訪問

複製建構函式

  • 複製建構函式又稱複製初始化建構函式。也是用來初始化物件的,與一般建構函式的區別在於它是用一個已經存在的物件來對建立的物件進行初始化,即用已經存在的物件的每個資料成員的值來對建立的物件的對應資料成員進行初始化。其本質是對建構函式的過載之一
  • 複製建構函式也是由系統自動呼叫的。

其格式如下:

class 類名{

    建構函式名(形參);

    建構函式名(類名 &物件引用名);

};

類名::建構函式名(類名 &物件引用名){

    ...       //函式體

}

  • 該函式的引數是該類物件的引用,且只有一個引數。
  • 如果使用者沒有聲明覆制建構函式,系統將自動生成一個預設複製建構函式來實現用已知物件初始化新建立物件的功能。
  • 定義複製建構函式時,一定注意,形式引數必須是該類物件的引用。

複製建構函式在四種情況下會被自動呼叫

  • 用類的物件去初始化該類的另一個物件時
  • 同類物件之間可用賦值運算子=實現相應的資料成員的複製
  • 函式的形參為類的物件時,呼叫函式進行形參和實參的結合時
  • 函式的返回值是類的物件時,系統自動呼叫複製建構函式

預設複製建構函式

程式設計師沒有為類聲明覆制建構函式,則編譯器自己生成一個複製建構函式。

上述程式碼隱含的複製建構函式:

A::A(A &p){

    x=p.x;

    y=p.y;

}