是所有数据成员都初始化为0还是由自动调用的构造函数分配了随机值?

时间:2019-03-30 09:04:08

标签: c++11

当我们不手动调用构造函数时,我尝试检查为数据成员分配了哪些值。我的a和b均为0,但c的值为1,那么如何初始化数据成员?随机还是0?如果将它们初始化为0,为什么我看到1作为c的值?

#include<iostream>
using namespace std;

class Class
{
    public:
        int a,b,c;      
};

int main()
{
    Class obj;

    cout<<obj.a;
    cout<<"\n";
    cout<<obj.b;
    cout<<"\n";
    cout<<obj.c;

    return 0;
}

输出为 0 0 1

但是我期望 0 0 0

1 个答案:

答案 0 :(得分:0)

here所述,您所用的默认初始化将导致“不确定”,即未定义的值。

编译器将为您提供默认的构造函数,因为您尚未自己定义它,也未定义任何其他构造函数(在这种情况下,它将删除它),但是默认的构造函数仍会使成员值未定义。您得到0和1-我得到的数字更像1515788312

使用C ++ 11标准,您可以通过直接在类中提供默认值来防止这种情况,

#include<iostream>
using namespace std;

class Class
{
public:
    int a = 0, b = 0, c = 0;
};

int main()
{
    Class obj;

    cout<< obj.a << " "
        << obj.b << " " << obj.c << endl;

    return 0;
}

在这种情况下,值将被初始化为您设置的值。要实现同一目的,您还可以简单地提供自己的默认构造函数,

#include<iostream>
using namespace std;

class Class
{
public:
    Class() : a(1), b(2), c(3) { }
    int a, b, c;
};

int main()
{
    Class obj;

    cout<< obj.a << " "
        << obj.b << " " << obj.c << endl;

    return 0;
}

请注意,由于可能发生名称冲突,请避免使用using namespace std。请改用个别的using陈述式-像cout这样常用的陈述式。为了清楚起见,我对程序进行了一些更改。另外,您的问题的答案可以在各种C ++书中找到很好的解释,例如我使用的Lippman的Primer。