为什么赋值运算符返回ref不指针?

时间:2011-08-23 10:40:00

标签: c++ assignment-operator

我在SO上看到了一些有关Big-Three和复制交换的问题。 确实,我学到了一些新东西,但有一点我不太明白。

为什么operator =返回引用而不是指针?

4 个答案:

答案 0 :(得分:7)

如果您愿意,没有什么可以阻止您返回指针(但是,我不明白为什么),但如果您想模仿c ++中整数类型的行为,则返回引用。

答案 1 :(得分:3)

为什么要这样,指针有什么用呢?通过返回引用,您可以说出指针不会指向的x = y = z;,并且通常允许您将x = y用作与x相同类型的左值。

您可以自由地重载您喜欢的任何赋值运算符,但返回对象本身的引用的标准做法非常有用。

答案 2 :(得分:3)

赋值运算符将左侧的运算符设置为等于右侧,因此概念上lhs和rhs的类型应该匹配。如果赋值运算符将引用作为其参数,则应返回引用:

Foo &operator=(const Foo &f);

写下来是非常奇怪的:

Foo *operator=(const Foo &f);   // this is weird because type of lhs != type of rhs

现在,您可以提供一个版本的operator =(),将一个Foo *分配给另一个:

Foo *operator=(const Foo *f);

但是“三巨头”或“三个规则”并没有说明如何分配指针。 “规则”表示如果覆盖{析构函数,赋值运算符,复制构造函数}中的任何一个,您可能需要覆盖所有这些因为它们都应该处理同一组ivars。但是当你将一个对象分配给另一个对象时。无论指针的类型如何,将一个指针分配给另一个指针通常是相同的。

想想如果使用赋值运算符的Foo *版本代替引用版本会发生什么:你无法设置两个指向同一对象的指针。

答案 3 :(得分:2)

返回指针意味着不是写

a = b = c;

你必须写

*(a = b) = c;

这是丑陋的,也有助于正常的C / C ++使用。