c 中的建構函式和拷貝建構函式

2021-07-13 21:47:45 字數 1580 閱讀 6203

c++的類有六個預設成員函式,我今天介紹其中的兩個,乙個是建構函式另乙個是拷貝建構函式。

建構函式用於當類的物件被建立時,給它分配記憶體空間,並且由編譯器自動呼叫建構函式對類物件進行初始化工作。

建構函式的函式名與類名相同,沒有返回型別。下面是乙個例子:

class string

private:

char* _pstr;

}

這個時候string就是我們string類的建構函式,當然它現在什麼都沒有做。

建構函式可以對類物件這樣進行初始化:

string(const char* pstr = "")

:_pstr(new char[strlen(pstr) + 1])

這幾行**對類物件進行了初始化。首先由函式接收乙個引數(假如沒有給引數那麼預設為「」,而且預設的建構函式只能有乙個),後面冒號後面的是初始化列表,初始化列表以冒號開始,中間用逗號隔開,每個成員只能出現一次,初始化的順序也要按照成員定義的順序。在上面的例子中我們給成員初始化了一塊空間,並且在函式內部呼叫strcpy函式把字串的內容也拷貝進去了。

當然你的建構函式可以沒有引數,讓它在函式內部進行初始化,也可以通過初始化列表進行初始化。

比如這樣:

class complex

private:

double _real;

double _image;

}

或者這樣:

class complex

private:

double _real;

double _image;

}

假如你的類沒有顯示的定義乙個建構函式,那麼編譯器會給你生成乙個。

下面介紹拷貝建構函式。拷貝建構函式是一種特殊的建構函式,函式名也和類名是一樣的,它的唯一的乙個引數是本型別的乙個引用變數。當然,引數最好要宣告為const,起到乙個保護的作用。

那麼什麼時候會呼叫拷貝建構函式呢?當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:

① 當我們要用乙個物件去初始化另乙個物件時。

② 當函式的引數為類的物件時。

③ 函式的返回值是類的物件。

下面我們舉乙個例子:

string(const char* pstr = "")

:_pstr(new char[strlen(pstr) + 1])

string(const string& s)

在這個例子中,上面的是建構函式,下面的是拷貝建構函式。

如上文所說,它的引數是const類物件的乙個引用變數,在函式內部對新的類物件進行了初始化。假如我們不顯式的定義拷貝建構函式,那麼編譯器給我們的會是乙個進行淺拷貝的函式。那麼在我們進行清理,把我們申請的空間進行釋放的時候,就會產生問題。所以我們在寫程式的時候要盡量顯顯式的定義建構函式和拷貝建構函式。

本文出自 「劉子蛋好好學習」 部落格,請務必保留此出處

c 建構函式和拷貝建構函式

c 中為什麼要使用建構函式?c 是從c演變過來的,c中存在的是結構體,例如 對點point struct point 但是對點的操作還要在外部使用函式來實現。c 中包括了成員屬性和成員方法,但是由於類的封裝性,不能像普通變數乙個對成員屬性就行初始化,所以使用建構函式。class point doub...

C 的建構函式和拷貝建構函式

編譯器自動生成的構造僅僅做讓編譯能通過的事情,它不會初始化成員變數。編譯器並不會自動生成預設的建構函式和拷貝建構函式,僅僅在它需要的時候。沒錯!對於下面的類 class test 編譯器不會自動生成建構函式,因為沒有字段需要初始化。很多時候都需要深拷貝,這時需要自己定義copy constructo...

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...