C 學習(七) C 建構函式與析構函式(二)

2021-08-11 18:47:36 字數 2590 閱讀 9421

一、最基本的建構函式

class base

private:

int m_var;

};

以上建構函式的執行過程:

1)傳參 2)給類資料成員開闢空間 3)執行冒號語法給資料成員初始化 4)執行建構函式括號裡面的內容

這裡需要說明的是:冒號語法後面的內容相當於int a = 10;(初始化),而建構函式括號裡面則是相當於是int a; a = 10;(賦初值)

二、拷貝建構函式

class base

//拷貝建構函式

base(base &ref) : m_var(ref.m_var)

private:

int m_var;

};

為什麼拷貝建構函式的引數只能用引用呢?

這就要從拷貝建構函式式數碼時候觸發開始說起了,以下幾種情況都會自動呼叫拷貝建構函式:

1)用乙個已有的物件初始化乙個新物件的時候

2)將乙個物件以值傳遞的方式傳給形參的時候

3)函式返回乙個物件的時候

拷貝建構函式,一般不需要自己編寫,系統預設的拷貝建構函式就能抗住了,但是有些情況需要在構造的時候開闢空間,這時候就需要拷貝建構函式了,如下**是摘自 林銳 博士的 高質量c++程式設計指南 一文。

class string;

// string 的析構函式

string::~string(void)

// string 的普通建構函式

string::string(const

char *str)

else

}// 拷貝建構函式

string::string(const string &other)

三、普通派生類建構函式的寫法

定義派生類物件的時候,會按如下步驟執行構造操作:

1)傳參 2)根據繼承時的宣告順序構造基類 3)給類資料成員開闢空間 4)執行冒號語法後面的語句 5)執行建構函式函式體語句

class base

private:

int m_b;

};class derived : public base

private:

int m_d;

};

再寫乙個多繼承的示例:

class base1

private:

int m_b1;

};class base2

private:

int m_b2;

};class derived : public base1, public base2

private:

int m_d;

};

四、含有虛繼承的派生類建構函式的寫法

為何要用到虛繼承?

虛繼承主要是針對多繼承時,出現二義性問題而提出的。比如,如下**就需要用到虛繼承,否則的話derived類繼承時,base類就會不明確。

虛繼承建構函式的執行按照如下步驟:

1)傳參 2)建立基類,注意這時候需要顯示建立所有「有參建構函式」的基類,包括直接基類,間接基類。 3)給類資料成員開闢空間 4)執行冒號語法 5)執行建構函式函式體

注:你可能會疑惑,如下**不是將base間接基類建立了3次嗎?其實不是這樣的,編譯器是這樣處理的,當最遠的派生類derived建立了基類base之後,其直接基類建立base類的語句將會被忽略掉。

class base

private:

int m_b;

};class base1 : virtual

public base

private:

int m_b1;

};class base2 : virtual

public base

private:

int m_b2;

};//虛繼承,避免二義性

class derived : public base1, public base2

private:

int m_d;

};

五、關於虛析構

虛析構一般伴隨著多型而產生,多型主要方式就是用基類的指標或引用指向或引用派生類,而形成多型。

但是這樣就會存在乙個問題,當我們析構的時候,由於是基類的指標,就會呼叫的是基類的建構函式,從而造成派生記憶體溢位。為了解決這個問題,引入了虛析構的概念。將基類的建構函式宣告為虛,從而使其在呼叫析構函式的時候能夠準確的呼叫派生類的析構函式。

如下**必須用到虛析構才能準確的析構派生類,並釋放其占有記憶體。

class base

//虛析構,使基類指標能準確的釋放所指向的派生類裡面的內容

virtual ~base()

private:

int m_b;

};class derived : public base

~derived()

private:

char *m_pstr;

};int main(void)

c 建構函式與析構函式

一 建構函式 c 提供建構函式來處理物件的初始化,建構函式是一種特殊的成員函式,與其他的成員函式不同,不需要使用者來呼叫他,而是在建立物件時自動執行。它的特點是 函式名和類名相同,沒有返回值,可以過載 如果程式中未宣告,則系統自動產生出乙個預設的建構函式,預設的建構函式時不帶引數的。比如 stude...

C 建構函式與析構函式

c 規定,每個類必須有預設的建構函式,沒有建構函式就不能建立物件。若沒有提供任何建構函式,那麼c 提供自動提供乙個預設的建構函式,該預設建構函式是乙個沒有引數的建構函式,它僅僅負責建立物件而不做任何賦值操作。只要類中提供了任意乙個建構函式,那麼c 就不再自動提供預設建構函式。類物件的定義和變數的定義...

C 建構函式與析構函式

建構函式 對於c 的建構函式,暫且將其分為以下幾類 1.預設建構函式 2.隱士轉換建構函式 3.拷貝建構函式 4.其它建構函式 1.預設建構函式表示沒有任何引數的建構函式,當自定義任何建構函式以後,將不再自動建立預設建構函式,當然,預設建構函式啥也不幹,程式設計師關心係數頓時大跌。關於預設建構函式還...