构造函数是否在 C++ 中的数据成员之前调用

问题描述

您好,我是学习 C++ 的新手。 构造函数是按照我在类中创建的顺序创建的,还是在类中创建其他任何东西之前总是先调用它。

#include <iostream>
using namespace std;

class NonStatic 
{
    public:
        int no = 2;

    NonStatic():no(0) {
        
    }
};

int main() {
    NonStatic obj1;
    cout << obj1.no;
    
    return 0;
}

在这堂课上。构造函数是在数据成员之前创建还是在数据成员之后创建

解决方法

询问构造函数是什么时候创建的,它的代码是在编译时创建的,这真的没有意义。

如果您要问默认成员初始化 int no = 2; 或构造函数初始化 : no(2) 中的哪一个具有优先级,则是后者。

可以假设类将其设置为 2,然后构造函数将其设置为 0,但这实际上没有意义。如果构造函数总是这样做,那么默认值无关紧要,因此可能什么都不做。

当然,如果一个不同的构造函数被调用而没有初始化no,它将获得默认值。

,

对于 int no = 2;no 通过 https://docs.python.org/3/library/os.html 初始化为 2。对于 NonStatic():no(0) {}no 通过成员初始化列表初始化为 0。然后默认成员初始化器被忽略,对于 NonStatic obj1;obj1.no 将被初始化为 0 作为结果。

如果成员具有默认成员初始值设定项并且还出现在构造函数的成员初始化列表中,则该构造函数的默认成员初始值设定项将被忽略。

关于default member initializer,首先初始化数据成员(通过默认成员初始化器或成员初始化器列表),然后执行构造函数体。

列表中成员初始化器的顺序无关紧要:实际初始化顺序如下:

  1. ...

  2. ...

  3. 然后,非静态数据成员按顺序初始化 类定义中的声明。

  4. 最后执行构造函数体