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

时间:2019-07-31 04:08:18

标签: c++ arrays initialization

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

enter image description here

在文档提供的示例中:

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

如果语法用于string s;,为什么static T object;会发生零初始化?

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

零初始化的影响是:

  
      
  • 如果T是标量类型,则对象的初始值为整数   常量零明确转换为T。
  •   
  • 如果T是非工会班级   类型,所有基类和非静态数据成员都是   零初始化,并且所有填充都初始化为零位。的   构造函数(如果有)将被忽略。
  •   
  • 如果T是联合类型,则第一个   非静态命名数据成员被零初始化,所有填充为   初始化为零位。
  •   
  • 如果T为数组类型,则每个元素为   零初始化
  •   
  • 如果T是引用类型,则不执行任何操作。
  •   

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

但是根据上述文档,

  

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

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

  

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

什么都没做?我认为也许会调用一个构造函数。当然,是空字符串吗?

2 个答案:

答案 0 :(得分:1)

  

如果语法用于string s;,为什么static T object;会发生零初始化?

     

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

在链接到的页面中,该页面定义了非本地变量。

非局部变量分为两个阶段。

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

静态初始化阶段,使用恒定初始化零初始化

初始化变量

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

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

  

什么都没做?我认为也许会调用一个构造函数。当然,是空字符串吗?

引用不能初始化为零。只能使用将要引用的对象对其进行初始化。

答案 1 :(得分:1)

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

  

如果语法适用于string s;,为什么会发生零初始化?   static T object;
  为什么零初始化之前发生   默认初始化以及为什么都允许发生?

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

int x;

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

std::string s;

对字符串进行零初始化可能会导致无效的字符串,其中包含不变的类变量。因此,动态初始化将调用默认构造函数以确保该对象有效。

  

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

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

  

数据类型为string,这是对象/引用类型?

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

  

[对于引用类型]什么都不做?我以为也许是构造函数   会被调用。当然,是空字符串吗?

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