C 類中6個預設的函式(一)

2021-09-02 07:19:55 字數 2704 閱讀 6410

c++的類中有6個預設的函式,它們分別是:

建構函式

析構函式

拷貝建構函式

賦值運算子的過載函式

取位址操作符的過載函式

const修飾的取位址操作符的過載函式 

這6個預設的函式有兩個特點:共有的內聯的

今天我們先來看看前三個預設的函式:建構函式、析構函式和拷貝建構函式

我們都知道,c++中乙個物件的生成分兩個步驟:

開闢記憶體

對記憶體空間進行初始化

建構函式的作用就是初始化物件的記憶體空間,所以呼叫建構函式是生成物件的一環,需要生成物件必須呼叫建構函式,之後再呼叫建構函式是通過該物件呼叫的。

如果類定義中沒有給出建構函式,則c++編譯器自動產生乙個預設的建構函式,只要我們自己定義了乙個建構函式,系統就不會自動生成預設的建構函式。建構函式的函式名與類名相同,(本文**均以商品cgoods為例進行闡述)

系統提供的預設的建構函式形式:

類名()

{}

通常預設的建構函式並不能滿足我們的需求,因此就需要,我們自己寫乙個建構函式進行實現,這就是建構函式的過載下面讓我們來看看,生成物件時若有系統提供的預設建構函式並且還有其他自己寫的多個建構函式時,分別在何種情況下呼叫某一種建構函式呢,我們結合下面的**分析一下;

#include#pragma warning(disable:4996);

class cgoods

cgoods(char* name,float price)//帶有兩個引數的建構函式

cgoods(int amount)//帶有乙個整形引數的建構函式

cgoods()//不帶引數的建構函式

void destroyed()

~cgoods()

/*char* getname();

void getname(char* name);

float getprice();

int getamount();

void sell();

void buy();*/

private:

char* mname;

float mprice;

int mamount;

};int main()

執行結果: 

在上述**中,一共建立了4個cgoods類的物件,在類中一共有4的建構函式,通過上述**,我們可以清楚地理解呼叫建構函式時,會優先選擇函式形參列表與定義物件時的實參列表相匹配的那個建構函式進行呼叫,通常用cgoods good4方式來呼叫系統預設的建構函式。注意:建構函式是不能手動呼叫的

系統預設的析構函式形式:

~類名()

{}

與物件的生成相對應,物件的銷毀同樣包含兩個部分:

釋放其他資源(物件的空間是在棧上開闢的,這裡的其他資源是指棧以外的資源,如new()開闢的堆資源等)

釋放空間 

析構函式的作用就是:釋放物件所佔的其他資源

我們可以用呼叫如下析構函式來銷毀上述物件的其他資源

~cgoods()

所以從第乙個**塊中執行結果中,我們會發現,呼叫的建構函式的個數與析構函式的個數相等,並且,構造與析構的順序是:先構造的後析構,後構造的先析構與建構函式的兩個特點:1.可過載;2.不可手動呼叫   相比,析構函式的特點是:1.不可過載;2.可以手動呼叫預設的拷貝建構函式的作用:用乙個已經存在的物件來生成乙個相同型別的新物件

即建立物件時使用同類物件來進行初始化,這時所用的建構函式稱為拷貝建構函式,拷貝建構函式是特殊的建構函式

例如:

int main()

系統預設的拷貝建構函式是淺拷貝的,但如果類中含有指標型別的變數(如下圖所示),須考慮用深拷貝來實現

所以我們需要自己寫乙個拷貝建構函式來實現深拷貝:

cgoods(const cgoods& rhs)

上述拷貝建構函式的形參為什麼要用&呢?能否用*呢?

1.這是為了防止遞迴構造形參物件導致棧溢位。引用只是給實參物件起的別名,若不用&則會不斷地遞迴去生成新形參物件,最後導致棧溢位,而要做的正事還沒做。

2.不能用*,若寫成 cgoods(const cgoods* rhs),就會變成乙個建構函式而不是拷貝建構函式,cgoods*傳的是已存在物件的位址

今天只介紹了前三種預設函式,其餘的未完待續......

C 中類的6個預設函式

類的6個預設的成員函式包括 建構函式 析構函式 拷貝建構函式 賦值運算子過載函式 取位址操作符過載 const修飾的取位址操作符過載。以下詳細介紹前四個函式。一 建構函式 cgoods 例項化乙個物件 1 分配物件記憶體空間 2 呼叫物件的建構函式 初始化 定義的同時賦值。賦值 定義後,再賦值。建構...

C 類的6個預設函式

在c 中預設產生6個類成員函式,即預設函式,它們分別是 預設建構函式 預設拷貝建構函式 預設析構函式 預設賦值運算子 預設取址運算子 預設取位址運算子const 很多人以為只有前4個預設函式,事實上有6個。驗證如下 可見,我們在沒有寫函式功能的情況下,進行構造,析構,拷貝等等操作都是可以實現的,這就...

C 類的6個預設函式

在c 中預設產生6個類成員函式,即預設函式,它們分別是 預設建構函式 預設拷貝建構函式 預設析構函式 預設賦值運算子 預設取址運算子 預設取位址運算子const 很多人以為只有前4個預設函式,事實上有6個。驗證如下 include using namespace std class a int ma...