结构成员和c ++中类成员的默认值是什么,以及这些规则如何不同(例如,类/结构/基元/等之间)?是否存在有关默认值的规则不同的情况?
今天早上我问自己一些事情,我找不到正确"谷歌"的话:
让我们说:
struct Foo
{
int bar;
};
struct Foo2
{
int bar;
Foo2() {}
};
struct Foo3
{
int bar;
Foo3() : bar(0) {}
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我默认实例化Foo,Foo2并且Foo3:
Foo foo;
Foo2 foo2;
Foo3 foo3;
Run Code Online (Sandbox Code Playgroud)
在哪种情况下,bar会员是否正确初始化?
(Foo3显然很明显地初始化它,并且只在这里显示明确差异Foo2所以问题主要是关于前两个.)
谢谢 !:)
快速初学者的问题:
我是否必须初始化简单的类成员变量,或者它们是否保证在任何情况下都被赋予默认值?
例:
class Foo {
int i;
// is i==0 or do I need the following line for that?
Foo() : i(0) {}
};
Run Code Online (Sandbox Code Playgroud)
谢谢!
一个小时前我在这里发了一个答案,根据我的说法是正确的.然而我的回答却被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++ 14,并试图找出在构造时将所有实例变量初始化为零的最简单方法.这是我到目前为止所拥有的:
class MyClass {
public:
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
MyClass() = default;
~MyClass() = default;
}
Run Code Online (Sandbox Code Playgroud)
将构造函数设置为default等效于:
MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
Run Code Online (Sandbox Code Playgroud)
...或者我需要初始化每个变量吗?(我已经在Visual Studio中尝试了两种方式,但无论如何我都会得到零,但我不确定这是不是运气.)
我没有括号实例化课程: MyClass obj;
这是一些代码:
class MyClass
{
public:
int y;
};
int main()
{
MyClass item1;
MyClass item2 = MyClass();
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下值:
item1.y == [garbage]
item2.y == 0
Run Code Online (Sandbox Code Playgroud)
这让我感到惊讶.
我希望item1是默认构造的,而item2是从匿名默认构造的MyClass实例复制构造的,导致两者都等于0(因为默认构造函数将成员初始化为默认值).检查装配:
//MyClass item1;
//MyClass item2 = MyClass();
xor eax,eax
mov dword ptr [ebp-128h],eax
mov ecx,dword ptr [ebp-128h]
mov dword ptr [item2],ecx
Run Code Online (Sandbox Code Playgroud)
通过在某处临时写入'0'值然后将其复制到item2中来显示正在构造的item2,如预期的那样.但是,item1没有任何程序集.
因此,程序具有堆栈中item1的内存,但它从不构造 item1.
我很欣赏为了速度目的而想要这种行为,但我想要两全其美!我想知道item1.y == 0(它被构造),但我不想浪费时间在default-construct-anonymous-instance-then-copy-construct上,就像item2那样.
令人沮丧的是,我无法通过说明强制默认构造,MyClass item1();因为它被解释为函数原型.
所以...如果我想在item1上使用默认构造函数而不使用复制构造,那我该怎么做呢?
旁注:看起来如果我为MyClass声明一个构造函数,则item1像往常一样构造.所以这种行为只适用于编译器生成的构造函数.
在你开始将其标记为重复之前,我已经读过这个 .但它没有回答我的问题.链接的问题谈到了C++ 98和C++ 03,但我的问题是关于C++ 11引入的默认构造函数.
考虑以下程序(请参阅此处的实时演示):
#include <iostream>
struct Test
{
int s;
float m;
Test(int a,float b) : s(a),m(b)
{ }
Test()=default;
}t;
int main()
{
std::cout<<t.s<<'\n';
std::cout<<t.m<<'\n';
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,编译器提供的默认构造函数总是初始化内置类型,在C++ 11和C++ 14中默认为0,当它们是class&struct成员时.这种行为是否由C++ 11标准保证?
c++ initialization default-constructor language-lawyer c++11
我想知道A*我的课程中是否有成员,nullptr如果我有这种形式的班级构造函数,我们不应该自动设置:
class MyCLass
{
A* m_pointer;
public:
MyCLass()
{
}
};
Run Code Online (Sandbox Code Playgroud)
如果我在C++ 11中做MyCLass* o = new MyCLass;或不做 MyCLass* o = new MyCLass();,这有关系吗?
#include <vector>
struct S { int x; };
std::vector<S> v;
int main() { v.resize(1000); return v[42].x; }
Run Code Online (Sandbox Code Playgroud)
上述程序是否保证在C++ 14中返回0?为什么?
在与同事讨论之后我对此产生了一些怀疑......
正如标题所要求的那样,何时可以假设内置类型将被初始化为0而不是未知值?
规则是否因c ++标准而异?