【问题标题】:Is constructor called in before the data members in C++在 C++ 中的数据成员之前调用构造函数
【发布时间】:2021-06-13 09:07:13
【问题描述】:

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

#include <iostream>
using namespace std;

class NonStatic 
{
    public:
        int no = 2;

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

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

在这个班级。构造函数是在数据成员之前创建还是在数据成员之后创建

【问题讨论】:

    标签: c++ constructor datamember


    【解决方案1】:

    对于int no = 2;no 通过default member initializer 初始化为2。对于NonStatic():no(0) {}no 通过成员初始化列表初始化为0。然后忽略默认的成员初始化器,对于NonStatic obj1;obj1.no会被初始化为0

    如果一个成员有一个默认的成员初始化器并且还出现在构造器的成员初始化列表中,那么该构造器的默认成员初始化器将被忽略。

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

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

    1. ...

    2. ...

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

    4. 最后,构造函数的主体被执行

    【讨论】:

      【解决方案2】:

      询问构造函数的创建时间是没有意义的,它是代码,所以是在编译​​时创建的。

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

      可以假设类将其设置为 2,然后构造函数将其设置为零,但这并没有什么意义。如果构造函数一直在做,那么默认就没有关系,所以可能什么都不做。

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

      【讨论】:

        猜你喜欢
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 2011-12-07
        • 2015-08-05
        • 1970-01-01
        相关资源
        最近更新 更多