首页 > 解决方案 > 字符串和字符串数组的零初始化(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;如果语法是 for ,为什么会发生零初始化static T object;

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

零初始化的效果是:

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

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

但根据上述文件,

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

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

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

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

标签: c++arraysinitialization

解决方案


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

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

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

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

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

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

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

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

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

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


推荐阅读