我看到了这个节目.这是什么 - 在构造函数复数(double r,double i)之后的re(r),im(i){}?

onl*_*man -4 c++ syntax

// operator_overloading.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

struct Complex {
   Complex( double r, double i ) : re(r), im(i) {} // what is this syntax?
   Complex operator+( Complex &other );
   void Display( ) {   cout << re << ", " << im << endl; }
private:
   double re, im;
};

// Operator overloaded using a member function
Complex Complex::operator+( Complex &other ) {
   return Complex( re + other.re, im + other.im );
}

int main() {
   Complex a = Complex( 1.2, 3.4 );
   Complex b = Complex( 5.6, 7.8 );
   Complex c = Complex( 0.0, 0.0 );

   c = a + b;
   c.Display();
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 5

Complex( double r, double i ) : re(r), im(i) {}
Run Code Online (Sandbox Code Playgroud)

此构造在C++中称为成员初始化列表.

它将您的成员初始化re为值r,将成员初始化im为值i.


内部构造函数中的Initializing和Assignment有什么区别?&有
什么好处?

使用初始化程序列表初始化成员并在构造函数体内为其指定值之间存在差异.

通过初始化列表初始化字段时,构造函数将被调用一次.

如果使用赋值,则首先使用默认构造函数初始化字段,然后使用实际值重新分配(通过赋值运算符).

如您所见,在后者中存在创建和分配的额外开销,这对于用户定义的类可能是相当大的.

对于双数据类型(您使用它)或POD类成员,没有实际开销.