【C++】建構函式

00潤物無聲00發表於2015-03-22

建構函式

    定義一個物件的同時,給它的資料成員賦初值——物件的初始化。

    結合簡單變數的建立過程來認識一下:每一個變數都是一個記憶體空間,定義變數時並初始化,就是分配記憶體空間的時候,向記憶體單元中寫入了一個初始值。而物件的建立過程與變數類似。因為類的物件比較複雜,由於類的封裝性,它不允許在類的非成員函式中直接訪問類物件的私有和保護成員。所以通過類的建構函式,可以訪問類物件的私有和包含成員,對類物件資料成員進行初始化。

    定義類時候,沒有定義建構函式,編譯系統會生成一個預設形式的隱含的建構函式,而它的函式體是空的,不具備任何功能。建構函式可以過載,然後例項化物件並初始化的時候,根據物件的引數型別和個數,從定義的建構函式中選擇相對應的。作為類的成員函式:行內函數/不帶任何引數/帶參數列及預設值/過載,根據具體問題,設計合適的建構函式將物件初始化。

特點:

    命名必須和它的類相同。

沒有返回值,加Void是錯誤的。

宣告定義為共有函式,這樣物件才能夠訪問類的資料成員並進行初始化。

建立物件時系統自動呼叫;

拷貝建構函式

    用於在建立新物件時將已存在物件的資料成員值拷貝給新物件,用物件初始化的時候,自動呼叫;如果使用者未定義,系統會自動生成預設的函式進行物件之間的位拷貝。

    特點:與類名相同。形參是本類物件的引用,等同於普通建構函式和賦值操作符共同實現。

呼叫拷貝建構函式的情況

1.類的一個物件初始化同類的另一個物件。

2.函式的形參是類的物件,呼叫函式,將物件作為函式實參傳遞給形參時。

3.函式返回值是類的物件。

拷貝建構函式與物件賦值

    拷貝建構函式是用一個存在的物件去構造另一個不存在的物件。物件賦值兩個物件都存在,把一個物件的值給兩個物件。

拷貝建構函式與建構函式在建立物件時,兩者之中有且僅有一個被呼叫。

派生類建構函式

    派生類中,新增成員中包括基類繼承的成員,內嵌的其他物件,派生類的資料成員還包括了這些物件的資料成員。構造派生類物件,對基類資料成員,物件資料成員,及自己新增資料成員進行初始化。


派生類(引數總表):基類名(參數列),成員物件名(參數列) //引數總表的個數為基類參數列與成員物件參數列之和。
{
    派生類新增資料成員;
}

單繼承建構函式的呼叫順序

1.呼叫基類建構函式

2.呼叫內嵌成員物件的建構函式

3.派生類自己的建構函式;

多繼承是單繼承的擴充套件,只是多繼承派生類基類數目多一些,建構函式呼叫順序從左向後。

虛基類的建構函式

為什麼會出現虛基類?
    多繼承中,派生類部分或全部直接基類,又是另一個共同基類派生來的。那麼直接基類中,就會包含從共同基類中繼承的相同名稱的成員。派生類物件中,同名資料成員在記憶體中同時擁有多個拷貝,同一成員函式就會有多個對映,出現間接二義性。虛基類解決了這個問題。
虛基類的定義融合在派生類的定義過程中。
    class x1:virtual public x //x為虛基類;
    建立物件的時候,使用的派生類為最遠派生類,只有最遠派生類的建構函式才呼叫虛基類的建構函式,保證虛基類子物件只初始化一次。
    虛基類的建構函式先於非虛基類建構函式呼叫。

學習的過程

    建構函式的不同的場景有不同的變化,但都是在最基本的建構函式上擴充套件的。掌握了基本的,擴充套件一下就都熟悉了。


相關文章