-1

下面的代码永远不会打印出计数器,假设编译器做了一些智能的事情来将 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;
}
4

2 回答 2

3

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

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

将构造函数行更改为:

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

这显式地将值初始化为零,并且还清楚地传达了意图。请记住,代码是供人类阅读的。计算机永远不会真正看到您的 C++ 代码。

另请注意,以下是等效的:

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

虽然我个人不使用这种初始化方法。


初始化不是代码的唯一问题。一方面,您的代码中存在大量内存泄漏,因为您没有编辑delete的实例。去选择一本好的 C++ 入门书籍并学习正确的现代 C++,因为您的帖子表明您对语言基础知识并不十分了解。Anew

于 2012-06-25T09:26:16.887 回答
1

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

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

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

于 2012-06-25T09:25:20.413 回答