默认构造函数(由编译器创建)是否初始化内置类型?
c++ constructor initialization default-constructor built-in-types
假设我有一个包含POD和非POD成员变量的C++结构:
struct Struct {
std::string String;
int Int;
};
Run Code Online (Sandbox Code Playgroud)
为了让我的程序产生可重现的行为,我希望在构造时初始化所有成员变量.我可以使用初始化列表:
Struct::Struct() : Int() {}
Run Code Online (Sandbox Code Playgroud)
问题是我需要更改我的结构并添加一个新的POD成员变量(比如说bool Bool)我冒险忘记将其添加到初始化列表中.然后在结构构造期间不会对新成员变量进行值初始化.
我也不能使用这个memset()技巧:
Struct::Struct()
{
memset( this, 0, sizeof( *this ) ); //can break non-POD member variables
}
Run Code Online (Sandbox Code Playgroud)
因为调用memset()覆盖已经构造的非POD成员变量会破坏它们.
有没有办法在没有显式添加初始化的情况下强制执行所有POD成员变量的值初始化?
在与同事讨论之后我对此产生了一些怀疑......
正如标题所要求的那样,何时可以假设内置类型将被初始化为0而不是未知值?
规则是否因c ++标准而异?
在C++ 11中,当我使用T *array = new T[n];它已经归零时使用动态数组(使用gcc 4.7.2,Ubuntu 12.10 64bit).
编辑:我已经检查过了T = int.
gcc cxx-flags:-std=gnu++11 -O3 -ffast-math -fno-rtti
有人可以解释为什么我的构造函数在未提供参数时不将分数 c、d、e 值设置为 0 吗?结果是:分数 c=0,0 d=0,6e23 e=6e23,0。
我找到了设置Fraction::Fraction() {}为的解决方法Fraction::Fraction() : m_num(0), m_deno(0) {},但我认为使用Fraction::Fraction() {}意味着用 0 填充值...
class Fraction {
public:
Fraction(double num, double deno);
Fraction(double num);
Fraction();
private:
double m_num;
double m_deno;
};
int main() {
Fraction a(4,5); // a=4/5
Fraction b(2); // b=2/1
Fraction c, // c=0/0
d, // d=0/6e23
e; // e=6e23/0
return 0;
}
Fraction::Fraction() {}
Fraction::Fraction(double num) : m_num(num), m_deno(1) {}
Fraction::Fraction(double num, double deno) : m_num(num), m_deno(deno) {}
Run Code Online (Sandbox Code Playgroud)