return 语句后跟初始化列表

return statement followed by initializer list

当我阅读 C++ 导览(第 3 版)时,我遇到了以下使用 complex class(第 4.2 节)的示例。

内复数class定义:

complex& operator+=(complex z)
{
    re += z.re;
    im += z.im;
    return *this;
}

与 class 定义分开定义:

complex operator+(complex a, complex b)
{
    return a += b;
}

complex operator-(complex a)
{
    return { -a.real(), -a.imag() };
} // unary -
  1. 谁能帮我理解为什么在 operator+ 实现中,作者调用了 operator+=,这改变了复数对象的值,即打电话?如果我要计算表达式 a+b,我会期望值 a 被改变吗?

  2. 此外,对于operator-的情况,我对以下说法感到困惑:

    return { -a.real(), -a.imag() };
    

作者是否在 returns 语句之后使用了初始化列表?如果是这样,是否可以不指定它正在初始化的对象的名称来完成?

提前致谢。

operator+ 委托给 operator+= 以避免必须维护两个函数定义。 operator+ 的参数未被修改,因为运算符通过按值而不是按引用接受参数来制作参数的本地副本。所以参数在调用者的上下文中保持不变。


下面的语句

return { -a.real(), -a.imag() };

正在使用 copy-list-initializationbraced-init-list 构造一个 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 中的参数类型不可行,则其他std::complex 的构造函数将被枚举,并通过重载决议选择最佳匹配。