0

有人能解释我这个代码是怎么回事。Visual Studio 2013 C++类属性初始化问题

class Point 
{ 
private: 

    int x; 
    int y; 

public: 
    Point(){} 
    void print(){ 
     cout << x << " " << y << endl; 
    } 
}; 

int main() 
{ 
    Point p; 
    p.print(); 

    return 0; 
} 

如果我运行此代码输出是-858993460 -858993460女巫是正常的我。这是垃圾,因为我没有初始化我的2个属性。

下面是奇怪的事情......

class Point 
{ 
private: 

    int x; 
    int y; 
    int* buf; 
public: 
    Point(){} 
    void print(){ 
     cout << x << " " << y << " " << buf << endl; 
    } 
}; 

int main() 
{ 
    Point p; 
    p.print(); 

    return 0; 
} 

现在,我把INT * BUF作为一类新的成员,当我运行此代码,我的所有属性都初始化为零。输出是0 0 00000000.我使用visual studio 2013,我不认为这种行为发生在Visual Studio 2010中。

有人可以解释背后的逻辑吗?

回答

1

你的类成员从未初始化为零,你需要的,如果他们是零在你的第二个例子自己做在你的构造

class Point 
{ 
private: 

    int x; 
    int y; 

public: 
    Point():x(0), y(0) {} 
    void print(){ 
     cout << x << " " << y << endl; 
    } 
}; 

,那么它是纯粹的巧合

+0

的问题是HTTP的副本:/ /stackoverflow.com/questions/3127454/how-do-c-class-members-get-initialized-if-i-dont-do-it-explyly – 2014-10-10 14:14:50

+0

我知道构造函数在那里初始化类成员。我不认为这是巧合。我很确定这个奇怪的行为有一个解释。 – Joel 2014-10-10 16:09:16

+0

C++规范声明它们将保持不确定的值。所以无论如何,这是不好的编程风格不适当初始化。 – 2014-10-11 09:02:28

0

当你打印这些intint*您正在打印分配之前存储在内存中的垃圾数据。请注意,您正在打印buf所保存的地址,而不是指向它的值。打印*buf可能会给你一个段错误。

-858993460二进制是:11001100110011001100110011001100

这可能是因为这是在Visual Studio 2010的默认存储位置的调试器,以提醒你,你正在阅读的坏数据。

至于2010和2013之间的差异,它可能是你不再在调试运行,或在2013年您的默认调试块写入只是0