繼承和動態記憶體分配
假設基類使用了動態記憶體分配,而且定義了析構函式、複製建構函式和賦值函式,但是在派生類中沒有使用動態記憶體分配,那麼在派生類中不需要顯示定義析構函式、複製建構函式和賦程式設計客棧值函式。
當基類和派生類採用動態記憶體分配時,派生類的析構函式、複製建構函式、賦值運算子都必須使用相應的基類方法來處理基類元素。這種要求是通過三種不同的方式來滿足的。對於析構函式。這是自動完成的,也就是說在派生類的析構函式中無需顯示呼叫基類的析構函式。對於建構函式,程式設計客棧這是通過在初始化成員列表中呼叫基類的複製建構函式來完成的,如果不這樣做,將自動呼叫基類的預設建構函式,對於賦值運算子,這是通過使用域解析運算子顯示地呼叫基類的賦值運算子來完成的。
編譯器生成的成員函式
1、 預設建構函式
預設構造哈數要麼沒有引數,要麼所有的引數都有預設值。如果沒有定義任何建構函式,編譯器將定義建構函式。另外,如果派生類建構函式的成員初始化列表中沒有顯示呼叫基類建構函式,則編譯器將使用基類的預設建構函式來構造派生類物件的基類部分。在這種情況下,如果基類沒有建構函式,將導致編譯階段錯誤。如果定義了某種建構函式,編譯器將不會定義預設建構函式。在這種情況下程式設計客棧,如果需要預設建構函式,則必須自己提供。(最好的建議就是,一旦自己定義了建構函式,那麼最好再定義乙個預設的建構函式,這樣在別的子類中呼叫也非常的方便)
提供建構函式的動機之一是確保物件總能被正確地初始化。另外,如果類包含指標成員,則必須初始化這些成員。因此,最好提供乙個顯示預設建構函式,將所有的類資料成員初始化為合理的值。
2、 複製建構函式
複製建構函式接受其所屬類的物件作為引數。在下述情況下,將使用複製建構函式
將新物件初始化為乙個同類物件
按值將物件傳遞給函式
函式按值返回物件
編譯器生成臨時物件
如果程式沒有使用複製建構函式,編譯器將提供原型,但不提供函式定義,否則,程式將定義乙個執行成員初始化的賦值建構函式。程式設計客棧也就是說,新物件的每個成員都被初始化為原始物件相應成員的值。如果成員為類物件,則初始化該成員時,將使用相應類的複製建構函式。
如果使用new初始化的成員指標通常要求執行深度複製,或者類可能包含需要修改的靜態變數。在上述情況下,需要定義自己的複製建構函式。
3、 賦值建構函式
預設的賦值運算子用於處理同類物件之間的賦值。不要將賦值與初始化混淆了。如果語句建立新的物件,則使用初始化,如果語句修改已有物件的值,則是賦值。
預設賦值為成員賦值。如果成員為類物件,則預設成員賦值將使用相應類的賦值運算子。如果需要顯示定義複製建構函式,則基於相同的原因。也需要顯示定義賦值運算子。
對於派生類而言,保護成員類似於共有成員,但對於外部而言,保護成員於私有成員類似。派生類可以直接訪問基類的保護成員,但只能通過基類的成員函式來訪問私有成員。
基類的析構函式應當是虛的。這樣,當通過指向物件的基類指標或引用來刪除派生物件時,程式www.cppcns.com將首先呼叫派生類的析構函式,然後呼叫基類的析構函式,而不僅僅是呼叫基類的析構函式
如何判斷乙個指標指向的物件的真實型別,使用c++中的執行時機制,typeid就可以實現目標
本文標題: 詳談c++何時需要定義賦值/複製建構函式
本文位址:
C 何時需要定義賦值 複製建構函式
繼承和動態記憶體分配 假設基類使用了動態記憶體分配,而且定義了析構函式 複製建構函式和賦值函式,但是在派生類中沒有使用動態記憶體分配,那麼在派生類中不需要顯示定義析構函式 複製建構函式和賦值函式。當基類和派生類採用動態記憶體分配時,派生類的析構函式 複製建構函式 賦值運算子都必須使用相應的基類方法來...
何時需要自定義複製建構函式
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!一 一般情況 先看乙個例子 例程1 include using namespace std class complex complex double r,double i friend complex operator const complex ...
C 賦值建構函式 複製建構函式
編譯器提供乙個不接受任何引數,也不執行任何操作的建構函式,稱之為預設建構函式 這是因為創造物件的時候總會呼叫預設建構函式 klunk klunk 定義 klunk lunk 宣告 使用預設建構函式 如果定義了建構函式,c 不會定義預設建構函式,如果希望建立物件時不顯示地對他進行初始化,則必須顯示的定...