GCC 默认 int 数据成员初始化



下面的代码永远不会打印出计数器,假设编译器执行一些智能操作将 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;
}

以下代码永远不会打印出计数器,假设编译器 执行一些智能操作来初始化 int 数据成员类型以 零?

这个假设是错误的。未初始化变量的值是不确定的。它可能是碰巧在内存中的某个随机数。

将构造函数行更改为:

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

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

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

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

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


初始化并不是代码的唯一问题。首先,代码中有巨大的内存泄漏,因为您没有deletenew编辑的A实例。去拿一本好的入门C++书,学习适当的现代C++,因为你的帖子表明你还没有完全掌握语言基础知识。

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

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

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

最新更新