劍指offer Q01賦值運算子函式

2021-10-03 22:27:34 字數 1658 閱讀 3111

第二種實現

拷貝建構函式和賦值運算子的區別

測試類為具有指標儲存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時如果記憶體不足會丟擲異常,這時安全的做法是先嘗試申請記憶體,申請成功後...