在我阅读C ++(第3版)之旅时,我使用complex
类(第4.2节)看到了以下示例。
在复杂的类定义中:
complex& operator+=(complex z)
{
re += z.re;
im += z.im;
return *this;
}
与类定义分开定义:
complex operator+(complex a, complex b)
{
return a += b;
}
complex operator-(complex a)
{
return { -a.real(), -a.imag() };
} // unary -
有人可以帮我理解为什么在operator+
实现中,作者调用operator+=
,这会改变正在进行调用的复数对象的值吗?如果我要评估快递a+b
,我会期望值a被改变吗?
此外,对于operator-
的情况,我对声明感到困惑:
return { -a.real(), -a.imag() };
作者是否在return语句后使用初始化列表?如果是这样,是否可以在不指定正在初始化的对象的名称的情况下完成?
提前致谢。
答案 0 :(得分:5)
operator+
委托给operator+=
以避免维护两个函数定义。 operator+
的参数未被修改,因为运算符通过按值而不是通过引用接受它们来创建参数的本地副本。因此,参数在调用者的上下文中保持不变。
以下陈述
return { -a.real(), -a.imag() };
正在使用 braced-init-list 中的 copy-list-initialization 来构建一个complex
对象,使用带有实数和虚数值的构造函数。这是一个C ++ 11添加,并且有效,因为有问题的std::complex
构造函数不是explicit
。
[dcl.init.list] / 3 和 [over.match.list] / 1 中解释了如何工作。任何带有std::complex
参数的std::initializer_list<T>
构造函数都将被视为第一个。如果不存在这样的构造函数(std::complex
的情况),或者构造函数对于 braced-init-list 中的参数类型不可行,则{的其他构造函数将枚举{1}},并通过重载解析选择最佳匹配。