如何初始化类C++的成员const向量

rud*_*tin 6 c++ vector

我有一个const向量作为类中的成员.我该如何初始化它?

我知道对于常量成员,我们初始化它们的唯一方法是通过类的构造函数的列表初始化.但究竟如何用矢量来做,我不知道.

例如,

class ClassA
{

const std::vector<int> m_Vec;


};
Run Code Online (Sandbox Code Playgroud)

谢谢

Cor*_*mer 10

您可以在类声明中初始化向量

class ClassA
{
    const std::vector<int> m_Vec = {1,2,3};
};
Run Code Online (Sandbox Code Playgroud)

或者在使用成员初始化的构造函数中

class ClassA
{
public:
    ClassA(std::vector<int> const& vec) : m_Vec(vec) {}
private:
    const std::vector<int> m_Vec;
};
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是C ++ 11。我知道即使在2016年。 (2认同)

Ser*_*eyA 7

在c ++ 03中,你通过它的构造函数初始化vector,这很尴尬,因为你必须将它复制到其他地方.例如:

static int initializer[] = {1, 2, 3};

ClassA::ClassA() : m_Vec(initializer, initializer + sizeof(initialize) / sizeof(int)) {}
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,这一切都消失了.在构造函数中:

ClassA::ClassA() : m_Vec{1, 2, 3, 4} {}
Run Code Online (Sandbox Code Playgroud)

到位:

std::vector<int> m_Vec{1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)

  • @πάνταῥεῖ,是的,是不是很晦涩难懂? (2认同)

Jam*_*son 7

我有一个const向量作为类中的成员.

首先,我通常会说你想避免它以防止以预期的方式使用类(参见下面的例子).此外,如果数据成员完全封装在类中,那么在使用类接口来保证它以const方式处理时,没有理由它不能成为非const数据成员(即,类的实例化无法修改数据成员).

不好的例子

class ClassA
{
    const std::vector<int> m_Vec;
};

int main()
{
    ClassA c1;
    ClassA c2;
    // ...
    c1 = c2; // This doesn't compile!

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我该如何初始化它?

其他答案提供了一些初始化const数据成员的不同方法,但这里是我在其他答案中没有看到的方法:使用函数.我认为使用函数的一个优点可能是初始化很复杂并且可能依赖于运行时输入(例如,您可以更新init函数以采用外部状态来修改std::vector初始化的方式).

自由功能示例

#include <vector>

namespace
{
    std::vector<int> init()
    {
        std::vector<int> result;

        // ... do initialization stuff ...

        return result;
    }
}

class ClassA
{
public:
    ClassA() : m_Vec(init()) {}

private:    
    const std::vector<int> m_Vec;
};

int main()
{
    ClassA c1;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

成员函数示例

#include <vector>

class ClassA
{
public:
    ClassA() : m_Vec(init()) {}

private:
    std::vector<int> init()
    {
        std::vector<int> result;

        // ... do initialization stuff ...

        return result;
    }

    const std::vector<int> m_Vec;
};

int main()
{
    ClassA c1;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我会将成员 `init` 设为静态,以避免在实际初始化之前访问其他成员的错误 (2认同)

H. *_*ijt 3

像这样:

class ClassA {
    const std::vector<int> m_Vec {1,2,3};
};
Run Code Online (Sandbox Code Playgroud)

或这个:

class ClassA {
    ClassA () : m_Vec {1,2,3} {}
    const std::vector<int> m_Vec;
};
Run Code Online (Sandbox Code Playgroud)