【发布时间】:2015-06-03 07:21:14
【问题描述】:
当我运行尝试初始化对象数组的代码时,其中一个对象的值无效,它似乎没有调用构造函数,它会设置适当的默认值。下面的代码产生输出:
1
2
1528112104
玩具代码:
#include <iostream>
using namespace std;
class BeeBoop
{
public:
static const int MIN_X = 1;
static const int MAX_X = 2;
BeeBoop(int x);
int getX() { return x; }
bool setX(int x);
private:
int x;
};
int main()
{
BeeBoop boops[] =
{
BeeBoop(1),
BeeBoop(2),
BeeBoop(3)
};
for (int i = 0; i < 3; i++)
cout << boops[i].getX() << endl;
}
BeeBoop::BeeBoop (int x)
{
if(!setX(x))
x = MIN_X;
}
bool BeeBoop::setX(int x)
{
if (x < MIN_X || x > MAX_X)
return false;
this->x = x;
return true;
}
为什么不调用构造函数并将其设置为 BeeBoop(3) 的默认值?
更奇怪的是,如果我将初始化列表的顺序切换为
...
BeeBoop boops[] =
{
BeeBoop(1),
BeeBoop(3),
BeeBoop(2)
)
...
输出变成:
1
0
2
所以它初始化为 0,这也不是默认值。
【问题讨论】:
-
第一个想法是你没有设置
this->x,而只是设置x,因此this->x永远不会被初始化。你能确认一下吗? -
我不确定,但如果 x 已设置,您的“检查”可能是错误的吗?
if(!setX(x))的行为因x的值而异,该值尚未初始化。所以从技术上讲,它可以有任何价值。如果你很幸运,它是0,在这种情况下你的代码可以工作,但不一定是这样。
标签: c++ arrays initialization