我在这些论坛上阅读了一些不同的主题,但没有得到明确的答案。
我有两个问题,默认/基本构造和构造初始化列表之间有什么区别?在我看来,它们相同,这是我的示例。我是否对它们以及它们的内容进行了正确的评论?
//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;
}
答案 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)
{ }
此单个构造函数可以合理地替换代码中的两个构造函数。