【发布时间】:2018-03-13 03:56:01
【问题描述】:
当我们通过返回引用分配时,内部 1 和 2 究竟发生了什么?
Class A
{
A& operator= (const A &ax)
{
return *this;
}
}
int main()
{
A a;
A b;
b = a; // -------------- 1
A c = a; // ----------- 2
}
// ---------------------------------------------------------------
下面会发生什么不同(赋值返回值)? :
Class A
{
A operator= (const A &ax)
{
return *this;
}
}
int main()
{
A a;
A b;
b = a; // -------------- 3
A c = a; // ----------- 4
}
【问题讨论】:
-
我知道赋值和初始化。但是以上两个示例的内部执行步骤有什么区别呢?
-
@KoolWagh 第 1 步正在调用
b.operator=(a);。但是因为第 2 步是初始化,而不是赋值,所以它根本不调用您的operator=,而是调用复制构造函数。A c = a;只是A c(a);的语法糖 -
@RemyLebeau 但是在第一个代码中从赋值返回时,返回了引用;而 b 不是参考。它是如何收集在其中的?在第二种情况下,赋值返回值,b 是值。您将如何解释两个案例之间的内部差异?
-
@KoolWagh 你没有抓住重点。
A::operator=的返回值是无关,因为您的代码根本没有将它用于任何事情。调用b = a;与调用b.operator=(a);相同,忽略返回值。所以无论它返回一个引用还是一个值,都没有关系。调用A c = a;与调用A c(a);相同,所以根本不调用A::operator=,而是调用A::A(const A&),所以同样,A::operator=的返回值根本不重要 -
差异仅在
c = b = a(c.operator=(b.operator(a))) 等表达式中可见。试试你的operator=(第 1 步和第 3 步),你会看到。
标签: c++ c++11 operator-overloading return-by-reference return-by-value