C ++ main()vs对象的本地函数初始化

时间:2015-01-17 16:19:23

标签: c++ function class object main

我正在阅读c ++对象模块内部,有一个关于默认构造函数的主题。如果我们在函数中初始化某个类的对象,如

CODE

class Test
{
   public:
   void show(){cout<<x<<endl;}
   int x;
};
void func()
{
  Test t;
  t.show();
}

输出

输出为0

但是在书中给出了全局对象零初始化和默认值 用于创建此对象的构造函数不会运行。我对此感到困惑。 是对象零在本地函数中初始化并在main ???

中的某个任意值

2 个答案:

答案 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;
    }
};