我有以下代码:
#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
答案 0 :(得分:8)
int和char都不会自动初始化为0.它发生的事实只是运气。
您需要添加一个执行初始化的构造函数:
Base() : i(0), ch(0) {}
答案 1 :(得分:2)
无。你刚刚变得“幸运”。基本类型仍然未初始化,因此您的i
和ch
,正如程序所代表的那样,很可能并非始终为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