有没有办法在初始化列表中调用成员函数?

Is there a way to call a member function in init list?

有没有办法在没有数据成员上下文的情况下调用初始化列表中的函数?

例如:

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];
}

初始化列表语法是否总是必须是{数据成员名称}(值)?

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

Is there a way to call a member function in init list?

是的。

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

在成员初始化列表中更有意义的是调用一个函数,该函数 returns 一个将被复制到成员的值。但是,您不能 return 原始数组,因此除非您更改 keys.

的类型,否则这不是一个选择

Also, I read that it's preferable to use init list instead of the constructor's function because this way it doesn't make a copy, but in this case does it matter?

的确,在成员初始化列表中复制初始化一个成员允许省略副本,而在构造函数主体中复制分配则不允许。这包括复制在成员初始化列表中调用的函数的 return 值,但它不适用于函数内部完成的任何复制赋值。你误解了如何使用成员初始化列表来避免复制。


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