以下代码永远不会打印出计数器,假设编译器做了一些聪明的事情来将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;
}
答案 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() { }
请注意,初始化顺序是成员在类定义中出现的顺序,而不是成员初始化列表中的顺序。