【问题标题】:(C++) why static member can be used before it is initialized? [duplicate](C++) 为什么静态成员可以在初始化之前使用? [复制]
【发布时间】:2018-10-30 09:07:41
【问题描述】:

我写了这个测试代码:

#include <iostream>
using namespace std;

class Date {
    int d;
    int m;
    int y;

public:
    static Date default_date;

public:
    Date(int d, int m, int y) {
        default_date.display();
        this->d = d ? d : default_date.d;
        this->m = m ? m : default_date.m;
        this->y = y ? y : default_date.y;
    }
    void display() { std::cout << d << "-" << m << "-" << y << std::endl; }
};

Date Date::default_date(25, 12, 2018);

int main() {
    Date d = Date(0, 0, 0);
    d.display();
    Date::default_date.display();
}

输出是:

0-0-0
25-12-2018
25-12-2018
25-12-2018

好的,这是我的问题。

静态成员default_date在类定义之外使用类的构造函数进行初始化。

但是,当调用构造函数时,default_date 似乎已经存在。我什至执行default_date.display() 并得到输出0-0-0

为什么我可以在构造/初始化之前访问default_date

【问题讨论】:

标签: c++ class constructor static-members


【解决方案1】:

第一次调用构造函数是default_date的初始化点。在此构造函数内部,在为成员分配其假定值之前,构造函数构造函数调用display(),它会打印成员的零初始化值。

【讨论】:

  • 类静态不会在构造时初始化,它们会在程序启动时初始化,否则具有从未构造过的静态的类将永远不会被初始化
  • @AlanBirtles 看到这个被标记为重复的问题:他们的存储在任何其他初始化之前都是零初始化的。
  • 啊,我明白了,我看错了你的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多