以下短语在C++中的含义是什么:
零初始化,
默认初始化,和
值初始化
C++开发人员应该了解他们什么?
看完这文章我做了一个点int ()产生0,因为临时int的值进行初始化而不是因为int()呼吁默认构造函数int.(根据我的理解,这篇文章有缺陷.)
我还说原始(内置)类型没有构造函数.原作者让我查看章节$ 10.4.2(TC++ PL)
内置类型也有默认构造函数(6.2.8美元)
但我仍然认为语句"C++允许甚至内置类型(原始类型)具有默认构造函数." 是有缺陷的(根据C++ 03).
我认为TC++ PL中的Bjarne将"构造函数如符号ie ()"与实际的构造函数调用混淆了.当Bjarne写这本书的时候没有引入价值初始化,对吧?那么根据C++ 98和C++ 03,TC++ PL中的文本是不正确的?
你们有什么感想?
编辑
我亲自(通过邮件)问Bjarne关于TC++ PL中有缺陷的文本,这是他的答复
我认为你混淆了"实际的构造函数调用"与概念上有一个构造函数. 内置类型被认为具有构造函数(标准用于描述其行为的任何单词).
C++ 2003 8.5/5说:
到缺省初始化类型的对象T表示:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象被零初始化.
[重点补充.]
C++ 2011标准将最后一项更改为
- 否则,不执行初始化.
对于某些程序来说,这似乎是一个突破性的变化.这是故意的吗?
编辑
以下是一些激励这个问题的代码:
class Foo {
public:
Foo() : m_values() {}
int m_values[3];
};
Run Code Online (Sandbox Code Playgroud)
在C++ 11之前,我认为m_values在默认构造函数中明确提到将默认初始化该数组.由于数组的元素是标量,我预计这意味着值都被设置为0.
在C++ 11中,似乎不再保证会发生这种情况.但也许正如Mooing Duck在评论中指出的那样,也许这不再是默认初始化的情况,而是一些保留预期行为的其他形式.引文欢迎.
一个小时前我在这里发了一个答案,根据我的说法是正确的.然而我的回答却被Martin B贬低了.他说
你很幸运,并且因为我所处的内存恰好是零初始化而得到了零.标准不保证这一点.
然而读迈克尔·伯尔的回答后,这里并尝试下面的示例代码
1)
#include <cassert>
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
Run Code Online (Sandbox Code Playgroud)
我在MSVC++ 2010上遇到调试错误.
我有一个类似的错误,当我尝试下面的代码[我的答案在这里 ]在MSVC++ 2010
2)
#include <cassert>
struct Struct {
std::string String;
int Int;
bool k;
// add add add
};
struct InStruct : Struct
{
InStruct() : Struct() {}
};
int main()
{
InStruct i;
assert(i.k == 0);
}
Run Code Online (Sandbox Code Playgroud)
既没有(1)也没有(2)给gcc/Clang这样的错误让我想到MSVC++ …
零初始化是静态初始化的步骤之一.但你是对的,你不能盲目地替换后者(标签),因为零初始化也是为了初始化值.但是,在C++的上下文中不需要(标记名为)零初始化,因为标记已经存在于静态初始化和值初始化中,并且这些标记更相关.
我认为有一种情况是"零初始化"而不是"静态初始化"或"价值初始化"或"零初始化"永远不会在野外发生,我应该使用更具体的术语如:"静态初始化"或"价值初始化"?
公平地说,我对这些主题的大部分经验都来自于研究这个问题的答案,所以我确定Ben Voigt是对的,我只是想让别人明白为什么.
c++ initialization static-initialization value-initialization
我无法理解 gcc 4.8.1 或 Visual Studio 2015 在默认初始化与值初始化方面的行为。
我试图自己理解这些之间的差异并可能遇到编译器错误并没有帮助?
我的问题是:有人可以解释这种行为吗?最好告诉我应该发生什么。
我有两个班级:
class Foo{
int _bar;
public:
void printBar(){ cout << _bar << endl; }
};
class bar{
int ent;
public:
int getEnt(){return ent;}
};
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码进行测试:
int main()
{
Foo foo;
foo.printBar();
Foo().printBar();
bar b;
cout << b.getEnt() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在 gcc 和 Visual Studio 上,我得到:
134514795
0
0
现在,如果我将测试代码更改为:
int main()
{
Foo foo;
foo.printBar();
bar b;
cout << b.getEnt() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc …