1. 程式人生 > >c++拷貝建構函式和賦值操作符過載

c++拷貝建構函式和賦值操作符過載

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。這樣做不如上一種方式好,因為如果是物件自己給自己複製的話,這個要浪費時間