c++拷貝建構函式和賦值操作符過載
阿新 • • 發佈:2019-01-31
c++拷貝建構函式:
class A
{
A(const A& a);
....
}
由於拷貝建構函式中,一般不允許對原物件進行修改,因此一般在引數中使用const關鍵字進行限制。
拷貝建構函式一般用於需要new記憶體等操作。如果不允許使用拷貝建構函式,可以將該函式宣告為private型別的。
複製操作符過載:operator=
通常,operator=應該返回一個本類的引用,並且由return *this結束。
class A { A& operator=(const A& a) { ...... return *this; } }
記住:
在使用operator=時,一定要首先判斷是否是自己賦值給自己,否則容易引起錯誤!
比如
對於:
class String
{
public:
String& operator=(const String& s);
private:
char *data;
}
我們可以很容易的實現:
String& String::operator=(const String& s) { delete[] data; data = new char[strlen(s.data) + 1]; strcpy(data, s.data); return *this; }
但是這個是有嚴重問題的!假如一個String物件賦值給他自己,這樣會導致data資訊丟失!
因此需要在複製之前先判斷!
String& String::operator=(const String& s)
{
if (&s != this)
{
......
}
return *this;
}
當然也還有別的方法,比如先用另外一個指標申請記憶體,複製過去之後,再delete data,然後再把新指標的地方賦值給data。這樣做不如上一種方式好,因為如果是物件自己給自己複製的話,這個要浪費時間