C 之建構函式 一

2021-07-25 08:33:27 字數 2563 閱讀 2912

建構函式是類的乙個特殊的成員函式,它與類名同名。當定義該類的物件時,建構函式將被系統自動呼叫用以實現對該物件的初始化。建構函式不能有返回值,因而不能指定包括void在內的任何返回值型別。建構函式的定義域其他函式的定義一樣,可以放在類內或類外。

與建構函式相對應的是析構函式,當撤銷類物件時,析構函式**儲存空間,並做一些善後工作。建構函式與析構函式都屬於類,可以由使用者提供,也可以由系統自動生成。

一、 建構函式是幹什麼的

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)

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

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

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; }

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

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

string.h>

class person

}       

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

person(person & p)   

~person( )

private :

char * m_pname;

};void main( )

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

person(person & chs);

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

C 學習筆記之建構函式(一)預設建構函式

定義 在未提供顯式的初始值時,用來建立物件的建構函式。舉例 class testclass private int m a int m b public testclass 預設建構函式1 testclass int a,int b 建構函式 testclass int a 10,int b 5 預...

C 建構函式之預設建構函式

參考部落格 以下內容是在上述博主的部落格中提煉出來的 一 預設建構函式的含義是啥 主要就是 預設建構函式在呼叫的時候不需要顯示傳入實參的建構函式 二 預設的建構函式的分類 1 無參建構函式 就是沒有引數的建構函式 class sample 2 帶有形參,並且帶有預設值的建構函式 class samp...

C 建構函式之委託建構函式

委託建構函式 c 11新標準擴充套件了建構函式初始值的功能,使得我們可以定義所謂的委託建構函式。乙個委託建構函式使用它所屬類的其他建構函式執行它自己的初始化過程,或者說它把它自己的一些 或者全部 職責委託給了其他建構函式。和其他建構函式一樣,乙個委託建構函式也有乙個成員初始值的列表和乙個函式體。在委...