return语句后跟初始化列表

mli*_*006 0 c++ initialization initializer-list

当我正在阅读C++(第3版)之旅时,我使用complex该类(第4.2节)看到了以下示例.

在复杂的类定义中:

complex& operator+=(complex z)
{
    re += z.re;
    im += z.im;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

与类定义分开定义:

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

complex operator-(complex a)
{
    return { -a.real(), -a.imag() };
} // unary -
Run Code Online (Sandbox Code Playgroud)
  1. 有人可以帮我理解为什么在operator+实现中,作者会调用operator+=,这会改变正在进行调用的复数对象的值吗?如果我要评估快递a+b,我会期望值a被改变吗?

  2. 另外,对于这种情况operator-,我对声明感到困惑:

    return { -a.real(), -a.imag() };
    
    Run Code Online (Sandbox Code Playgroud)

作者是否在return语句后使用初始化列表?如果是这样,可以在不指定正在初始化的对象的名称的情况下完成吗?

提前致谢.

Pra*_*ian 5

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


以下声明

return { -a.real(), -a.imag() };
Run Code Online (Sandbox Code Playgroud)

正在使用来自braced-init-list的copy-list-initialization来构造一个使用带有实数和虚数值的构造函数的对象.这是一个C++ 11的补充,并且有效,因为有问题的构造函数不是.complexstd::complexexplicit

如何工作在[dcl.init.list]/3[over.match.list]/1中解释.任何构造函数std::complex接受某个std::initializer_list<T>参数,将被优先考虑.如果不存在这样的构造函数(例如std::complex),或者构造函数对于braced-init-list中的参数类型不可行,std::complex则将枚举其他构造函数,并通过重载决策选择最佳匹配.

  • 我其实喜欢'a + = b; 返回a;`比返回a + = b;`更好,但是出于完全不同的原因:第一个版本允许从`a`移动.显然,对于"复杂",它不会做任何事情,但对于更复杂的类型,它可能是重要的. (2认同)