在C ++中重载类的赋值运算符时,它的参数必须是引用吗?
例如,
class MyClass {
public:
...
MyClass & operator=(const MyClass &rhs);
...
}
可以吗
class MyClass {
public:
...
MyClass & operator=(const MyClass rhs);
...
}
谢谢!
答案 0 :(得分:9)
重载赋值运算符的参数可以是任何类型,它可以通过引用或值传递(如果类型不是可复制的,那么它显然不能通过值传递)。
因此,例如,您可以使用int
作为参数的赋值运算符:
MyClass& operator=(int);
复制赋值运算符是赋值运算符的特例。它是任何赋值运算符,它通过值或引用获取与类相同的类型(引用可以是const或volatile限定的)。
如果您没有显式实现某种形式的复制赋值运算符,那么编译器会隐式声明并实现一个。
答案 1 :(得分:5)
通常,由您决定,没有 必须 。第一个变体是常见的和“canonic”,可以用于任何赋值运算符实现。
当问题是速度时,我认为你应该阅读this article关于值传递技术。这意味着在某些情况下,通过值传递比通过const引用传递更有效。
另外,您的第二个变体不需要const
关键字,因为按值传递就像创建副本一样,因此原始对象肯定不会被更改。
答案 2 :(得分:5)
C++ Operator Overloading Guidelines建议,赋值运算符获取const引用。根据网站,原因是我们不想改变参数(因为const),而只是操作符的左侧。因此,通过引用节省了传递它的时间。
它还指出了为什么赋值运算符返回引用的原因 - 运算符链接。为了使a = (b = 1)
正常工作,(b = 1)
必须返回可以分配(=
)到a
的引用。
答案 3 :(得分:3)
您是否知道复制和交换习惯用于异常安全分配?
MyClass& operator=(const MyClass& rhs)
{
MyClass copy(rhs);
swap(copy);
return *this;
}
通过按值调用可以简化(在某些情况下加速)实现:
MyClass& operator=(MyClass copy)
{
swap(copy);
return *this;
}
答案 4 :(得分:-2)
好的,我遇到了这个问题,我找不到一个好的答案,所以我要分享我学到的东西。
你可以通过值传递,没有任何问题。 (正如你在问题中所表明的那样。)
但是我们通过const引用传递参数的原因是函数不会生成被调用的值的实际副本。它被引用,因此它只是指向该值,无论它在内存中的哪个位置。
这节省了处理时间,特别是如果它的东西很大,有数千个名字...... 在这种情况下,节省的时间几乎没有。
对于const,它确保函数的用户不会更改引用的值,因为它可以更改,因为您可以访问内存中的原始位置,因为它通过引用传递。 如果你的函数定义实际上改变了const引用调用的参数的值,那么它将是编译器错误,它不会让你这样做。因为当你输入const时,你告诉编译器这个值不能改变。