当不用参数初始化列表进行构造函数时,成员参数会首先进行默认初始化,之前有一段时间自己以为会调用默认构造函数来初始化,后来发现还是有区别的。遂记录如下。
代码
#include <iostream>
class A
{
public:
A() { std::cout << "default construct" << std::endl; }
A(int i)
{
a = i;
std::cout << "int constructor" << std::endl;
}
private:
int a;
};
int main(int, char **)
{
A a1(1); //这里调用有参构造函数,由于未用参数初始化列表,所以会将成员进行默认初始化
A a2; //这里调用的是默认构造函数
return 0;
}
之前会以为当调用有参数的构造函数时,由于未用参数初始化列表,所以会首先调用默认构造函数,所以应当首先输出“default construct",然后输出"int constructor"。但是,实际上只会输出"int constructor",则证明并未调用默认构造函数。后来才理解是进行参数的默认初始化,而不是进行调用默认构造函数。
图 1 程序输出结果
结论
当有参构造函数进行非初始化列表构造时,是先执行成员默认初始化而非先执行默认构造函数
--2020.12.06