C 中繼承與動態記憶體分配的詳解

2022-10-04 00:45:12 字數 1127 閱讀 5074

c++ 中繼承與動態記憶體分配的詳解

繼承是怎樣與動態記憶體分配進行互動的呢?例如,如果基類使用動態記憶體分配,並重新定義賦值和複製建構函式,這將怎樣影響派生類的實現呢?這個問題的答案取決於派生類的屬性。如果派生類也使用動態記憶體分配,那麼就需要學習幾個新的小技巧。下面來看看這兩種情況:

一.派生類不使用new

派生類是否需要為顯示定義析構函式,複製建構函式和賦值操作符呢?

不需要!

首先,來看是否需要析構函式,如果沒有定義析構函式,編譯器將定義乙個不執行任何操作的預設建構函式。實際上,派生類的預設建構函式總是要執行一些操作:執行自身的**後呼叫基類析構函式。因為我們假設派生類的成員不需要執行任何特殊操作,所以預設析構函式是合適的。

再看複製建構函式。預設複製建構函式執行成員複製,這對於動態記憶體分配來說是不合適的,但對於新的派生類的成員來說是合適的。因此只需要考慮繼承的基類的物件。要知道,成員複製將根據資料型別採用相應的複製方式,因此複製類成員或繼承的類元件時,則是使用該類的複製建構函式完成的。所以派生類的預設複製建構函式使用基類的顯示複製建構函式來複製派生類物件的基類成員部程式設計客棧分。因此,預設複製建構函式對於新的派生類而言是合適的。

對於賦值來說,同樣道理。

二.派生類使用new。

如果派生類需要new操作,那麼需要顯示定義析構函式,複製建構函式和賦值操作符。

派生類析構函式自動呼叫基類的建構函式,故其自身的職責是對派生類構造函www.cppcns.com數執行工作的進行清理。

接下來看複製建構函式:

derivedclass::derivedclass(const程式設計客棧 derivedclass& de):baseclass(de)

看賦值操作符:

derivedclass::operator=(const derivedclass& de)

總之,當基類和派生類都採用動態記憶體分配時,派生類的析程式設計客棧構函式,複製建構函式以及賦值操作符都必須使用想用的基類方法來處理基類元素。這種要求是通過三種不同的方式來滿足的。

1.對於析構函式,這是自動完成的;

2.對於建構函式,這是通過在初始化成員列表中呼叫基類的複製建構函式來完成的;如果不是這樣做,將自動呼叫基類的預設建構函式。

3.對於複製操作符,這是通過使用作用域解析操作符顯示的呼叫基類的賦值操作符來完成了。

繼承與動態記憶體分配

在基類或派生類中含有指標時,要考慮記憶體分配情況 new與delete 還要考慮在進行物件間賦值時指標隱藏的問題 使用預設複製建構函式在析構時會造成原物件中的指標指向的記憶體空間被釋放,為淺複製 因此需要 1.過載運算子 實現深度複製 2.在建構函式中使用new進行動態記憶體分配,在析構函式中使用d...

動態記憶體分配(詳解)

動態記憶體分配 1.堆記憶體分配 c c 定義了4個記憶體區間 區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆 heap 區或自由儲存區 free store 堆的概念 通常定義變數 或物件 編譯器在編譯時都可以根據該變數 或物件 的型別知道所需記憶體空間的大小,從而系統在適當的時...

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...