基本/默认构造函数与构造函数初始化列表

时间:2019-02-06 22:51:55

标签: c++ constructor initialization

我在这些论坛上阅读了一些不同的主题,但没有得到明确的答案。

我有两个问题,默认/基本构造和构造初始化列表之间有什么区别?在我看来,它们相同,这是我的示例。我是否对它们以及它们的内容进行了正确的评论?

//In my .h file:
class Complex {

public:
Complex();
Complex(double, double);
private:
double real;
double imag;
};

//In my implementation file:
Complex::Complex() :real(NULL), imag(NULL) // initialization list
{
}

Complex::Complex(double inReal, double inImag) // default constructor
{
real = inReal;
imag = inImag;
}    

2 个答案:

答案 0 :(得分:1)

在这种情况下,

Complex::Complex() : real(NULL), imag(NULL)
{
}

将是您的默认构造函数,因为它是这里没有参数的那个。

初始化器列表是您在默认构造函数名称之后看到的样子

:real(NULL), imag(NULL)

这是在调用默认构造函数Complex::Complex()

时发生的成员初始化的列表。

顺便说一句,NULL是一个值,用于表示未指向任何有效可寻址内存位置的指针。它不适用于double类型。

答案 1 :(得分:1)

  

我有两个问题,默认/基本构造和构造初始化列表有什么区别?

默认构造函数是在创建对象时会调用的构造函数,但不指定任何构造函数参数。例如,所有这些变量将通过调用默认构造函数来初始化:

Complex myComplex1;
Complex myComplex2();
Complex myComplex3{};

其他一些构造函数确实需要参数,因此它们是 不是 默认构造函数。

在具有基数或成员变量或常量的对象的 any 构造函数(无论是否为 default 构造函数)的实现中,可以使用初始化列表来构造/初始化这些基础或成员。

  

在我看来,它们相同,这是我的示例。我是否对它们以及它们的内容进行了正确的评论?

您没有正确评论他们。固定版本为:

Complex::Complex()  // default constructor as it does not require args
   : real{}, imag{} // initialization list: sets both to 0.0
{ }

Complex::Complex(double inReal, double inImag) // NOT a default constructor
                                               // as it requires arguments
  : real(inReal), imag(inImag)  // initialisation list
{
    // real = inReal;  // set in the initialisation list instead
    // imag = inImag;
}

在创建对象并指定匹配的构造函数参数时,将调用上面的非默认构造函数:

Complex myComplex4(3.1, 2);
Complex myComplex5{-2.3, 2.7};

优先使用初始化列表来构建您的基础并设置成员是一个好主意:否则,最好将它们默认初始化后再分配给它,这效率可能较低,但是对于引用和常量,您只需使用初始化列表。


可以使用默认值的参数创建默认构造函数:

Complex(double inReal = 0.0, double inImag = 0.0)
  : real(inReal), imag(inImag)
{ }

此单个构造函数可以合理地替换代码中的两个构造函数。