我用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;
}
答案 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
,则只需使用编译器生成的复制构造函数和复制赋值运算符。