return 语句后跟初始值设定项列表

return statement followed by initializer list

本文关键字:列表 语句 return      更新时间:2023-10-16

当我阅读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 -
  1. 有人可以帮助我理解为什么在operator+实现中,作者调用operator+=,这会更改进行调用的复数对象的值?如果我要评估快速a+b,我会期望值 a 被改变吗?

  2. 另外,对于operator-的情况,我对以下陈述感到困惑:

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

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

提前谢谢。

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


以下声明

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

大括号初始化列表的复制列表初始化,使用获取实值和虚值的构造函数构造complex对象。这是一个 C++11 的补充,并且工作是因为有问题的std::complex构造函数不是explicit

这在 [dcl.init.list]/3 和 [over.match.list]/1 中进行了解释。任何采用std::initializer_list<T>参数的std::complex构造函数都将首先被考虑。如果不存在这样的构造函数(std::complex就是这种情况),或者如果构造函数对于大括号 init-list 中的参数类型不可行,则将枚举std::complex的其他构造函数,并通过重载解析选择最佳匹配。