【问题标题】:cpp static object instantiationcpp 静态对象实例化
【发布时间】:2019-08-14 16:40:29
【问题描述】:

我是 CPP 的新手。
我需要添加可以从静态方法调用的静态成员。
所以在 .h 我声明它:

static uint32_t s_MyStaticMember; 

在我的构造函数上方(在“命名空间”中)我初始化它:

uint32_t MyClassName::s_MyStaticMember;

现在我可以从我的静态方法中使用这个静态成员了。
问题是,如果我用 =0 初始化成员;

uint32_t MyClassName::s_MyStaticMember=0;" 

类的下一次实例化会发生什么?
我认为它不会将静态成员重置为 0,因为这是初始化不在类中的原因,=0 将发生只发生一次

我的假设正确吗?

【问题讨论】:

  • 你只能实例化一次。再次尝试这样做是错误的。
  • @NathanOliver 问题是如果通过在全局中定义 =0;每次创建对象时都不会将现有实例的值设置为 0。这没有意义,我只是想验证一下
  • 我是说你不能在 uint32_t MyClassName::s_MyStaticMember; 后面跟着 uint32_t MyClassName::s_MyStaticMember = 0;。那是重新定义,是不允许的。如果这不是您要问的,那么拥有minimal reproducible example 会很有帮助。
  • @NathanOliver 我不是要重新定义它,我的意思是修改代码中的行并重新编译,而不是成员;做成员= 1。以下答案是正确的,我的假设是正确的,谢谢帮助

标签: c++ oop static


【解决方案1】:

静态变量只初始化一次,在程序启动的静态初始化阶段(参考:[basic.start.static])。编译器负责确保只有一个 Counted::count 实例,并且在您的任何其他代码运行之前,它只被初始化一次。

请注意,如果您没有显式初始化静态变量(因此您只需在没有 = 0 的情况下定义它),默认情况下它无论如何都是零初始化的。

构造类的实例对非实例(即静态)成员完全没有影响,除非您的构造函数显式写入它们,例如。

struct Counted {
  static unsigned count;
  Counted() { ++count; }
  ~Counted() { --count; }
};

unsigned Counted::count;

构造函数确实改变了静态,但它没有重新初始化它。

【讨论】:

    【解决方案2】:

    是的。静态成员变量类似于命名空间中的全局变量。他们只有一个实例。它们的初始化只会在执行进入你的 main() 之前发生一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2020-07-12
      相关资源
      最近更新 更多