在基類或派生類中含有指標時,要考慮記憶體分配情況(new與delete),還要考慮在進行物件間賦值時指標隱藏的問題(使用預設複製建構函式在析構時會造成原物件中的指標指向的記憶體空間被釋放,為淺複製
)
因此需要:
1. 過載運算子』=『、』<<『,實現深度複製
;
2. 在建構函式中使用new進行動態記憶體分配,在析構函式中使用delete進行記憶體釋放;
3. 將析構函式宣告為虛函式
在以下**中還有乙個小技巧來簡化**,即**重用,在後續**中使用已定義過的**,例如:在c的建構函式中使用已經定義過的a的建構函式,這樣就可以只對c類新增的資料部分進行初始化。
#include
#include
#include
using
namespace
std;
class a ;
class b : public a ;
char color[col_len]; //使用陣列,不需要重新分配記憶體
public:
b( const
char *c = "blank", const
char *l = "null", int t = 0 );
b( const
char *c, const a& t );
friend ostream& operator
<<( ostream& out, const b& t );
};class c : public a ;
// a methods
a::a( const
char *l, int t )
a::a( const a& t )
a::~a()
a& a::operator=( const a& t )
delete label; //先釋放原記憶體空間
label = new
char[ strlen(t.label)+1 ];
strcpy( label, t.label );
a = t.a;
return *this;
}ostream& operator
<<( ostream& out, const a& t )
// b methods
b::b( const
char *c, const
char *l, int t ) : a( l, t )
b::b( const
char *c, const a& t ) : a(t)
ostream& operator
<<( ostream& out, const b& t )
// c methods
c::c( const
char *s, const
char *l, int t ) : a( l, t )
c::c( const
char *s, const a& t ) : a( t )
c::c( const c& t ) : a(t)
c::~c()
c& c::operator=( const c& t )
a::operator=(t); //呼叫a類的賦值函式初始化,相當於 *this = t;
delete style;
style = new
char[ strlen(t.style)+1 ];
strcpy( style, t.style );
return *this;
}ostream& operator
<<( ostream& out, const c& t )
int main()
繼承 之 動態記憶體分配
假設基類使用動態記憶體分配,並重新定義了賦值和複製建構函式 class class a 宣告中包含了建構函式使用new時需要的特殊方法 析構函式 複製建構函式和過載賦值操作符。詳情檢視 關於類隱式成員函式 當派生類使用new class class b public class a 這種情況下,必須...
談談記憶體分配與動態記憶體分配
記憶體分配 程式在記憶體中是分段儲存的。段 存放語句轉換的二進位制 程式執行時不可修改 全域性段 靜態儲存區 用來記錄全域性變數和靜態變數的儲存位置 不會隨著程式的執行而改變 棧 由編譯器自動分配釋放,存放區域性變數,塊變數,形式引數和返回值的儲存位置 隨著程式的執行其大小將不斷改變 函式呼叫時,開...
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...