在C++中重载赋值运算符

jas*_*ine 16 c++ operator-overloading assignment-operator

据我所知,当重载operator =时,返回值应该是非const引用.


A& A::operator=( const A& )
{
    // check for self-assignment, do assignment

    return *this;
}
Run Code Online (Sandbox Code Playgroud)

在以下情况下允许调用非const成员函数是非const的:


( a = b ).f();
Run Code Online (Sandbox Code Playgroud)

但为什么要返回参考?如果返回值未被声明为引用,它会在什么情况下产生问题,让我们说按值返回?

假设正确实现了复制构造函数.

Joh*_*itb 17

不返回引用是浪费资源,产生一种奇怪的设计.为什么要为运营商的所有用户复制一份副本,即使几乎所有用户都放弃了该值?

a = b; // huh, why does this create an unnecessary copy?
Run Code Online (Sandbox Code Playgroud)

此外,对于您的类的用户来说,这将是令人惊讶的,因为内置赋值运算符不会同样复制

int &a = (some_int = 0); // works
Run Code Online (Sandbox Code Playgroud)


Dav*_*eas 16

重载运算符时的一个很好的一般建议是"像原始类型那样做",并且赋值给基本类型的默认行为就是这样.

如果您觉得有必要,可以选择不返回任何内容来禁用其他表达式中的赋值,但返回副本根本没有意义:如果调用者想要复制它们可以将它从引用中删除,如果它们不需要副本就不需要生成不需要的临时副本.