C++中的賦值運算符重載函數(operator=)
MyStr& operator =(const MyStr& str)//賦值運算符 { cout << "operator =" << endl; if (this != &str) { if (name != NULL) delete name; this->id = str.id; int len = strlen(str.name); name = new char[len + 1]; strcpy_s(name, strlen(str.name) + 1, str.name); } return *this; }
Ⅱ.參數
一般地,賦值運算符重載函數的參數是函數所在類的const類型的引用(如上面例1),加const是因為:
①我們不希望在這個函數中對用來進行賦值的“原版”做任何修改。
②加上const,對於const的和非const的實參,函數就能接受;如果不加,就只能接受非const的實參。
用引用是因為:
這樣可以避免在函數調用時對實參的一次拷貝,提高了效率。
註意:
上面的規定都不是強制的,可以不加const,也可以沒有引用,甚至參數可以不是函數所在的對象,正如後面例2中的那樣。
Ⅲ.返回值
一般地,返回值是被賦值者的引用,即*this(如上面例1),原因是
①這樣在函數返回時避免一次拷貝,提高了效率。
②更重要的,這樣可以實現連續賦值,即類似a=b=c這樣。如果不是返回引用而是返回值類型,那麽,執行a=b時,調用賦值運算符重載函數,在函數返回時,由於返回的是值類型,所以要對return後邊的“東西”進行一次拷貝,得到一個未命名的副本(有些資料上稱之為“匿名對象”),然後將這個副本返回,而這個副本是右值,所以,執行a=b後,得到的是一個右值,再執行=c就會出錯。
註意:
這也不是強制的,我們可以將函數返回值聲明為void,然後什麽也不返回,只不過這樣就不能夠連續賦值了。
Ⅳ.調用時機
當為一個類對象賦值(註意:可以用本類對象為其賦值(如上面例1),也可以用其它類型(如內置類型)的值為其賦值,關於這一點,見後面的例2)時,會由該對象調用該類的賦值運算符重載函數。
如上邊代碼中
str2 = str1;
一句,用str1為str2賦值,會由str2調用MyStr類的賦值運算符重載函數。
需要註意的是,
MyStr str2;
str2 = str1;
和
MyStr str3 = str2;
在調用函數上是有區別的。正如我們在上面結果中看到的那樣。
前者MyStr str2;一句是str2的聲明加定義,調用無參構造函數,所以str2 = str1;一句是在str2已經存在的情況下,用str1來為str2賦值,調用的是拷貝賦值運算符重載函數;而後者,是用str2來初始化str3,調用的是拷貝構造函數。
詳細請看:https://www.cnblogs.com/zpcdbky/p/5027481.html
C++中的賦值運算符重載函數(operator=)