在类赋值操作符函数中,为什么必须返回*this ?

C++ : In Class Assignment operator function why do we have to return *this

本文关键字:返回 this 为什么 赋值操作符 函数      更新时间:2023-10-16

我用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;
}

赋值操作符通常的写法实际上是

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

。,返回对自身的引用。这与内置类型的赋值语义相匹配。如果不使用返回值,按值返回check可能会导致不必要的复制。返回void意味着不能写入check1 = check2 = check3;

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