Dan*_*son 0 c++ arrays initialization
当我运行试图初始化对象数组的代码,并且其中一个具有无效值时,它似乎不会调用构造函数,这将设置正确的默认值.下面的代码生成输出:
1
2
1528112104
Run Code Online (Sandbox Code Playgroud)
玩具代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
为什么不调用构造函数并将其设置为BeeBoop(3)的默认值?
如果我将初始化列表的顺序切换为,甚至更奇怪
...
BeeBoop boops[] =
{
BeeBoop(1),
BeeBoop(3),
BeeBoop(2)
)
...
Run Code Online (Sandbox Code Playgroud)
输出变为:
1
0
2
Run Code Online (Sandbox Code Playgroud)
所以它初始化为0,这也不是默认值.
您将名称x用作函数参数和成员变量(可能不是一个好主意!).因此你需要改变:
BeeBoop::BeeBoop (int x)
{
if(!setX(x))
x = MIN_X;
}
Run Code Online (Sandbox Code Playgroud)
至:
BeeBoop::BeeBoop (int x)
{
if(!setX(x))
this->x = MIN_X;
}
Run Code Online (Sandbox Code Playgroud)
否则你只是修改参数x而不是设置成员变量.(或者,您可以使用参数和成员变量的唯一名称来避免这种歧义.)
请注意,如果您使用适当的警告-Wshadow编译已启用()编译器可以指出您的错误:
main.cpp: In constructor 'BeeBoop::BeeBoop(int)':
main.cpp:30:24: warning: declaration of 'x' shadows a member of 'BeeBoop' [-Wshadow]
BeeBoop::BeeBoop (int x)
^
main.cpp:14:13: note: shadowed declaration is here
int x;
^
main.cpp: In member function 'bool BeeBoop::setX(int)':
main.cpp:36:25: warning: declaration of 'x' shadows a member of 'BeeBoop' [-Wshadow]
bool BeeBoop::setX(int x)
^
main.cpp:14:13: note: shadowed declaration is here
int x;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |