C 類的使用 關於建構函式的定義與注意事項

2021-10-23 00:26:05 字數 3310 閱讀 1076

建構函式是類必備的成員函式,它進行著類的資料成員的初始化工作。如果我們沒有定義建構函式,那宣告類的物件時會呼叫系統自動生成的預設建構函式,這個函式什麼也不做,通常這樣做是有風險的,因為在宣告物件時如果不對物件內的資料成員初始化的話,它們的值將是不確定的,這將導致不可預料的災難。所以為了保險起見,任何時候都要定義乙個預設的建構函式對物件資料成員進行初始化。我們定義乙個儲存資料的類list進行講解:

class

list

;//返回長度

void

display()

;//列印陣列

private

:int _length;

//list物件中data陣列的長度

int* data;

//指向陣列的指標};

list::

list()

類中的各項資料成員和函式見注釋,這個類中我們只定義乙個預設建構函式,它構造乙個空的list。通常如果資料成員較少的話我們採用成員初始化列表(member initialization list)的方式在建構函式宣告或定義的時候初始化,。

//list::list():_length(0),data(null) {}; //宣告的時候

list()

:_length(0

),data

(nullptr);

//定義的時候

但我們經常會需要對物件進行特定的初始化,如構造具有num個值為value的物件,而不使用預設建構函式。這時我們需要對建構函式進行過載(c/c++語言支援),我們定義乙個接受兩個引數的建構函式,乙個引數num指明陣列大小,乙個引數value指明值。

class

list

list::

list

(int num,

int value)

這裡我們將第二個引數設為具有預設值的引數(將形參直接賦值),這樣我們可以使用只傳如乙個引數的建構函式,這時第二個引數預設為0,它所構造的是乙個儲存num個值為0的物件。效果見下面**

int

main()

輸出:

元素為:00

00元素為:55

55

除此之外我們也可以使用另乙個物件構造,將物件構造為資料成員與另乙個物件一樣,比如我們經常見到這樣的使用形式:

vector<

int> vec1 =

;vector<

int>

vec2

(vec1)

;vector<

int> vec3;

vec3 = vec1;

我們先定義乙個vec1,然後使用vec1構造vec2和vec3。這三個物件各自的資料成員的值完全相同。我們自己定義的類list也可以這樣使用,看下面**

int

main()

輸出:

元素為:55

55元素為:55

55

此時我們並未對list定義任何新的建構函式,這時s2和s3使用的是系統自動生成的copy constructor和copy assignment operator,這非常方便,我們不用編寫額外的**就可以使用這種構造方式,但有時這樣使用是有風險的,我們看下面**:

int

main()

我們可以嘗試編譯這段**,會發現程式編譯成功並不會提示警告,但執行後會發現程式錯誤,錯在哪了呢?我們去看一下list內的資料成員,發現data是乙個指向陣列的指標,而我們在構造完s2和s3後,s2._length=s3._length=s._length,s2.data=s3.data=s.data,注意!這裡的data為指標。也就是說此時s2和s3內的data指向s中的data指向的陣列。而之後我們將s刪除,s中data指向的陣列被刪除,這時s2和s3內的data指向的陣列不存在,那我們再對s2和s3操作便出現錯誤!所以當類中存在指標時我們不可以使用系統自動生成的copy constructor和copy assignment operator,這時候我們需要自己定義copy constructor和copy assignment operator。見下面**:

class

list

;list

(int num,

int value =0)

;list

(const list& l)

;//copy constructor

~list()

;int

length()

;void

display()

; list&

operator=(

const list& l)

;//copy assignment operator

private

:int _length;

int* data;};

list::

list

(const list & l)

list & list::

operator=(

const list & l)

由此可知當定義包含指標資料成員的類時,我們也需要為它定義copy constructor和copy assignment operator。當對其中指標進行賦值時,我們新開闢一塊記憶體。另外還有乙個需注意的地方,我們看下面**:

int

main()

請問此時s呼叫的是constructor還是assignment operator呢,答案是呼叫constructor,大家可以執行一下,會發現輸出和呼叫list s(3)相同

元素為:00

0

綜上,建構函式主要有:

預設建構函式帶引數的建構函式copy constructor和copy assignment operator

需要注意:

C 矩形類 建構函式的定義與使用

定義乙個物件時,c 會自動呼叫建構函式建立該物件並進行初始化,當乙個物件的生 命期結束時,c 也會自動呼叫乙個特殊的成員的數進行善後工作,這個特殊的成員雨數即為析構的數 destructor 析構函式名與類名相同,但在前面加上字元 如coods 析構函式無函式返回型別在這方面與建構函式是一樣的。但析...

7 1 類的定義與建構函式

目錄7.1.2 建構函式 default 的含義 建構函式的初始值列表 在類的外部定義的建構函式 7.1.3 完整 1 弄懂下面的 includeusing namespace std struct sale data sale data combine sale data double g pri...

c 學習 關於類的建構函式

之前使用的是acquire函式進行stock類的賦值,現在利用類自己的建構函式 首先在標頭檔案中宣告這個建構函式 stock stock const string co.long n,double cr 之後在函式定義和宣告的cpp中定義這個建構函式如下 stock stock const stri...