C ++:在类赋值运算符函数中为什么我们必须返回* this

时间:2014-08-08 04:43:20

标签: c++

我用C ++编写了一个类,并定义了赋值运算符函数: cplusplus.com建议使用以下语法。

check operator= (const check& obj){*cstr = *(obj.cstr); return *this;}

另一种语法是:

void operator= (const check& obj){*cstr = *(obj.cstr);} # Not returning *this

您是否建议使用第一种方法或第二种方法?

以下是我的课程:

class check {
private:
    string * cstr;
public:
    int a;
    check (string str) { cstr = new string(str);}
    check (const check& obj) {cstr = obj.cstr;}
    ~check() {cout<<"DES"<<endl; delete cstr; }
    check operator= (const check& obj){*cstr = *(obj.cstr); return *this;}
    void display () { cout<<*cstr<<endl;}
};

int main () {
    check da {"one"};
    check pa {"two"};
    pa = da;
    have (pa);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

编写赋值运算符的常用方法实际上是

check &operator= (const check& obj){*cstr = *(obj.cstr); return *this;}

即返回对自身的引用。这与内置类型的赋值语义相匹配。如果未使用返回值,则按值返回check可能会产生不必要的副本。返回void表示您无法撰写check1 = check2 = check3;

顺便说一句,check (const check& obj) {cstr = obj.cstr;}可能是错误的。您希望复制构造函数进行深层复制,而不仅仅是复制指针。而且,我认为没有理由需要将指针用作类成员。如果只存储普通的std::string,则只需使用编译器生成的复制构造函数和复制赋值运算符。