为什么教科书使用初始化列表作为operator-(complex a)的return值?
Why does the textbook uses an initializer list as the return value of operator-(complex a)?
我正在阅读(Bjarne Stroustrup 的)教科书 class complex
的定义
class complex {
double re, im; // representation: two doubles
public:
complex(double r, double i) :re{r}, im{i} {} // construct complex from two scalars
complex(double r) :re{r}, im{0} {} // construct complex from one scalar
complex() :re{0}, im{0} {} // default complex: {0,0}
double real() const { return re; }
void ral(double d) { re = d; }
double imag() const { return im; }
void imag(double d) { im = d; }
complex& operator+=(complex z) { re+=z.re, im+=z.im; return *this; } // add to re and im
// and return the result
complex& operator-=(complex z) { re-=z.re, im-=z.im; return *this; }
complex& operator*=(complex); // defined out-of-class somewhere
complex& operator/=(complex); // defined out-of-class somewhere
};
书中还定义了复数的运算:
complex operator+(complex a, complex b) { return a+=b; }
complex operator-(complex a, complex b) { return a-=b; }
complex operator-(complex a) { return {-a.real(), -a.imag()}; } // unary minus
complex operator*(complex a, complex b) { return a*=b; }
complex operator/(complex a, complex b) { return a/=b; }
我不明白上面的第三行,它处理一元减法。为什么使用初始化列表作为 operator-(complex a);
的 return 值有意义?
该函数的 return 类型是 complex
对象,因此初始化器列表中的那些参数被推断为 complex
构造函数的参数,新对象是 returned.
你必须有
return {-a.real(), -a.imag()};
因为您想 return 一个从这两个值创建的 complex
。如果您尝试使用
return -a.real(), -a.imag();
相反,您会 return 一个 complex
,它仅从 -a.imag()
创建,因为逗号运算符仅 return 是最后一个值。本质上,代码和
完全一样
return -a.imag();
为了更明确,作者可以这样写
return complex{-a.real(), -a.imag()};
//or
return complex(-a.real(), -a.imag());
但这真的不需要,因为 return 值总是转换为 return 类型,并且使用初始化列表,它们的使用就像您输入 return_type{ initializers }
一样。
没有初始化列表你必须写
complex operator-( complex a ) { return complex( -a.real(), -a.imag() ); }
使用初始化列表,运算符的定义看起来更简单。
在任何情况下,编译器都会选择构造函数
complex( double, double );
考虑到一般情况下函数应该声明为
complex operator-( const complex &a ) { return { -a.real(), -a.imag() }; }
我正在阅读(Bjarne Stroustrup 的)教科书 class complex
class complex {
double re, im; // representation: two doubles
public:
complex(double r, double i) :re{r}, im{i} {} // construct complex from two scalars
complex(double r) :re{r}, im{0} {} // construct complex from one scalar
complex() :re{0}, im{0} {} // default complex: {0,0}
double real() const { return re; }
void ral(double d) { re = d; }
double imag() const { return im; }
void imag(double d) { im = d; }
complex& operator+=(complex z) { re+=z.re, im+=z.im; return *this; } // add to re and im
// and return the result
complex& operator-=(complex z) { re-=z.re, im-=z.im; return *this; }
complex& operator*=(complex); // defined out-of-class somewhere
complex& operator/=(complex); // defined out-of-class somewhere
};
书中还定义了复数的运算:
complex operator+(complex a, complex b) { return a+=b; }
complex operator-(complex a, complex b) { return a-=b; }
complex operator-(complex a) { return {-a.real(), -a.imag()}; } // unary minus
complex operator*(complex a, complex b) { return a*=b; }
complex operator/(complex a, complex b) { return a/=b; }
我不明白上面的第三行,它处理一元减法。为什么使用初始化列表作为 operator-(complex a);
的 return 值有意义?
该函数的 return 类型是 complex
对象,因此初始化器列表中的那些参数被推断为 complex
构造函数的参数,新对象是 returned.
你必须有
return {-a.real(), -a.imag()};
因为您想 return 一个从这两个值创建的 complex
。如果您尝试使用
return -a.real(), -a.imag();
相反,您会 return 一个 complex
,它仅从 -a.imag()
创建,因为逗号运算符仅 return 是最后一个值。本质上,代码和
return -a.imag();
为了更明确,作者可以这样写
return complex{-a.real(), -a.imag()};
//or
return complex(-a.real(), -a.imag());
但这真的不需要,因为 return 值总是转换为 return 类型,并且使用初始化列表,它们的使用就像您输入 return_type{ initializers }
一样。
没有初始化列表你必须写
complex operator-( complex a ) { return complex( -a.real(), -a.imag() ); }
使用初始化列表,运算符的定义看起来更简单。
在任何情况下,编译器都会选择构造函数
complex( double, double );
考虑到一般情况下函数应该声明为
complex operator-( const complex &a ) { return { -a.real(), -a.imag() }; }