有没有办法在init列表中调用成员函数?

时间:2015-11-27 11:29:00

标签: c++ c++11 syntax constructor initialization

有没有办法在init列表中调用一个没有数据记录上下文的函数?

例如:

class x{
public:
    x(char ch): ..., foo() {} // doesn't work
...
    void foo(); //foo sets the keys in keys[], different keys for different ch
private:
    char keys[10];
}

而不是:

class x{
public:
    x(char ch): ...  {(ch == 'a') ? foo("asdfg..."): foo("qwert..") ;}
...
    void foo(); 
private:
    char keys[10];
}

init list语法总是必须是{data member name}(value)?

另外,我读到最好使用init列表而不是构造函数,因为这样它不会复制,但在这种情况下它是否重要?

1 个答案:

答案 0 :(得分:4)

  

有没有办法在init列表中调用成员函数?

但是成员初始化列表中的表达式结果必须始终分配给成员变量,因此在成员初始化列表中调用void函数将需要一些hackery。它可能但毫无意义,因为调用可以在构造函数体中完成。

在成员初始化列表中更有意义的是调用一个返回将被复制到成员的值的函数。你不能返回原始数组,所以除非你改变keys的类型,否则这不是一个选择。

  

另外,我读到最好使用init list而不是构造函数的函数,因为这样它不会复制,但在这种情况下它是否重要?

确实,在成员初始化列表中复制初始化成员允许复制,而构造函数体中的复制分配则不会。这包括复制在成员初始化列表中调用的函数的返回值,但它不适用于在函数内部完成的任何复制赋值。您误解了使用成员初始化列表如何避免复制。

现在,默认初始化和复制数组10个字符并不是很多工作。但是,您可以通过使用聚合初始化来最小化复制量。为此,x必须是一个聚合。自c ++ 11以来,已有一个聚合包装标准库中的数组:std::array。我建议您使用它而不是x。您可以编写一个函数,根据参数返回所需的数组。