初識C 3 類的六個預設成員函式

2021-10-22 05:38:08 字數 3523 閱讀 4498

首先如果乙個類中什麼成員都沒有,簡稱為空類。空類中並不是什麼都沒有,任何乙個類在我們不寫的情況下,都會自動生成下面6個預設成員函式。分別為:

1.建構函式

2.析構函式

3.拷貝建構函式

4.賦值操作符過載

5.取位址操作符過載

6.const取位址操作符過載

建構函式用來給物件初始化成員的值,系統會自動呼叫,如果自己沒寫建構函式,則調動系統自動生成的建構函式。

class

date

// 2.帶參建構函式

date (

int year,

int month ,

int day )

private

:int _year ;

int _month ;

int _day ;};

void

main()

特點:

1.建構函式是乙個特殊的成員函式,名字與類名相同,無返回值。

2.建構函式的雖然名稱叫構造,但是需要注意的是建構函式的主要任務並不是開空間建立物件,而是初始化物件。

3.建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次。

4.建構函式可以過載。

注意:無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。

class

date

date (

int year =

1900

,int month =1,

int day =1)

private

:int _year ;

int _month ;

int _day ;};

void

test()

以上測試函式不能通過編譯,date d1; 語句存在二義性。

建構函式補充知識

與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是由編譯器完成的。而物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作(並不是釋放空間)。

特點:1. 析構函式名是在類名前加上字元 ~。

2. 無引數無返回值。

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

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

typedef

int datatype;

class

seqlist

~seqlist()

}private

:int

* _pdata ;

size_t _size;

size_t _capacity;

};

問題:既然編譯器能夠給我們生成建構函式和析構函式,那麼我們何必多此一舉自己實現這兩個函式呢?

在涉及指標傳參時如果不自己編寫建構函式和析構函式,會發生一些錯誤,這裡有乙個別人寫的例子可以幫助理解:

為什麼要自己寫建構函式和析構函式

用已存在的類型別物件建立新物件時由編譯器自動呼叫。

特點:1. 拷貝建構函式是建構函式的乙個過載形式。

2. 拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。

3. 若未顯示定義,系統生成預設的拷貝建構函式。 預設的拷貝建構函式物件按記憶體儲存按位元組序完成拷貝,這種拷貝我們叫做淺拷貝,或者值拷貝。

class

string

string

(const string & s)

string&

operator=(

const string& s)

cout <<

"=運算子過載"

函式名字為:關鍵字operator後面接需要過載的運算子符號

函式原型:返回值型別 operator操作符(引數列表)

注意:1.不能通過連線其他符號來建立新的操作符:比如operator@

2.過載操作符必須有乙個類型別或者列舉型別的運算元

3.用於內建型別的操作符,其含義不能改變,例如:內建的整型+,不 能改變其含義作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的

4.操作符有乙個預設的形參this,限定為第乙個形參

5. .* 、:: 、sizeof 、?: 、. 注意以上5個運算子不能過載。

class

date

date (

const date& d)

date&

operator=(

const date& d)

//這裡對兩個date 物件之間賦值操作做了過載

return

*this;}

private

:int _year ;

int _month ;

int _day ;

};

編寫賦值運算子過載時注意:

1. 引數型別

2. 返回值 *this

3. 檢測是否自己給自己賦值

4. 乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝。

class

string

~string()

private

:char

* _str;};

intmain()

編譯器生成的預設賦值過載函式可以完成位元組序的值拷貝(淺拷貝),但是上面程式如不自己實現 =過載 ,在執行時會報錯。

因為編譯器的賦值過載函式只是將s2的"world"的位址拷貝下來給了s1;s2析構時會將這塊空間釋放,此時s1 s2共同使用了一塊空間,s1「world」所在的空間已經被釋放,當析構s1時就會重複free這塊空間,導致出錯;所以在涉及到指標的操作時,以上四種函式需要自己實現,不然可能會出現各種錯誤。

這兩個運算子一般不用重新定義,使用編譯器生成的預設取位址的過載即可,只有特殊情況,才需要過載,比如想讓別人獲取到指定的內容。這裡先見一下大概長啥樣就行了。

class

date

const date*

operator&(

)const

//const取位址操作符過載

private

:int _year ;

// 年

int _month ;

// 月

int _day ;

// 日

};

類的六個預設成員函式

類的六個預設成員函式 1.建構函式 2.拷貝建構函式 3.析構函式 4.賦值操作符過載 5.取位址操作符過載 6.const修飾的取位址操作符過載 建構函式 是乙個特殊的成員函式,名字與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期內隻且只呼叫一次,以保證每個資料成員都有乙個合適的初...

類的六個預設成員函式

如果乙個類中什麼成員都沒有,則就是空類。但是空類中什麼都沒有嗎?其實並不是這樣的,任何類在我們不寫的情況下,都會自動生成下面六個預設成員函式。class date 無參的建構函式 date int year,int month,int day 有參的建構函式 這兩個建構函式構成了函式的過載,因為它們...

C 之類的六個預設成員函式

在c 類中同樣的預設成員函式一共有六個,即使使用者不定義,編譯器也可以給出。分別為 1 建構函式 2 析構函式 3 拷貝建構函式 4 賦值運算 5 取位址運算 6 const取位址運算 我們一下述程式為例驗證下上面說法 include using namespace std class comple...