使用默认值初始化成员引用
Initialize member reference with default value
我有一个带有std::vector const&
成员的类,它应该通过构造函数设置。但是,也应该可以在构造函数中省略此参数,并允许使用默认值初始化成员。
示例代码:
class MyClass {
public:
MyClass(int a, const std::vector<int> &v = {42,42,42}) : vec(v){}
const std::vector<int> &vec;
};
int main(void) {
std::vector<int> a{1,2,3};
MyClass c1(1,a); // c1.vec = 1,2,3
MyClass c2(1); // c2.vec = randomStuff
// should actually be 42,42,42
}
如果我将初始化更改为:
MyClass(int a, const std::vector<int> &v = *(new std::vector<int>{42,42,42})) : vec(v){}
一切正常,因为临时向量在超出范围时不会被删除。但是,这感觉不对,看起来内存泄漏。有没有更明智的方法来实现预期的行为?
可以将默认参数定义为类的静态数据成员:
class MyClass {
public:
MyClass(int a, const std::vector<int> &v = defaultVec) : vec(v){}
const std::vector<int> &vec;
private:
static const std::vector<int> defaultVec;
};
const std::vector<int> MyClass:defaultVec{42, 42, 42};
若要仅保留类标头,还可以改用静态成员函数中的静态变量:
class MyClass {
public:
MyClass(int a, const std::vector<int> &v = defaultVec()) : vec(v){}
const std::vector<int> &vec;
private:
static const std::vector<int>& defaultVec()
{
static const std::vector<int> v {42, 42, 42};
return v;
}
};
请注意,无论哪种方式,用作默认参数的向量都必须具有静态存储持续时间,以便在构造函数完成运行后保持有效。
相关文章:
- 非静态成员引用必须相对于特定对象
- 在C++中,如果成员引用在其声明中初始化,为什么需要存储空间?
- 成员引用基类型 'char' 不是 C++ 中的结构或联合
- 成员引用基类型不是结构或联合
- for 循环说 - 错误 成员引用基类型"int [13]"不是结构或联合
- 成员引用基类型 'double [10]' 不是结构或联合
- 使用默认值初始化成员引用
- 错误:成员引用基类型"uint32_t"(也称为"无符号 INT")不是结构或联合
- 无法用2D矢量成员引用对象
- 是否可以在同一对象中对成员 std::shared_ptr 进行成员引用<variable>?
- 是否有一种方法可以将C 类成员引用到向量而不明确添加它们
- C++:成员引用还是指针
- C++非静态成员引用
- C++ 成员引用基类型'int'不是结构或联合
- 将成员引用变量置于成员指针变量之上的原因
- C++非静态成员引用必须相对于特定对象
- 无法理解错误 msg:"非静态成员引用必须相对于特定对象"
- 返回类成员引用变量会导致运行时错误
- 可以安全地将移动的对象存储在成员引用中
- 成员引用基类型'double'不是结构或联合