有没有一种方法可以调用init列表中的成员函数
Is there a way to call a member function in init list?
有没有一种方法可以在没有数据模因上下文的情况下调用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
。您可以编写一个函数,根据参数返回所需的数组。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 为什么基于范围类型的大括号上循环init列表是非法的c++
- 私有变量的读取晚于成员init列表
- 为什么只有一个元素的支撑init列表的类型会切换到元素本身的类型
- 使用支撑的init列表在向量中插入新元素
- 为什么支持的init列表在函数调用和构造函数调用中表现不同
- 调用带有支撑init列表的显式构造函数:是否不明确
- 有没有一种方法可以调用init列表中的成员函数
- 当返回一个用带括号的init列表初始化的对象时,我保证有一对构造函数和析构函数调用吗?
- 它是如何解析的:用带括号的init列表构造未命名的临时对象
- 实验make_array,我可以使用大括号init列表作为参数
- 空的大括号init列表会发出关于缺少字段初始值设定项的警告