C 建構函式

2021-08-28 23:52:46 字數 2782 閱讀 3199

一、 建構函式是幹什麼的

class counter

private:

// 資料成員

int m_value;

}該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式->由建構函式完成成員的初始化工作

eg:    counter c1;

編譯系統為物件c1的每個資料成員(m_value)分配記憶體空間,並呼叫建構函式counter( )自動地初始化物件c1的m_value值設定為0

故:建構函式的作用:初始化物件的資料成員。

二、 建構函式的種類

class complex 

//    一般建構函式(也稱過載建構函式)

// 一般建構函式可以有各種引數形式,乙個類可以有多個一般建構函式,前提是引數的個數或者型別不同(基於c++的過載函式原理)

// 例如:你還可以寫乙個 complex( int num)的建構函式出來

// 建立物件時根據傳入的引數不同呼叫不同的建構函式

complex(double real, double imag)

//    複製建構函式(也稱為拷貝建構函式)

//    複製構造函式引數為類物件本身的引用,用於根據乙個已存在的物件複製出乙個新的該類的物件,一般在函式中會將已存在物件的資料成員的值複製乙份到新建立的物件中

//    若沒有顯示的寫複製建構函式,則系統會預設建立乙個複製建構函式,但當類中有指標成員時,由系統預設建立該複製建構函式會存在風險,具體原因請查詢 有關 「淺拷貝」 、「深拷貝」的文章論述

complex(const complex & c)

// 型別轉換建構函式,根據乙個指定的型別的物件建立乙個本類的物件,

//需要注意的一點是,這個其實就是一般的建構函式,但是對於出現這種單引數的建構函式,c++會預設將引數對應的型別轉換為該類型別,有時候這種隱私的轉換是我們所不想要的,所以需要使用explicit來限制這種轉換。

// 例如:下面將根據乙個double型別的物件建立了乙個complex物件

complex(double r)

// 等號運算子過載(也叫賦值建構函式)

// 注意,這個類似複製建構函式,將=右邊的本類物件的值複製給等號左邊的物件,它不屬於建構函式,等號左右兩邊的物件必須已經被建立

// 若沒有顯示的寫=運算子過載,則系統也會建立乙個預設的=運算子過載,只做一些基本的拷貝工作

complex &operator=( const complex &rhs )

// 複製等號右邊的成員到左邊的物件中

this->m_real = rhs.m_real;

this->m_imag = rhs.m_imag;                

// 把等號左邊的物件再次傳出

// 目的是為了支援連等 eg:    a=b=c 系統首先執行 b=c

// 然後執行 a= ( b=c的返回值,這裡應該是複製c值後的b物件)    

return *this;}};

下面使用上面定義的類物件來說明各個建構函式的用法:

int main()

三、思考與測驗

1. 仔細觀察複製建構函式

complex(const complex & c)

為什麼函式中可以直接訪問物件c的私有成員?

答:(網上)因為拷貝建構函式是放在本身這個類裡的,而類中的函式可以訪問這個類的物件的所有成員,當然包括私有成員了。

2. 挑戰題,了解引用與傳值的區別

complex test1(const complex& c)

complex test2(const complex c)

complex test3()

complex& test4()

void main()

答:為了便於看建構函式的呼叫效果,我將類重新改一下,新增一些輸出資訊,**如下:

下面是程式執行結果:第一次執行結果

四、附錄(淺拷貝與深拷貝)

上面提到,如果沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行「淺拷貝」,即將被拷貝物件的資料成員的 值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的位址與被拷貝物件的指標所指向的位址相同,delete該指標 時則會導致兩次重複delete而出錯。下面是示例:

【淺拷貝與深拷貝】

#include

#include

class person 

}        

// 系統建立的預設複製建構函式,只做位模式拷貝

person(person & p)    

~person( )

private :

char * m_pname;

};void main( )

// 下面自己設計複製建構函式,實現「深拷貝」,即不讓指標指向同一位址,而是重新申請一塊記憶體給新的物件的指標資料成員

person(person & chs);

// 則新建立的物件的m_pname與原物件chs的m_pname不再指向同一位址了

}

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...

C 構造器(建構函式)

定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...

C 建構函式

建構函式是一種特殊的成員函式,它主要用於為物件分配儲存空間,對資料成員進行初始化.1 建構函式的名字必須與類同名 2 建構函式沒有返回型別,它可以帶引數,也可以不帶引數 3 建構函式的主要作用是完成對類的初始化工作 4 在建立乙個類的新物件 使用new關鍵字 時,系統回自動呼叫給類的建構函式初始化新...