使用默认值初始化成员引用
Initialize member reference with default value
我有一个 class 和一个 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:
的静态数据成员
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};
为了保持classheader-only,也可以在静态成员函数中使用静态变量代替:
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;
}
};
请注意,无论哪种方式,用作默认参数的向量都必须具有静态存储持续时间,以便在构造函数完成后它仍然有效 运行。
我有一个 class 和一个 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:
的静态数据成员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};
为了保持classheader-only,也可以在静态成员函数中使用静态变量代替:
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;
}
};
请注意,无论哪种方式,用作默认参数的向量都必须具有静态存储持续时间,以便在构造函数完成后它仍然有效 运行。