类数据默认初始化

muk*_*mar 5 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;
}
Run Code Online (Sandbox Code Playgroud)

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

R S*_*hko 8

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

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

Base() : i(0), ch(0) {}
Run Code Online (Sandbox Code Playgroud)


GMa*_*ckG 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 ;
} ;
Run Code Online (Sandbox Code Playgroud)

现在,当Base构造a 时ich、 和 (未注释时)pub_data将被正确初始化为有意义的值。