gpt4 book ai didi

c++ - 使用默认值初始化成员引用

转载 作者:行者123 更新时间:2023-11-30 01:36:57 25 4
gpt4 key购买 nike

我有一个带有 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){}

一切正常,因为临时 vector 在超出范围时不会被删除。但是,这感觉不对并且看起来内存泄漏。是否有更明智的方法来实现预期的行为?

最佳答案

您可以将默认参数定义为类的静态数据成员:

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

请注意,无论哪种方式,用作默认参数的 vector 都必须具有静态存储持续时间,以便在构造函数完成运行后它仍然有效。

关于c++ - 使用默认值初始化成员引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com