在C++中初始化对象数组时出错

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,这也不是默认值.

Pau*_*l R 5

您将名称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)

  • 就是这样.太愚蠢了. (2认同)