下面的代码永远不会打印出计数器,假设编译器执行一些智能操作将 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() { }
虽然我个人不使用这种初始化方法。
初始化并不是代码的唯一问题。首先,代码中有巨大的内存泄漏,因为您没有delete
您new
编辑的A
实例。去拿一本好的入门C++书,学习适当的现代C++,因为你的帖子表明你还没有完全掌握语言基础知识。
这是未定义的行为。 a
是第一个被初始化的,它被初始化为 b
,这是一个未初始化的变量。如果要初始化值(或0
):
A(): b(), a() { }
请注意,初始化顺序是成员在类定义中出现的顺序,而不是成员初始化列表中的顺序。