c++ - 为什么 C++ 默认初始化不对非类类型成员进行零初始化

标签 c++ initialization

为什么标准决定在 default initialization 期间对非类类型成员不做任何事情但执行zero initializationvalue initialization期间?

如果始终对非 clss 类型成员执行零初始化会更安全吗?

最佳答案

语言设计的基本原则之一是您不应该为不需要的东西付费。如果您希望初始化您的成员,您可以要求编译器这样做,但如果您不希望这样做,则不会将成本强加给您。

默认初始化只会初始化那些需要初始化的东西,即具有非平凡默认构造函数的成员,因为该构造函数旨在设置一些对物体。请注意,区别不是类类型与基本类型,而是是否存在普通构造函数:

struct POD { int a; int b; int c; };
struct V { virtual void f(); };
struct Type {
   std::string str;       // default initialization calls default constructor
   V           obj;       //  " calls default constructor: vptr must be set
   POD         pod;       // default initialization leaves this untouched
};

关于c++ - 为什么 C++ 默认初始化不对非类类型成员进行零初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19235864/

相关文章:

c++ - 模板函数将可变数量的元组元素作为参数绑定(bind)到另一个函数

C++ wchar_t 错误未定义

ios - AppDelegate.swift 和 RESideMenu - 故障 InitContentViewController

模板中的 C++ 静态常量初始化顺序

c++ - std::map::运算符[]

c++ - 将 map<string, string> 转储到 char vector

c++ - 没有匹配函数来调用 'make_pair(char [len], int&)

java - 编程最佳实践 : to initialize or not to

c++ - '<一些系统头> : error: ‘<insert function here>’ is not a member of ‘std’ ' after moving source file

java - 在 Servlet 中设置初始化参数