首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >现代c++是否具有默认值?

现代c++是否具有默认值?
EN

Stack Overflow用户
提问于 2014-10-14 17:03:32
回答 3查看 150关注 0票数 0

我是c++的新手,我想学习c++的最佳实践。我有一个问题,现代的c++编译器会自动为未初始化的变量分配默认值吗?如果是,这是否意味着我们不需要将默认值赋值给一个变量,或者它取决于系统?

谢谢你的帮助和澄清。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-14 17:08:44

只有静态和全局数据总是被初始化..。

代码语言:javascript
复制
int w; // will be 0
static int x; // will be 0

void f() { static int x; /* will be 0 the first time this scope's entered */ }

struct S
{
    int n_;
};

S s_;  // s_.n_ will be 0 as s_ is global

int main()
{
    S s;  // s.n_ will be uninitialised
          // undefined behaviour to read before setting
}

对于任何其他变量,在读取它们之前,它们必须在代码的某个级别上显式初始化。但是,在声明变量时,它可能是不可见的--它可能位于默认构造函数或赋值中。您还可以像这样导致初始化:

代码语言:javascript
复制
int x{};  // will be 0
int* p = new int{};  // *p will be 0 
票数 4
EN

Stack Overflow用户

发布于 2014-10-14 17:09:49

默认初始化在以下三种情况下执行:

1)当一个具有自动、静态或线程本地存储持续时间的变量被声明时,没有初始化器。

2)当具有动态存储持续时间的对象是由没有初始化器的新表达式创建时,或者是由包含空括号的初始化器的新表达式创建的(直到C++03)。

3)当基类或非静态数据成员未在构造函数初始化程序列表中提及时,将调用该构造函数。

这里有更多信息:initialization

票数 1
EN

Stack Overflow用户

发布于 2014-10-14 17:42:20

关于编译器将做什么,我认为它更多的是相反的,例如:

代码语言:javascript
复制
int x; // still must be inited, will contain random data
if (some_func())
{
   // some devs will do this for "performance" - i.e don't assign a value to x
   x = 2;
}

但如果你写:

代码语言:javascript
复制
int x = 0;
if (some_func())
{
   x = 2;
}

编译器将将其优化为:

代码语言:javascript
复制
int x;
if (some_func())
{
   x = 2; // Yes this code is actually the first example again :)
}

假设x不在函数中的其他位置使用。

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

https://stackoverflow.com/questions/26366278

复制
相关文章

相似问题

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