第二種實現
拷貝建構函式和賦值運算子的區別
測試類為具有指標儲存char字串的乙個自定義cmystr類。
#include class cmystring
;cmystring::cmystring(char* pdata)
inline cmystring::cmystring(const cmystring & mystr)
inline cmystring::~cmystring(void)
返回值為本身的引用,便於連續等於,如 a=b=c,如果返回值不是引用,則無法連等。
形參為const引用,避免因為值傳遞呼叫複製建構函式判斷傳入的物件是否為自身,如果是則跳過if (&str == this)
如果儲存的資料為指標,則要將已有空間析構
inline cmystring & cmystring::operator=(const cmystring & str)
使用複製建構函式
以傳入的形參為基礎,呼叫複製建構函式建立臨時物件
將臨時物件與當前物件交換指標
離開函式時,臨時物件析構,自動銷毀原物件的空間
利用臨時物件和 拷貝建構函式,臨時物件離開函式後自動析構
inline cmystring & cmystring::operator=(const cmystring & str)
return *this;
}
參考
拷貝建構函式:使用傳入物件的值生成乙個新的物件。
賦值運算子:將物件的值賦值給乙個已經存在的例項
呼叫的是拷貝建構函式還是賦值運算子,主要是看是否有新的物件例項產生,如果產生了新的物件例項,那呼叫的就是拷貝建構函式;如果沒有,那就是對已有的物件賦值,呼叫的是賦值運算子。
呼叫拷貝建構函式主要有以下場景:
1. 物件作為函式的引數,以值傳遞的方式傳給函式。
2. 物件作為函式的返回值,以值的方式從函式返回。
3. 使用乙個物件給另乙個物件初始化。
!!需注意**等於號=**並不等於一定使用賦值運算子:
person p;
person p1 = p; // 此時雖然是等於號,但是因為p1是新物件,所以仍然是呼叫的 拷貝建構函式
#include using namespace std;
#include "mystring.h"
void test()
int main()
cmystring s5 = s3 = s4; //複製建構函式 + 賦值運算子
cmystring s6 = s5; //複製建構函式
int main()
{test();
system("pause");
return 0;
劍指Offer 賦值運算子函式
按照自己淺薄的理解,敲了如下 include using namespace std class cmystring 就是定義了!cmystring char m pchar null cmystring const cmystring other cmystring cmystring opera...
劍指offer 賦值運算子函式
題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式 class cmystring 思路 類的定義和基本形式 類其實是定義乙個特殊的資料結構,定義了類的物件包括了什麼,以及可以在這個物件上執行哪些操作 class student 成員函式定義 student student vo...
劍指offer 賦值運算子過載
還是有很多點需要注意的。判斷this與傳入的object是否是同乙個物件,相同的話直接返回 this就可以了。判斷傳入物件的陣列是否為空,空的話就不必複製,直接釋放記憶體並將指標置null即可。考慮異常安全。因為new char時如果記憶體不足會丟擲異常,這時安全的做法是先嘗試申請記憶體,申請成功後...