繁体   English   中英

字符串和字符串数组的零初始化(C++)

[英]Zero initialization of string and string array (C++)

根据https://en.cppreference.com/w/cpp/language/zero_initialization

在此处输入图片说明

在文档提供的示例中:

std::string s; // is first zero-initialized to indeterminate value
               // then default-initialized to ""

为什么string s;会发生零初始化string s; 如果语法是针对static T object; ?

为什么零初始化发生在默认初始化之前,为什么两者都允许发生?

零初始化的效果是:

  • 如果 T 是标量类型,则对象的初始值是显式转换为 T 的整数常量零。
  • 如果 T 是非联合类类型,则所有基类和非静态数据成员都初始化为零,并且所有填充都初始化为零位。 构造函数(如果有)将被忽略。
  • 如果 T 是联合类型,则第一个非静态命名数据成员被零初始化,所有填充都被初始化为零位。
  • 如果 T 是数组类型,则每个元素都初始化为零
  • 如果 T 是引用类型,则什么都不做。

如果我初始化string array[2] = {"Test1"}; ? 我知道数组将包含“Test1”和空字符串“”。

但是根据上面的文档,

如果 T 是数组类型,则每个元素都初始化为零

数据类型是字符串,它是对象/引用类型吗?

如果 T 是引用类型,则什么都不做。

什么都没做? 我想也许会调用一个构造函数。 空字符串肯定是什么吗?

为什么string s;会发生零初始化string s; 如果语法是针对static T object; ?

为什么零初始化发生在默认初始化之前,为什么两者都允许发生?

在您链接到的页面中,它定义了一个非局部变量。

非局部变量分两个阶段初始化。

  1. 静态初始化。
  2. 动态初始化(如果适用)。

静态初始化阶段,使用常量初始化零初始化初始化变量

使用动态初始化(如果适用),例如用于具有适当构造函数的对象或使用可在运行时评估的表达式初始化的对象。

您可以在https://en.cppreference.com上阅读有关该主题的更多信息。

什么都没做? 我想也许会调用一个构造函数。 空字符串肯定是什么吗?

引用不能被零初始化。 它只能使用将作为引用的对象进行初始化。

(除非另有说明,否则假定此答案中的所有声明都在命名空间范围内。)

为什么string s;会发生零初始化string s; 如果语法是针对static T object; ?
为什么零初始化发生在默认初始化之前,为什么两者都允许发生?

具有静态存储持续时间的变量首先在编译时初始化为零,然后在运行时可选地动态初始化。 static T object; 声明一个静态存储持续时间的对象。 对于一个简单的声明,如

int x;

不执行动态初始化。 对于更复杂的声明,如

std::string s;

对字符串进行零初始化可能会导致无效的字符串具有破坏的类不变量。 因此,动态初始化调用默认构造函数来确保对象有效。

如果我初始化string array[2] = {"Test1"}; ? 我知道数组将包含“Test1”和空字符串“”。

首先,在编译时,这两个对象被零初始化,导致可能的无效状态。 然后,在运行时,调用构造函数(第一个对象的const char*构造函数和第二个对象的默认构造函数),并构造有效的对象。

数据类型是string ,它是对象/引用类型吗?

std::string是对象类型而不是引用类型。

【供参考型】什么都没做? 我想也许会调用一个构造函数。 空字符串肯定是什么吗?

引用类型不被视为实际的“对象”,因此指定其零初始化语义没有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM