類的預設函式

2022-04-28 18:57:07 字數 1668 閱讀 4322

1.c++中的空類預設產生以下四個函式:

struct也可以有建構函式、析構函式、繼承等,與class的唯一區別是預設的訪問控制許可權

2.預設建構函式

3.拷貝建構函式與賦值函式

賦值函式不是建構函式

拷貝建構函式的3種呼叫情況:

例題一

例題二

在mfc類庫中,cobject類的析構函式是虛擬的,為什麼mfc的編寫者認為虛擬的析構函式是必要的?

構造如下類:

一般情況下,建立派生類物件時會首先呼叫基類的建構函式,然後呼叫派生類的建構函式,而在釋放物件時,會先呼叫派生類的析構函式,再呼叫基類的析構函式。虛函式主要用於解決多型問題。如:

當釋放pbase時會呼叫pbase的析構函式,當把pbase的析構函式設為virtual的,就會先呼叫派生類的析構函式,再呼叫基類的析構函式。

例題三

析構函式可以為virtual型,建構函式則不能。那麼為什麼建構函式不能為虛函式呢?[美國某著名移動通訊企業2004面試題]

答案:虛函式採用一種虛呼叫的辦法。虛呼叫是一種可以在只有部分資訊的情況下工作的機制,特別允許我們呼叫乙個只知道介面而不知道其準確物件型別的函式。但是如果要建立乙個物件,則必須要知道物件的準確型別,因此建構函式不能為虛。

例題四

如果虛函式是非常有效的,我們是否可以把每個函式都宣告為虛函式?

答案:不行,這是因為虛函式是有代價的:由於每個虛函式的物件都必須維護乙個v表,因此在使用虛函式的時候都會產生乙個系統開銷。如果僅是乙個很小的類,且不想派生其他類,則無需使用虛函式。

例題五

分析:a顯然需要,如果不定義拷貝建構函式,可能存在多次刪除指標的錯誤。

b.不自定義拷貝函式會造成兩個物件的id不唯一。

c.使用預設的拷貝建構函式,string子物件和vector子物件的類都是成熟的類,都有合適的賦值操作。

d.顯然要定義。類的資料成員為物件不適合使用淺拷貝。

答案:c

例題六

分析以下**的編譯執行結果:

a:編譯錯誤    b:編譯成功,執行時程式崩潰    c程式設計成功,輸出10

分析:經嘗試,發現編譯錯誤。但是將拷貝建構函式的引數修改為引用後編譯通過。因為如果拷貝建構函式允許值傳遞,就會在拷貝建構函式中呼叫拷貝建構函式,會形成永無止境的遞迴呼叫導致棧溢位。因此在拷貝建構函式中應該使用引用傳遞。

C 類的預設函式

使用者自定義乙個類,簡單的可以看成是乙個新的型別,與c 標準裡面的資料型別使用差不多。但在物件導向程式設計中,我們知道任何乙個物件必須要通過建構函式才能建立,以及可以將乙個物件拷貝給另乙個物件,將乙個物件作為引數傳遞給乙個函式等。c 預設函式 既然是預設函式,那也就是說即便類裡面乙個成員函式沒有,這...

C 類的預設函式

每個成員函式都有乙個指標形參,它的名字是固定的,稱為this指標,this指標是隱式的。但是建構函式沒有這個隱含的this指標。編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件位址作實參傳遞給成員函式的第乙個形參this指標。編譯器會對成員函式進行處理,在物件呼叫成員函式時,物件位址作實參傳遞...

C 類預設函式

在c 中,乙個類有八個預設函式 預設建構函式 預設拷貝建構函式 預設析構函式 預設過載賦值運算子函式 預設過載取址運算子函式 預設過載取址運算子const函式 預設移動建構函式 c 11 預設過載移動賦值操作符函式 c 11 只是宣告乙個空類,不做任何事情的話,編譯器會自動為你生成乙個預設建構函式 ...