我正在阅读c ++对象模块内部,有一个关于默认构造函数的主题。如果我们在函数中初始化某个类的对象,如
CODE
class Test
{
public:
void show(){cout<<x<<endl;}
int x;
};
void func()
{
Test t;
t.show();
}
输出
输出为0
但是在书中给出了全局对象零初始化和默认值 用于创建此对象的构造函数不会运行。我对此感到困惑。 是对象零在本地函数中初始化并在main ???
中的某个任意值答案 0 :(得分:1)
如果未提供默认构造函数,则本地对象可能不会初始化为零,并且可能包含垃圾。
这在标准中定义:
部分 8.5 / 11 :如果没有为对象指定初始化程序,则 对象是默认初始化的;如果没有执行初始化,则 具有自动或动态存储持续时间的对象具有不确定性 值。
对于static和globals:
部分 3.6.2 / 2 :具有静态存储持续时间的变量(...) 在进行任何其他初始化之前,应将其初始化为 地方强>
如果您有默认构造函数,则在每种情况下都会调用它(除非您指定了初始化程序)。对于全局对象和本地对象都是如此。
建议: 您可以使用以下默认构造函数对此进行试验:
Test() {
cout << "Default ctor: old x:" << x << endl; // for curisosity
x = 0; // now x is 0 for sure
}
你会注意到,对于全局对象,旧的x总是0,而对于本地对象,旧的x可能是垃圾。
答案 1 :(得分:0)
您可以在类定义中使用defualt构造函数将x初始化为x = 0(或您希望的任何其他数字)。从那里你可以相应地操纵数据,或者只输入你想要在defualt构造函数中保存的值。
class Test
{
public:
void show(){cout<<x<<endl;}
int x;
//Defualt Constructor
test(){
x=0;
}
};