GCC默认的int数据成员初始化

时间:2012-06-25 09:20:35

标签: c++

以下代码永远不会打印出计数器,假设编译器做了一些聪明的事情来将int数据成员类型初始化为零?

include <iostream>

using namespace std;

class A {
  public:
    int a;
    int b;

    A(): b(a), a(b) { }
};

int main()
{
    A* p = new A;
    int counter = 0;

    while (!(p->a)) {
        p = new A;
        counter++;
    }

    cout << counter << endl;
}

2 个答案:

答案 0 :(得分:3)

  

假设编译器,以下代码永远不会打印出计数器   做一些智能的东西来初始化int数据成员类型   为零?

假设是错误的。未初始化变量的值是不确定的。它可能是一些随机数,恰好存在于内存中。

将构造函数行更改为:

A(): b(0), a(0) { } 

这显式地将值初始化为零,并且还清楚地传达意图。请记住,代码可供人类阅读。计算机实际上从未看到过您的C ++代码。

另请注意,以下内容相同:

A(): b(), a() { } 

虽然我不亲自使用这种初始化方法。


初始化不是代码的唯一问题。例如,代码中存在大量内存泄漏,因为delete A new {{1}}的实例没有{{1}}。 Go pick up a good introductory C++ book并学习适当的现代C ++,因为你的帖子证明你并不完全掌握语言基础知识。

答案 1 :(得分:1)

这是未定义的行为。 a是第一个被初始化的,它被初始化为b,这是一个未初始化的变量。如果您想要值初始化(或0):

A(): b(), a() { }

请注意,初始化顺序是成员在类定义中出现的顺序,而不是成员初始化列表中的顺序。