目錄 在前面的內容中講解 拷貝構造函式呼叫的時機 時說明了初始化和賦值的區別:在定義的同時進行賦值叫做初始化
,定義完成以後再賦值(不管在定義的時候有沒有賦值)就叫做賦值
。初始化只能有一次,賦值可以有多次。
當以拷貝的方式初始化乙個物件時,會呼叫拷貝建構函式;當給乙個物件賦值時,會呼叫過載過的賦值運算子。即使沒有顯式的過載賦值運算子,編譯器也會以預設地方式過載它。預設過載的賦值運算子功能很簡單,就是將原有物件的所有成員變數一一賦值給新物件,這和預設拷貝建構函式的類似。看下面的**:
#include #includeusing namespace std;
class people
;people::people(string name, int* ptr)
people::people(const people &peo)
people::~people()
void people::display()
void people::setage(int age)
int main()
/*輸出:
xiao ming is age 10
xiao ming is age 10
xiao ming is age 15
xiao ming is age 15 //修改 people1 age 之後 people2 age 也被修改了,而且呼叫析構函式的時候回重複釋放記憶體導致崩潰。
*/
看上面的例子修改 people1 age 之後 people2 age 也被修改了
,這是因為mp_age
是乙個指標,裡面存放的是指向儲存 age 內容的位址,不過載賦值運算子時,使用預設的賦值運算子時這是把 people1的 mp_age指標裡存放的位址賦值給了people2的mp_age指標導致兩個指標指向了同一塊記憶體空間,這時候預設賦值運算子的不足就滿足不了實際的需求了,需要過載賦值運算子。
對於簡單的類,預設的賦值運算子一般就夠用了,我們也沒有必要再顯式地過載它。但是當類持有其它資源時,例如動態分配的記憶體、開啟的檔案、指向其他資料的指標、網路連線等,預設的賦值運算子就不能處理了,我們必須顯式地過載它,這樣才能將原有物件的所有資料都賦值給新物件。下面我們過載賦值運算子來實現預設賦值運算子不能實現的功能。
#include #includeusing namespace std;
class people
;people::people(string name, int* ptr)
people::people(const people &peo)
people::~people()
// 重灌賦值運算子
people& people::operator=(const people &peo)
else
}return *this;
}void people::display()
void people::setage(int age)
int main()
/*輸出:
xiao ming is age 10
xiao ming is age 10
xiao ming is age 15
xiao ming is age 10 //修改 people1 age 之後 people2 age 沒有被修改,
*/
關於上面**的幾點說明:
operator=() 的返回值型別為people &
,這樣不但能夠避免在返回資料時呼叫拷貝建構函式,還能夠達到連續賦值的目的,這樣的語句就是連續賦值:people1 = people2 = people3;
if( this != &arr)`語句的作用是「判斷是否是給同乙個物件賦值」:如果是,那就什麼也不做;如果不是,那就將原有物件的所有成員變數一一賦值給新物件,並為新物件重新分配記憶體。
賦值運算子過載函式除了能有物件引用這樣的引數之外,也能有其它引數。但是其它引數必須給出預設值,例如people& operator=(const people &peo, int a = 100);
operator=() 的形參型別為const people &
,這樣不但能夠避免在傳參時呼叫拷貝建構函式,還能夠同時接收 const 型別和非 const 型別的實參.
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 普通類例項之間賦值可能沒問題,但當類成員變數中有指標引用的動態記憶體時,複製後只是簡單地將指標值複製,而沒有將其指向的動態記憶體也拷貝乙份,這樣即多個類例項內的指標指向同一動態記憶體,當類例項析構時,會導致這塊動態記...