c 類的預設六個成員函式

2021-09-18 01:37:16 字數 2626 閱讀 6691

c++中預設的六個成員函式分別是:建構函式,拷貝建構函式,賦值操作符過載函式,析構函式,取位址操作符過載函式,const修飾的取位址操作符過載函式

一、建構函式:

1,建構函式是乙個特殊的成員函式,名字與類同名,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有乙個合適的初始值,並且在物件的生命週期內只呼叫一次

2,並不是開空間建立物件,而是初始化物件:函式名與類同名,無返回值,物件例項化是編譯器自動呼叫對應的建構函式,建構函式可以過載。

3,無參和全預設的建構函式都稱為預設建構函式,並且預設建構函式只有乙個。無參建構函式、全預設的建構函式,我們沒寫編譯器預設生成的建構函式,都可以認為是預設成員函式。

4,編譯器自己生成預設建構函式,這裡編譯器會給自己生成的建構函式賦隨機值。

c++把型別分成內建型別(基本型別)和自定義型別。內建型別就是語法已經定義好的型別:如int/char…,自定義型別就是我們使用class,struct,union自己定義的型別,編譯器生成預設的建構函式會對自定型別成員呼叫它的預設成員函式。

二、拷貝建構函式:

class a

a(a other)

}

上面這段**會出現編譯出錯,因為傳入的引數是乙個例項。由於是傳值引數,我們把形參複製到實參會呼叫複製建構函式。如果允許複製建構函式傳值,就會在複製建構函式內呼叫複製建構函式,就會形成永無休止的遞迴呼叫從而導致棧溢位。這裡把建構函式修改為a(const a&other),也就是把傳值引數改為常引用。

三、賦值操作符過載函式

class mystring

寫乙個賦值運算子過載函式注意:

1,是否並返回值的型別宣告為該型別的引用,並且函式結束前返回例項自身的引用(this)。只有返回乙個引用,才可以允許連續賦值。否則,如果函式的返回值是void,則應用賦值運算子將不能進行連續賦值。

2,是否把傳入的引數的型別宣告為常量引用。如果傳入的引數不是引用是例項,那麼從形參到實參會呼叫一次複製建構函式。把引數宣告為引用可以避免這樣的無謂消耗,能提高**的效率。同時,我們在賦值運算子函式內不會改變傳入的例項的狀態,因此應該為傳入的引用引數加上const關鍵字。

3,是否釋放例項自身已有的記憶體。如果我們忘記在分配新記憶體之前釋放自身已有的空間,則程式將出現記憶體洩漏。

4,判斷傳入的引數和當前的例項(星號this)是不是同乙個例項。如果是同乙個,則不進行賦值操作,直接返回。如果事先不判斷就進行賦值,那麼在釋放例項自身記憶體的時候就會導致嚴重的問題:當(星號this)和傳入的引數是同乙個例項時,一旦釋放了自身的記憶體,傳入的引數的記憶體也同時被釋放了,因此再也找不到需要賦值的內容了。

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

mystring& mystring::operator=(const mystring &str)

return *this;

}

總結:這裡兩個引用:引數引用避免拷貝開銷,返回值引用支援鏈式開銷。

以上這個版本如果此記憶體不足導致new char丟擲異常,則m_pdata將是乙個空指標,這樣非常容易導致程式崩潰。因此,用乙個更好的辦法就是用乙個臨時例項和原來的例項進行交換。

mystring& mystring::operator=(const mystring &str)

return *this;

}

四、析構函式

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

(不是刪除物件,而是做一些物件刪除前的相關清理工作)

特徵:1,析構函式名是在類名前加上字元~。2,無引數無返回值。3,乙個類有且只有乙個析構函式。若未顯示定義,系統會自動生成預設的析構函式。4,物件生命週期結束時,c++編譯系統自動呼叫析構函式。

五、const修飾的取位址操作符過載函式

1、const修飾類的成員函式

將const修飾的類成員函式稱之為const成員函式,const修飾類成員函式,實際修飾該成員函式隱含的this指標,表明在該成員函式中不能對類的任何成員進行修改

在成員函式後面加const,const修飾this指標所指向的物件,也就是保證呼叫這個const成員函式的物件在函式內不會被改變。

2、const物件不能呼叫非const成員,因為const修飾的this指標,不能被修改

但非const物件可以呼叫const成員函式。const成員函式內不能呼叫其它的非const成員函式,因為其許可權被擴大。但非const成員函式內可以呼叫其它的const成員函式。

類的六個預設成員函式

類的六個預設成員函式 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...