class 成员变量的隐式默认值?
implicit default value for class member variable?
我正在为我的认证考试做 C++ 测试,我遇到了这个我不明白的练习:
(问题是下面程序的输出是什么)
#include <iostream>
using namespace std;
class A {
public :
float v;
float set(float v) {
A::v += 1.0;
A::v = v+1.0;
return v;
}
float get(float v){
v +=A::v;
return v;
}
};
int main()
{
A a;
cout<< a.get(a.set(a.set(0.5)));
return 0;
}
我预计 set 函数的第一行会出错,因为 A::v 从未初始化,但我的程序编译后似乎 A::v 默认值为 0..
有人可以解释一下为什么没有编译错误吗?
就像你提到的,set
的第一行使用了A::v
,之前从未初始化过。但是,这本身不会产生错误,它是未定义的行为。这意味着编译器可能会为您初始化它,或者它可能只是选择它在内存中看到的随机数,或者他们喜欢的任何东西。 C++ 标准没有说明需要发生什么,所以它让编译器决定容易的事情。
但是,在大多数情况下,该行发生的任何事情在您的代码中都不会太重要。原因是 A::v
将在下一行重新分配给 v + 1
。所以它应该几乎总是在最后打印 2。
我正在为我的认证考试做 C++ 测试,我遇到了这个我不明白的练习: (问题是下面程序的输出是什么)
#include <iostream>
using namespace std;
class A {
public :
float v;
float set(float v) {
A::v += 1.0;
A::v = v+1.0;
return v;
}
float get(float v){
v +=A::v;
return v;
}
};
int main()
{
A a;
cout<< a.get(a.set(a.set(0.5)));
return 0;
}
我预计 set 函数的第一行会出错,因为 A::v 从未初始化,但我的程序编译后似乎 A::v 默认值为 0.. 有人可以解释一下为什么没有编译错误吗?
就像你提到的,set
的第一行使用了A::v
,之前从未初始化过。但是,这本身不会产生错误,它是未定义的行为。这意味着编译器可能会为您初始化它,或者它可能只是选择它在内存中看到的随机数,或者他们喜欢的任何东西。 C++ 标准没有说明需要发生什么,所以它让编译器决定容易的事情。
但是,在大多数情况下,该行发生的任何事情在您的代码中都不会太重要。原因是 A::v
将在下一行重新分配给 v + 1
。所以它应该几乎总是在最后打印 2。