物件的操作 動態建立 釋放 賦值 複製

2021-08-21 22:08:47 字數 1953 閱讀 4539

一般方法定義的物件是靜態的,在程式執行中,物件所占用的空間不能隨時釋放的。c++/c語言中,可以用new運算子動態建立乙個物件,用delete運算子撤銷物件。

new box;
系統開闢了一段記憶體空間,存放乙個box類物件,同時呼叫該類的建構函式,完成物件初始化。用new運算子動態分配記憶體後,將返回乙個指向新物件的指標的值,即所分配的記憶體空間的起始位址。需要定義乙個指向類的物件的指標存放該位址。

box *pt;         //定義乙個box類物件的指標變數pt。

pt = new box; //在pt中存放新建物件的起始位址。

用new建立的動態物件一般是不用物件名的,而是通過指標訪問,它主要用於動態的資料結構,如鍊表。在不需要new建立的物件的時候,可以用delete運算子予以釋放。

delete pt;      //釋放pt指向的記憶體空間。
如果指標變數指向了不同的動態物件,應注意指標變數的當前指向,以免誤刪了物件。

在執行delete運算子時,釋放了記憶體空間,自動呼叫析構函式,完成善後清理工作。

兩個同類的物件,可以相互賦值,或者可以將乙個物件的值賦給另乙個同類的物件。賦的值是物件中所有資料成員的值。

基本格式為:

物件1 = 物件2;
注意:物件的賦值只對其中的資料成員賦值,而不對成員函式賦值。資料成員是佔儲存空間的,不同物件的資料成員占有不同的儲存空間,賦值過程將乙個物件的資料成員複製給另乙個資料成員的儲存空間。但是不同的成員函式是同乙個函式**段,不能對自己賦值。

用乙個已有的物件快速的複製出多個完全相同的物件。格式如下:

類名 物件2(物件1); 

//或者

類名 物件1 = 物件2;

括號中的引數不是一般變數,而是物件。在建立乙個新物件時呼叫乙個特殊的建構函式---複製建構函式。形式如下:

//copy constructor definition

box::box(const box &b)

一般約定加const宣告,防止使形參值不能被改變,以免呼叫時不慎使物件值被修改。

下面區分幾個概念:

物件的複製是建立在已經存在的物件基礎之上,因此要先有物件,才能賦值。物件的賦值是從無到有的建立乙個新的物件,擁有一致的結構和成員。

5.普通建構函式與複製建構函式

(1)形式上

類名(形參列表);    //普通建構函式的宣告,box(int,int,int)

類名(類名 & 物件名) // 複製建構函式的宣告,如box(box &b)

(2)普通建構函式在建立物件時被呼叫。複製建構函式在用已有物件複製乙個新物件時被呼叫,

a.程式中需要新建立乙個物件,並用另乙個同類的物件對它初始化。

b.當函式的引數為類的物件時。在呼叫函式時需要將實參物件完整的傳遞給形參,也就是需要建立乙個實參的copy,系統是通過呼叫複製建構函式來實現的,這樣才能保證形參與實參具有完全相同的資料和結構。

void fun(box b)    //形參是類的物件

{}

int main()

c.函式返回值是類的物件。此時需要將函式中的物件複製乙個臨時物件並傳遞給函式的呼叫處。

box f()                  //f的型別為box類型別

int main()

box1是在函式f中定義的,在呼叫f函式結束時,box1的生命週期結束。因此並不是box1帶回main函式,而是函式f結束前執行return語句,呼叫了box類中的複製建構函式,將box1複製給box2.

注意的是,以上都是由編譯系統自動實現的,不必自己去呼叫。

物件的動態建立和釋放

new 動態地分配記憶體 delet 釋放記憶體 用new建立的物件只能通過指標訪問,建立物件時執行建構函式,有時候會出現記憶體不足,會出現異常。不再需要由new建立的物件時,用delete運算子釋放。否則會造成記憶體洩漏的情況。在釋放記憶體空間之前,自動呼叫析構函式,完成有關善後清理的工作。也就是...

C 物件的動態建立和釋放

使用類名定義的物件 請檢視 c 類的宣告和物件的定義 都是靜態的,在程式執行過程中,物件所佔的空間是不能隨時釋放的。但有時人們希望在需要用到物件時才建立物件,在不需要用該物件時就撤銷它,釋放它所佔的記憶體空間以供別的資料使用。這樣可提高記憶體空間的利用率。在c 中,可以使用new運算子動態地分配記憶...

c 物件的動態建立與釋放

1 new和 delete 基本語法 1 在軟體開發過程中,常常需要動態地分配和撤銷記憶體空間,例如對動態鍊錶中結點的插入與刪除。在c 語言中是利用庫函式 malloc 和free 來分配和撤銷記憶體空間的。c 提供了簡便而功能較強的運算子 new和 delete 來取代malloc 和free 函...