帶有指標成員的class一般必須手寫三個特殊函式,被稱為big three:
1、拷貝建構函式(接收自己這種型別作為引數的建構函式)
2、拷貝賦值函式 (『=』符號的過載)
3、析構函式
編譯器給出的預設拷貝建構函式和拷貝賦值函式時按照位元來複製。 對於含有指標成員的class,這樣的複製是僅僅複製了指標,而指標所指向
的記憶體還是同一塊,這種情況被稱為淺複製。不能滿足要求。因此必須手寫拷貝建構函式和拷貝賦值函式,使用動態分配記憶體的方式來複製記憶體。
在析構時,也必須根據指標把動態分配的記憶體**,所以也要手寫析構函式。
注意:拷貝賦值函式必須考慮 是否是自我賦值(self assignment),如下框**,如果是自我賦值,不需要動態分配記憶體來複製,只需返回原記憶體的指標即可。
inline
string& string::operator=(const string& str)
堆、棧與記憶體的管理
stack 是存在於某作用域的一塊記憶體空間。例如呼叫函式時,函式本身會有乙個stack用來存放它所接收的引數以及返回位址。 stack空間應該珍惜,不要用值傳遞的方式占用
太多stack空間。
heap 也稱為system heap, 是由作業系統提供的一塊global的記憶體空間。程式通過動態記憶體分配(dynamic allocate)從heap中獲取若干區塊(block)。 動態分配記憶體必須
手動**
stack與heap的生命週期: 當函式退出時,它的stack會自動釋放,其生命結束。而heap必須手動處理,否則它會一直存活,而指向它對的指標可能會丟失,這樣就會出現記憶體
洩露。動態記憶體分配:
new: 先分配記憶體,再呼叫建構函式
delete: 先呼叫析構函式,再釋放記憶體。
注意: 當new 乙個陣列時, 要用delete 來**。
把類成員改成指標 C 帶有指標成員的類處理方式
在乙個類中,如果類沒有指標成員,一切方便,因為預設合成的析構函式會自動處理所有的記憶體。但是如果乙個類帶了指標成員,那麼需要我們自己來寫乙個析構函式來管理記憶體。在 中寫到,如果乙個類需要我們自己寫析構函式,那麼這個類,也會需要我們自己寫拷貝建構函式和拷貝賦值函式。析構函式 我們這裡定義乙個類has...
C 的成員指標
c 的成員指標平時不怎麼用,雖然是冷僻的知識,但是還是值得去了解下。成員指標與一般指標的最大區別就是類內部是沒有位址的,所以成員指標要理解為 類中偏移量 還是先貼出 比較好說。class int f int const int fp float const int main 1,成員變數指標,int...
c 成員指標
今天在分析老師上課講的成員變數指標的 時,遇到了一些問題,下面是通過查詢資料進行的一些整理 1 成員指標是什麼?形象來說,成員指標就是在乙個物件內部定位某乙個成員的方式。2 如何定義乙個成員指標呢 class a b b b.x 21 b.y 31 coutp b z 無法將 int b 轉為 in...