C 的構造 析構 賦值 拷貝函式比較

2021-09-30 03:20:09 字數 1674 閱讀 4841

建構函式、析構函式與賦值函式是每個類最基本的函式。每個類只有乙個析構函式,但可以有多個建構函式(包含乙個拷貝建構函式,其它的稱為普通建構函式)和多個賦值函式(除了同類的賦值以外,還有其他的賦值方法)。對於任意乙個類a,如果不想編寫上述函式,c++編譯器將自動為a產生四個預設的函式,如

a(void);                    // 預設的無引數建構函式

a(const a &a);              // 預設的拷貝建構函式

~a(void);                   // 預設的析構函式

a & operate =(const a &a);  // 預設的賦值函式

有幾個需要注意的內容:

@ 建構函式與析構函式的另乙個特別之處是沒有返回值型別

@ 構造從類層次的最頂層的基類開始,在每一層中,首先呼叫基類的建構函式,然後呼叫成員物件的建構函式。析構則嚴格按照與構造相反的次序執行,在析構的時候,最低層的派生類的析構函式最開始被呼叫,然後呼叫每個基類的析構函式。

@ 「預設的拷貝建構函式」和「預設的賦值函式」均採用「位拷貝」而非「值拷貝」的方式來實現,倘若類中含有指標變數,這兩個函式注定將出錯

下面通過例子進一步說明,

1.建構函式的初始化表

設存在兩個類:

classa;

classb;

下面面是b的建構函式的2個實現,其中第乙個的類b的建構函式在其初始化表裡呼叫了類a的拷貝建構函式,從而將成員物件m_a初始化;而第二個的b的建構函式在函式體內用賦值的方式將成員物件m_a初始化。我們看到的只是一條賦值語句,但實際上b的建構函式幹了兩件事:先暗地裡建立m_a物件(呼叫了a的無引數建構函式),再呼叫類a的賦值函式,將引數a賦給m_a。

b::b(

consta &

a): m_a(a)

b::b(

consta &

a) 2.拷貝函式和建構函式的區別

拷貝建構函式是在物件被建立時呼叫的,而賦值函式只能被已經存在了的物件呼叫。

string  a(「hello」);

string  b(「world」);

string  c = a;  // 呼叫了拷貝建構函式,最好寫成 c(a);

c = b;             // 呼叫了賦值函式

本例中第三個語句的風格較差,宜改寫成string c(a) 以區別於第四個語句。

如果我們實在不想編寫拷貝建構函式和賦值函式,又不允許別人使用編譯器生成的預設函式,可以將拷貝建構函式和賦值函式宣告為私有函式,不用編寫**。

3.析構函式與虛析構函式

基類的建構函式、析構函式、賦值函式都不能被派生類繼承。如果類之間存在繼承關係,在編寫上述基本函式時應注意以下事項:

@ 派生類的建構函式應在其初始化表裡呼叫基類的建構函式

@ 基類與派生類的析構函式應該為虛(即加virtual關鍵字)

#include 

<

iostream

>

class

base

};class

derived : 

public

base

};void

main(

void)

輸出結果為:

~derived

~base

如果析構函式不為虛,那麼輸出結果為

~base

C 的構造 析構 賦值 拷貝函式比較

建構函式 析構函式與賦值函式是每個類最基本的函式。每個類只有乙個析構函式,但可以有多個建構函式 包含乙個拷貝建構函式,其它的稱為普通建構函式 和 多個賦值函式 除了同類的賦值以外,還有其他的賦值方法 對於任意乙個類a,如果不想編寫上述函式,c 編譯器將自動為a產生四個預設的函式,如 a void 預...

c 建構函式 拷貝,賦值,析構

建構函式 可以參考 作用 為物件成員變數賦初始值。new運算子一起使用 注意 1.建構函式的命名必須和類名完全相同 2.沒有返回值,即不用在定義時加返回值型別 void int float之類的 3.建構函式不能被直接呼叫,必須通過new運算子在建立物件時才會自動呼叫 拷貝函式 可自定義 思路就是賦...

建構函式,拷貝建構函式,析構函式,賦值函式

class cgoods else mamount amount mprice price cgoods 析構函式 cgoods const cgoods src 拷貝建構函式 void operator const cgoods src 賦值函式 private char mpname int m...