【问题标题】:What are the default initialization values of static variables in c++ objects?c++ 对象中静态变量的默认初始化值是多少?
【发布时间】:2014-07-30 17:57:19
【问题描述】:

我相信所有数值变量都被初始化为零,但是像static boolstatic MyClass* 这样的东西呢?

我浏览了互联网,但我发现的大多数结果都是关于如何将 int 之类的东西初始化为非零值,我只想知道默认值。

【问题讨论】:

    标签: c++ static initialization


    【解决方案1】:

    全局变量、局部静态变量和静态成员变量都初始化为零,除非另有初始化。这意味着浮点值为零,布尔值为 false,指针为 nullptr 等

    http://en.cppreference.com/w/cpp/language/zero_initialization

    【讨论】:

      【解决方案2】:

      标准的§8.5/5 解释了零初始化对象的含义。对于标量类型,零初始化后的值将是0转换为目标类型的结果。

      零初始化bool 的结果是false,因为这是将0 转换为bool 的结果。顺便提一下,bool 是整数类型。

      零初始化指针的结果是空指针值,因为这是将0 转换为指针类型的结果。

      【讨论】:

      • 感谢您花时间发布一个完整的答案,实际上回答了这个问题。这是最好的答案。
      【解决方案3】:

      具有静态存储持续时间的对象初始化为零。这在draft C++ standard 部分3.6.2 非局部变量的初始化 中有介绍,其中说:

      具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应为零初始化 (8.5) 在任何其他初始化发生之前。

      8.5Initializers 中介绍了零初始化:

      对 T 类型的对象或引用进行零初始化意味着:

      • 如果T是标量类型(3.9),则对象设置为值0(零),取整型常量表达式, 转换为 T;103
      • 如果 T 是(可能是 cv 限定的)非联合类类型,则每个非静态数据成员和每个基类 子对象初始化为零,填充初始化为零位;
      • 如果 T 是(可能是 cv 限定的)联合类型,则对象的第一个非静态命名数据成员被零初始化 并且填充被初始化为零位;
      • 如果 T 是数组类型,则每个元素都初始化为零;
      • 如果 T 是引用类型,则不执行初始化。

      boolpointers 都是标量类型,因此第一个项目符号将设置为 0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        • 2023-01-03
        • 1970-01-01
        • 2021-11-05
        相关资源
        最近更新 更多