有没有一种方法可以调用init列表中的成员函数

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

本文关键字:列表 init 调用 函数 成员 方法 一种 有没有      更新时间:2023-10-16

有没有一种方法可以在没有数据模因上下文的情况下调用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列表语法是否总是必须为{data member name}(value)?

此外,我读到使用init list而不是构造函数的函数更可取,因为这样它就不会复制,但在这种情况下,这有关系吗?

有没有一种方法可以调用init列表中的成员函数?

是的。

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

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

此外,我读到使用init list而不是构造函数的函数更可取,因为这样它就不会复制,但在这种情况下,这有关系吗?

的确,在成员初始化列表中对成员进行复制初始化可以消除该副本,而在构造函数体中进行复制赋值则不能。这包括复制在成员初始化列表中调用的函数的返回值,但它不适用于函数内部完成的任何复制赋值。您误解了如何使用成员初始化列表来避免复制。


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