c 建構函式,拷貝建構函式,析構函式小結

2021-07-23 20:19:22 字數 2646 閱讀 5056

(1)建構函式

乙個特殊的類成員函式,函式名與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期中隻且只呼叫一次,以保證每個資料成員都有乙個合適的初始值。有初始化階段與普通計算階段。

class date

date(int year, int month, int day)

: _year(year)

, _month(month)

, _day(day)

{}private:

int _year;

int _month;

int _day;

};

如以上類中,為顯式定義的建構函式date(),兩個成員函式可構成過載,都為類的建構函式,具體呼叫看程式設計者在例項化時傳參情況,若未顯式定義,編譯器會自動合成預設建構函式。

建構函式的特性:

(1):函式名與類名相同;

(2):沒有返回值(真的沒有嗎?)。

通過觀察反彙編**發現,是會有返回值的。

如以上類。

定義乙個普通的函式funtest():

int funtest()

觀察return temp;語句的反彙編**時,可以看到

mov         eax,dword ptr [temp];

而當進入類建構函式的反彙編**時,可以看到

mov         eax,dword ptr [this];

異曲同工,說明建構函式可能會隱式返回乙個值,此值為始終指向此類的指標this。

(3):有初始化列表(可以不用)(且只有建構函式才可以有)

初始化列表見詞知意,用來初始化,以乙個冒號開始,接著是乙個以逗號分隔的資料成員列表,每個資料成員後邊跟乙個放在圓括號中的初始化式。每個成員只能初始化一次。

初始化順序:

<1>每個成員在初始化列表中只能出現一次。

<2>初始化列表僅用於初始化資料成員,並不指定這些資料成員的初始化順序,資料成員在類中定義順序就是在引數列表中的初始化順序。

<3>盡量避免使用成員初始化成員,成員的初始化順序最好和成員的定義順序保持一致。

附:類中包含以下成員必須要放在初始化列表中初始化:

1、引用資料成員

2、const資料成員

3、類型別成員(該類沒有預設的建構函式)

(4):新物件被建立,由編譯器自動呼叫,且在物件的生命期內僅呼叫一次。

(5):建構函式可以過載,實參決定了呼叫那個建構函式。

如以上類,date()

date(int year, int month, int day)兩個函式過載,通過判斷實參傳遞判斷呼叫哪個建構函式。

(6):如果沒有顯式定義時,編譯器會提供乙個預設的建構函式。((實際操作中,編譯器會判斷需不需要進行生成建構函式,如下:)

class date

; int main()

如上**,在date date處打斷點除錯時會發現直接跳到下一句執行,檢視反彙編時會發現沒有生成建構函式。

一般,類中沒有定義類成員,編譯器會進行優化,不給出缺省建構函式。

class time

private:

int _hours;

int _minute;

int _second;

};class date

private:

int _hours;

int _minute;

int _second;

};class date

3、傳值方式作為函式返回值

date funtest()

特性:(1):

它是建構函式的過載。

(2):它的引數必須用同型別的引用傳遞。

若直接傳值,也就是說

date(const date date)

再次形成物件例項化物件的情況,不斷遞迴。

(3):如果沒有顯式定義,系統會自動合成乙個預設的拷貝建構函式。會依次拷貝類的資料成員完成初始化。

(3)析構函式

析構函式:與建構函式功能相反,在物件被銷毀時,由編譯器自動呼叫,完成類的一些資源清理和汕尾工作

class carray

~carray()

_size = 0;

_capacity = 0;

}private:

int* _pdata;

size_t _size;

size_t _capacity;

};

以上為大概工作原理

特性

a、析構函式在類名(即建構函式名)加上字元~。

b、析構函式無引數無返回值。

c、乙個類有且只有乙個析構函式。若未顯示定義,系統會自動生成預設的析構函式。

d、物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。

e、注意析構函式體內並不是刪除物件,而是做一些清理工作。

C 建構函式 析構函式 拷貝建構函式

建構函式 析構函式 拷貝建構函式 如果類成員變數有初始值,用這些初始值初始化成員變數 如果類成員變數沒有初始值,則預設初始化該成員變數 class student int main 使用注意事項 語法 這個預設建構函式之所以對student有效,是因為我們為內建型別的資料成員提供了初始值 如果你的編...

C 建構函式 拷貝構造 析構函式

建構函式 constructor 在例項物件時,系統自動呼叫,用來初始化物件的資料成員 建構函式宣告語法 類名 引數列表 建構函式注意點 include include using namespace std class computer 上面的建構函式也可以寫成引數列表初始化的形式 compute...

建構函式 拷貝建構函式 析構函式

1.如果定義了兩個預設建構函式,vc只回給出warning.2.如果有預設引數的預設構造,如果你給了第乙個預設的話 所有傳遞引數都要有預設植 否則報錯.不過如果是第乙個引數的預設值沒有給出的話,編譯器卻看不出問題,但是沒有 試過這種情況建構函式能不能正常工作.建構函式 用來初始化物件的資料成員,與類...