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 -
谁能帮我理解为什么在 operator+
实现中,作者调用了 operator+=
,这改变了复数对象的值,即打电话?如果我要计算表达式 a+b
,我会期望值 a 被改变吗?
此外,对于operator-
的情况,我对以下说法感到困惑:
return { -a.real(), -a.imag() };
作者是否在 returns 语句之后使用了初始化列表?如果是这样,是否可以不指定它正在初始化的对象的名称来完成?
提前致谢。
operator+
委托给 operator+=
以避免必须维护两个函数定义。 operator+
的参数未被修改,因为运算符通过按值而不是按引用接受参数来制作参数的本地副本。所以参数在调用者的上下文中保持不变。
下面的语句
return { -a.real(), -a.imag() };
正在使用 copy-list-initialization 从 braced-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
的构造函数将被枚举,并通过重载决议选择最佳匹配。
当我阅读 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 -
谁能帮我理解为什么在
operator+
实现中,作者调用了operator+=
,这改变了复数对象的值,即打电话?如果我要计算表达式a+b
,我会期望值 a 被改变吗?此外,对于
operator-
的情况,我对以下说法感到困惑:return { -a.real(), -a.imag() };
作者是否在 returns 语句之后使用了初始化列表?如果是这样,是否可以不指定它正在初始化的对象的名称来完成?
提前致谢。
operator+
委托给 operator+=
以避免必须维护两个函数定义。 operator+
的参数未被修改,因为运算符通过按值而不是按引用接受参数来制作参数的本地副本。所以参数在调用者的上下文中保持不变。
下面的语句
return { -a.real(), -a.imag() };
正在使用 copy-list-initialization 从 braced-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
的构造函数将被枚举,并通过重载决议选择最佳匹配。