我在SO上看到了一些有关Big-Three和复制交换的问题。 确实,我学到了一些新东西,但有一点我不太明白。
为什么operator =返回引用而不是指针?
答案 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 ++使用。