【发布时间】:2014-07-30 17:57:19
【问题描述】:
我相信所有数值变量都被初始化为零,但是像static bool 或static MyClass* 这样的东西呢?
我浏览了互联网,但我发现的大多数结果都是关于如何将 int 之类的东西初始化为非零值,我只想知道默认值。
【问题讨论】:
标签: c++ static initialization
我相信所有数值变量都被初始化为零,但是像static bool 或static MyClass* 这样的东西呢?
我浏览了互联网,但我发现的大多数结果都是关于如何将 int 之类的东西初始化为非零值,我只想知道默认值。
【问题讨论】:
标签: c++ static initialization
全局变量、局部静态变量和静态成员变量都初始化为零,除非另有初始化。这意味着浮点值为零,布尔值为 false,指针为 nullptr 等
见http://en.cppreference.com/w/cpp/language/zero_initialization
【讨论】:
标准的§8.5/5 解释了零初始化对象的含义。对于标量类型,零初始化后的值将是0转换为目标类型的结果。
零初始化bool 的结果是false,因为这是将0 转换为bool 的结果。顺便提一下,bool 是整数类型。
零初始化指针的结果是空指针值,因为这是将0 转换为指针类型的结果。
【讨论】:
具有静态存储持续时间的对象初始化为零。这在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 是引用类型,则不执行初始化。
bool 和 pointers 都是标量类型,因此第一个项目符号将设置为 0。
【讨论】: