当有参构造函数进行非初始化列表构造时,是先执行成员默认初始化而非先执行默认构造函数

当不用参数初始化列表进行构造函数时,成员参数会首先进行默认初始化,之前有一段时间自己以为会调用默认构造函数来初始化,后来发现还是有区别的。遂记录如下。

代码

#include 

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

你可能感兴趣的:(当有参构造函数进行非初始化列表构造时,是先执行成员默认初始化而非先执行默认构造函数)