類與動態記憶體分配總結

2021-09-27 06:18:34 字數 1670 閱讀 6987

我們最好的策略是在程式執行時,而不是編譯時確定分配的記憶體,乙個很簡單的道理是我們很難精準**所需記憶體的大小,因而很容易導致浪費。

答案是使用new和delete操作符。前文中我們使用其他方法宣告物件,析構函式是自動的,我們也無需擔心太多。但是如果在物件中用new動態宣告了變數,我們就必須在析構函式中使用delete。

在類中定義的變數前加上static就是靜態類成員。它的特點是,只會產生乙個,即使有多個不同的物件。方便在物件間達成某種聯絡和統一。乙個應用就是在物件中加入乙個計數器,可以統計物件構造和析構的次數。

靜態類成員只能在類宣告中給出宣告,但不可以初始化,因為它是單獨儲存的,不是類的一部分。靜態類成員的初始化必須在方法而不是宣告檔案中進行。假如在宣告檔案中初始化了,那麼難免會被其他檔案再次初始化,引發錯誤。

乙個特例是const靜態類成員,因為它不會被改變,所以可以在宣告中初始化。

簡單來說,就是想要各個類擁有共同的資料,但是擔心被重複初始化,因此乾脆禁止初始化,除非他是不可更改的(const)

因為使用類名 物件名;的方式初始化物件時,有可能出現二義話。具體地說,如果有兩個預設建構函式,乙個不給任何引數,那麼初始化就會變成0,另乙個給了全部的引數,但是初始值也是0.這個時候我們呼叫哪個呢?

我們新建物件並且用同類物件初始化賦值的時候,就會呼叫複製建構函式。準確的說,按值傳遞物件或者函式返回物件的時候,就會使用複製建構函式。

複製建構函式會逐個複製成員,複製的是它們的值,但這種複製屬於淺複製。儘管他們並不佔據同乙個記憶體空間。但是在類成員中有指標的情況下會產生很惡劣的影響。這是因為兩個物件的指標指向同乙個記憶體空間(指標,也就是位址完全相同)。呼叫析構函式的時候,指標指向的空間會被釋放。因此這個空間會被重複釋放。產生指標懸掛現象。意為指標指向不可知的區域,非法的記憶體位址,無法被正常使用。

顯式複製建構函式。也就是進行深度複製。

這種方法具體說,就是建立乙個建構函式,它接受他這個型別的物件的const引用。在這個建構函式中,我們手工使用new建立乙個新的空間用來存放指標等內容。

返回型別 operator操作符(const argu1的型別 &, const argu2的型別 &)

這裡返回型別根據目的不同,有的時候是void,但也會是物件的型別。根據期待的輸出而變化。

這種方法叫做成員函式法,還可以使用友元函式。

friend …(參上)

有new必要有delete,new和delete還要相容,假如是new【】那麼必須是用delete【】

因為只有乙個析構函式,所以所有的建構函式裡new的形式都要一致

我們現在有了顯式建構函式,但是這還不夠,有幾個問題值得注意,乙個是,我們必須確保,不把自己賦值給自己,以防萬一,賦值還沒開始,自己卻已經被free。另乙個問題是,要確保成員指標以前指向的記憶體有被釋放,在使用成員指標接受引數物件的任何資訊之前,都要記得把它delete掉。複製資料而不是位址(因為我們是深拷貝)同時記得返回*this,代表當前的物件。

如果是使用string類這樣的預設物件來初始化,析構函式不可以用delete來釋放,結果會不穩定。

可以返回const引用,這樣子不需要呼叫複製建構函式,提高了效率

可以返回非const引用,這樣子可以提高效率,還可以實現一些連續的操作符過載

有時需要返回物件,而不是引用,比如我們的物件只是函式中的乙個區域性變數,我們返回乙個引用,會導致函式生命週期結束的時候,這個變數被析構函式刪除。當然這個時候我們無法避免的需要使用複製建構函式了。

類的動態記憶體分配

1.靜態類成員 private char str int length static int objectnum 靜態資料成員,為所有的物件所共享 上例中的objectnum就是靜態類成員,它是所有物件所共享的,如下圖 在上例中,建立了三個物件,記憶體會給每個物件都分配資料單元用來儲存str和len...

類和動態記憶體分配

part 1 靜態類成員特點 無論建立了多少物件,程式都只建立乙個靜態類變數副本。也就是說,類的所有物件共享乙個靜態成員。靜態資料成員在類宣告中宣告,在包含類方法的檔案中初始化。初始化時使用作用域運算子來指出靜態成員所屬的類。但如果靜態成員是const整數型別或列舉型,則可以在類宣告中初始化。par...

類和動態記憶體分配

整理自 c primer plus vector force1 50,60 vector force2 10,70 vector max max max force1,force2 version1 vector max const vector v1,const vector v2 version...