C 賦值運算子過載

2021-06-22 10:36:48 字數 823 閱讀 1331

不少知識點

在乙個類裡面沒有定義(過載)「=」(賦值運算子)時,那麼編譯器會生成乙個預設的賦值函式。它實現物件成員間的一一賦值,實現的是乙個淺拷貝(logic copy)。

當資料成員裡面如果有指標,則編譯器預設的賦值運算子不能滿足要求,會出現記憶體洩露。

淺拷貝:通過物件之間的一一賦值,使得物件中的指標指向同一塊記憶體,使得出現了以下三個問題:(1.兩次析構同一塊記憶體,系統崩潰;2.修改乙個位址造成其他的物件成員被修改;3.當刪除乙個指標指向的內容,則另乙個物件不能正常訪問該指標指向記憶體中的內容。)

在淺拷貝中,是簡單的賦值給另乙個成員,如果裡面有指標,則導致兩個物件的指標指向相同的記憶體。由於指標在兩個物件例指向相同的變數,當乙個物件改變的時候則另乙個物件會跟著改變。另一方面,我們不知道究竟由誰在負責析構指標開闢的堆記憶體,這樣就會出現一下錯誤。調析構函式則析構兩次,破壞記憶體;不呼叫析構則沒有析構,造成記憶體洩露。

當類裡有成員是指標時,並且動態分配了記憶體,我們應該過載賦值函式,實現乙個深拷貝(physical copy)。

1.首先我們要檢查是不是自身賦值,如果是應該立即返回(不要做其他事情);

2.如果不是自身賦值,我們要釋放指標所指向的堆記憶體;

3.把右邊物件的成員拷貝並值賦給左邊物件的成員值;

4.最後,我們要返回返回本類物件的乙個常引用,避免鏈式賦值(返回const物件引用,不讓x=y=z)。

例:const vector& vector::operator=(const vector& x) 

//4}return *this;

}賦值函式(=,(),,->)必須過載為成員函式。

「+=,-=,*=,/=」都可以被過載。

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 賦值運算子過載

c 賦值運算子過載,為什麼要返回引用?查了許多資料,基本有兩種說法 一 c c 賦值運算子的本意為 返回左值的引用 左值 賦值號左面的變數而非其值 可用以下程式段測試 int a,b 3,c 2 a b c cout 對於x y x,y均為物件時 若不返回左值的引用,將會生成臨時物件。如果不處理x ...

C 過載賦值運算子

c 類建立時,會產生乙個預設的賦值運算子函式 a operator const a 普通類例項之間賦值可能沒問題,但當類成員變數中有指標引用的動態記憶體時,複製後只是簡單地將指標值複製,而沒有將其指向的動態記憶體也拷貝乙份,這樣即多個類例項內的指標指向同一動態記憶體,當類例項析構時,會導致這塊動態記...