2010-05-30 58 views
6

当在C++中重载一个类的赋值操作符时,它的参数是否必须是引用?赋值运算符的参数必须是参考吗?

例如,

class MyClass { 
public: 
... 
MyClass & operator=(const MyClass &rhs); 
... 
} 

难道是

class MyClass { 
public: 
... 
MyClass & operator=(const MyClass rhs); 
... 
} 

谢谢!

回答

9

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

因此,例如,你可以有一个赋值操作符,它接受一个int作为参数:

MyClass& operator=(int); 

拷贝赋值运算符是一个赋值运算符的一种特殊情况。它是任何赋值运算符,它通过值或引用(类型可以是const或volatile)来采用与类相同的类型。

如果您没有明确实现某种形式的复制赋值运算符,则会由编译器隐式声明和实现。

+0

谢谢,詹姆斯!对于复制赋值运算符,是否有任何类类型不可复制构造?我认为所有的类类型至少有一个默认的复制构造函数? – Tim 2010-05-30 22:52:53

+0

@Tim:好的:如果你有一个类的_private_用户声明的拷贝构造函数,那么拷贝构造函数将不可访问(除非你在该类的成员函数或朋友中),并且该类不会被复制。如果您声明了复制构造函数但未定义它,那么该类根本就不是可复制的(并且试图复制构造实例会导致链接器错误)。这两种技术都被用于(通常是一起)使得类不能被复制。 – 2010-05-30 23:27:32

+0

谢谢!我想知道在哪些情况下不需要复制课程? – Tim 2010-05-31 03:46:41

5

一般来说,它是由你来决定,没有必须。第一个变体是常见的和“canonic”,对于任何赋值操作符实现都可以。

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

此外,您的第二个变体不需要const关键字,因为按值传递的行为就像创建副本一样,所以原始对象绝对不会被更改。

+0

谢谢科蒂!粗略阅读它,但不太明白为什么按引用传递比传递值慢? – Tim 2010-05-31 03:53:57

+0

好吧,通常情况并非如此,但本文的重点在于,如果您在通过引用传递对象后立即执行对象拷贝,则由于编译器优化,它将比传递值和分配该拷贝要慢。这实际上是棘手的,但并不完全没有意义...... – 2010-05-31 05:50:17

5

C++ Operator Overloading Guidelines建议,赋值运算符得到一个const引用。根据该网站,原因是我们不想改变参数(自const以来),而只是操作符的左侧。因此通过引用节省时间来传递它。

它也指出了为什么还有一个引用是由赋值操作符 - 操作符链接返回的原因。为了得到a = (b = 1)的工作,有必要(b = 1)返回一个可以分配的参考(=)到a

+0

优秀的链接... – 2015-02-20 16:49:59

3

您是否知道复制并调换用于异常安全赋值的习惯用法?

MyClass& operator=(const MyClass& rhs) 
{ 
    MyClass copy(rhs); 
    swap(copy); 
    return *this; 
} 

的实施可以简化(在某些情况下加速)的值通过调用:

MyClass& operator=(MyClass copy) 
{ 
    swap(copy); 
    return *this; 
} 
-2

好,我有这个问题,我无法找到一个很好的答案,所以我去分享我学到的东西。

你可以通过价值传递,没有什么不对。 (正如你在你的问题中所展示的那样)。

但是,我们通过const引用传递参数的原因是,函数不会调用被调用的值的实际副本。它的引用,所以它只是指向那个值存储在任何地方。

这节省了处理时间,特别是如果它的东西很大,有成千上万的名字...... 在这种情况下,节省的时间几乎没有。

对于常量来说,它确保了函数的用户不会改变参考值,因为它可以被更改,因为您可以访问内存中的原始位置,因为它通过引用传递。 如果你的函数定义实际上改变了被const引用调用的参数的值,那将是一个编译器错误,它不会让你这样做。因为当你放置const时,你告诉编译器这个值不能改变。

+0

请考虑像这样的讨论到评论。 – wizulus 2014-02-28 23:05:50

+0

你是什么意思?对不起,我是新人,我想我写的是评论。 – 3366784 2014-03-01 17:37:22

+0

问题或答案在左侧有大量上下箭头。在每个说“添加评论”下有一个链接。点击它会给你一个简单的文本框来输入评论,就像你刚才使用的那个一样。你之前做过的是在页面底部的一个叫**“你的答案**”部分输入一个**答案**。欢迎来到StackOverflow :) – wizulus 2014-03-01 18:07:19