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

时间:2016-02-25 18:31:51

标签: c++ vector

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

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

例如,

private async void MainForm_Load(object sender, EventArgs e)
{    //Hide all buttons
    button1.Visible = false;
    button2.Visible = false;
    button3.Visible = false;


    await Task.Delay(500);

   //show buttons one by one
    button1.Visible = true;
    await Task.Delay(500);
    button2.Visible = true;
    await Task.Delay(500);
    button3.Visible = true;


}

由于

4 个答案:

答案 0 :(得分:8)

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

class ClassA
{
    const std::vector<int> m_Vec = {1,2,3};
};

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

class ClassA
{
public:
    ClassA(std::vector<int> const& vec) : m_Vec(vec) {}
private:
    const std::vector<int> m_Vec;
};

答案 1 :(得分:7)

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

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

ClassA::ClassA() : m_Vec(initializer, initializer + sizeof(initialize) / sizeof(int)) {}

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

ClassA::ClassA() : m_Vec{1, 2, 3, 4} {}

在就地:

std::vector<int> m_Vec{1, 2, 3, 4};

答案 2 :(得分:6)

  

我有一个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;
}
  

如何初始化它?

其他答案提供了一些初始化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;
}

成员函数示例

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

答案 3 :(得分:3)

像这样:

class ClassA {
    const std::vector<int> m_Vec {1,2,3};
};

或者这个:

class ClassA {
    ClassA () : m_Vec {1,2,3} {}
    const std::vector<int> m_Vec;
};
相关问题