类数据默认初始化

时间:2010-01-30 06:16:07

标签: c++ initialization

我有以下代码:

#include <iostream>
using namespace std;

class Base
{
private:
    int i;
    char ch;
public:
    void showdata()
    {
        cout<<"Int:"<<i<<endl;
        cout<<"Char:"<<ch<<endl;
    }
    //int pub_data ;
} ;

int main()
{
    Base ob;
    ob.showdata() ;
    //cout<<"Public Data:"<<ob.pub_data<<endl;
    return 0;
}

这个程序编译并运行正常。输出显示i初始化为0,ch初始化为'\ 0' 如果你注意到我在这个程序中注释了2个语句。首先是公共数据声明pub_data,然后是主要打印此公共数据的第二行 现在问题在于,如果我取消注释这两行,那么类的数据成员,即i,ch,pub_data似乎没有被初始化,并且在打印时,它们显示垃圾值。
所以我的问题是公共数据在这里有什么区别? 我正在使用g ++ 3.4.6

4 个答案:

答案 0 :(得分:8)

int和char都不会自动初始化为0.它发生的事实只是运气。

您需要添加一个执行初始化的构造函数:

Base() : i(0), ch(0) {}

答案 1 :(得分:2)

无。你刚刚变得“幸运”。基本类型仍然未初始化,因此您的ich,正如程序所代表的那样,很可能并非始终为0。

恰好添加公共成员“搞砸了”。要更正类,请在构造函数的初始化列表中初始化成员:

class Base
{
private:
    int i;
    char ch;
public:
    Base(void) :
    i(0), ch(0) //, pub_data(0)
    {}

    void showdata()
    {
        cout<<"Int:"<<i<<endl;
        cout<<"Char:"<<ch<<endl;
    }
    //int pub_data ;
} ;

现在,Base构建i时,ch和(当取消注释时)pub_data将正确初始化为有意义的值。

答案 2 :(得分:0)

与Java或C#相反,为新创建的对象分配的内存总是设置为零,这不会发生在C ++中。有几个规则描述了何时保证对象初始化以及何时不进行对象初始化。

考虑下面的例子:

class Base
{
private:
    int i;
    char ch;
    std::string str;
public:
    Base()
      : i(0) //built-in fields remains unitialized. We should initialize it manually
      , ch('\0') //another built-in field
      //, str() //this call is redundant due automatic default constructors calls for all user-defined types
    {}
    void showdata()
    {
        cout<<"Int:"<<i<<endl; //valid only after manual initialization
        cout<<"Char:"<<ch<<endl; //valid only after manual initialization
        cout<<"String:"<<str<<endl; //always valid 
    }
    //int pub_data ;
} ;

你应该记住,你应该在类构造函数中手动初始化所​​有buit-in字段。

P.S。事实上,在第一种情况下,你的代码是有效的 - 这是纯粹的意外。

答案 3 :(得分:-1)

已经回答的内容是正确的,但为了确保您的值为零初始化,您还可以简单地将对象声明为

Base ob();  // notice the parentheses here

Base ob{};  // this compiles only on c++11

有关详细信息,请查看以下有见地的答案: https://stackoverflow.com/a/620402/3073460