首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原语的C++默认构造函数?

原语的C++默认构造函数?
EN

Stack Overflow用户
提问于 2020-04-28 06:15:25
回答 2查看 70关注 0票数 1

所以我的理解是,如果我有SomeType fooSomeType的默认构造函数将被调用,foo将被初始化。但是如果我有int x --根据规范这是没有定义的。为什么不调用默认构造函数(int())?

EN

回答 2

Stack Overflow用户

发布于 2020-04-28 06:20:23

为什么不调用默认构造函数(int() )?

如果程序员希望这些对象保持未初始化状态,则该语言不想强加调用构造函数和初始化这些对象的成本。

澄清一下:

代码语言:javascript
复制
int x;

不会导致未定义的行为。使用x而不对其进行初始化或显式设置值是导致未定义行为的原因。

一个例子

这允许程序员分配大块内存作为缓冲区,稍后可以使用放置new初始化对象。

代码语言:javascript
复制
char* buffer = new char[SOME_LARGE_BUFFER_SIZE];

以及以后的

代码语言:javascript
复制
// Construct an object in dynamically allocated memory, buffer.
SomeObject* obj = new (buffer+offset) SomeObject;

考虑到buffer的用法,初始化buffer的每个元素对用户没有任何价值。考虑到用例,初始化这些对象的成本是不必要的。

票数 4
EN

Stack Overflow用户

发布于 2020-04-28 06:41:31

你的直觉实际上是对的。事后看来,未初始化的int x; (以及SomeType foo;可能会留下一些未初始化的成员)是bug和安全bug的源泉。理性是,正如R Sahu指出的那样,“不为你不需要的东西付费”是C++的核心哲学。现在看来,初始化本地int变量可能是性能问题的根源,特别是在当今的优化器中,但在过去是这样的。

今天,仍然需要在定义变量之后对其进行未初始化(例如,考虑一下之后需要填充的数组)。但在C++中处理它的方式是不幸的(事后看来)。

一个更好的选择是不允许未初始化的变量,除非程序员明确要求它,例如:

代码语言:javascript
复制
int x = unitialized; // where uninitialized is a keyword

..。再说一次,事后看来。

现在几乎所有的指南都建议总是初始化你的变量,为了做到这一点,你可以使用一些技巧:

auto总是使用auto来初始化你的变量,例如int x{};

  • (almost)总是使用{}来强制你进行初始化,例如
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61469367

复制
相关文章

相似问题

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