赋值运算符的参数必须参考吗?

Tim*_*Tim 6 c++ reference assignment-operator

在C++中重载类的赋值运算符时,它的参数必须是引用吗?

例如,

class MyClass {
public:
...
MyClass & operator=(const MyClass &rhs);
...
}
Run Code Online (Sandbox Code Playgroud)

是真的吗

class MyClass {
public:
...
MyClass & operator=(const MyClass rhs);
...
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jam*_*lis 9

重载赋值运算符的参数可以是任何类型,它可以通过引用或值传递(好吧,如果类型不是可复制构造的,那么显然不能通过值传递).

因此,例如,您可以使用一个赋值运算符int作为参数:

MyClass& operator=(int);
Run Code Online (Sandbox Code Playgroud)

复制赋值运算符是赋值运算符的特例.它是任何赋值运算符,它通过值或引用获取与类相同的类型(引用可以是const或volatile限定的).

如果您没有显式实现某种形式的复制赋值运算符,那么编译器将隐式声明并实现一个.


Cos*_*ert 5

一般来说,由你来决定,没有必要.第一个变体是常见的和"canonic",可以用于任何赋值运算符实现.

当问题是速度时,我认为你应该阅读这篇关于传值技术的文章.这意味着在某些情况下,通过值传递比通过const引用传递更有效.

另外要提到的是,您的第二个变体不需要const关键字,因为按值传递就像创建副本一样,因此原始对象肯定不会更改.


phi*_*mue 5

C++运算符重载指南建议,赋值运算符获取const引用.根据网站,原因是我们不想改变参数(因为const),而只是操作符的左侧.因此,它节省了通过引用传递它的时间.

它还指出了为什么赋值运算符返回引用的原因 - 运算符链接.为了得到a = (b = 1)工作,这是必要的,(b = 1)返回可分配引用(=)来a.