首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串和字符串数组(C++)的零初始化

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

Stack Overflow用户
提问于 2019-07-31 04:08:18
回答 2查看 1.2K关注 0票数 2

根据initialization

在文档提供的示例中:

代码语言:javascript
运行
复制
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是引用类型,则什么也不做。

什么都没做?我想也许会有一个构造函数被调用。一根空的绳子肯定是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-31 04:27:08

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

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

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

代码语言:javascript
运行
复制
int x;

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

代码语言:javascript
运行
复制
std::string s;

零初始化一个字符串可能会导致一个无效的字符串与一个破碎的类不变。因此,动态初始化调用默认构造函数以确保对象是有效的。

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

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

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

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

对于引用类型,什么都不做?我想也许会有一个构造函数被调用。一根空的绳子肯定是什么?

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

票数 1
EN

Stack Overflow用户

发布于 2019-07-31 04:26:48

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

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

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

  1. 静态不对称
  2. 如果应用了动态初始化。

在静态初始化阶段,变量使用常量初始化或零初始化进行初始化。

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

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

什么都没做?我想也许会有一个构造函数被调用。一根空的绳子肯定是什么?

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57283036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档