【问题标题】:Correct way to initialize vector member variable初始化向量成员变量的正确方法
【发布时间】:2021-01-21 21:50:14
【问题描述】:
// Method One
class ClassName
{
public:
    ClassName() : m_vecInts() {}

private:
    std::vector<int> m_vecInts;
}

// Method Two
class ClassName
{
public:
    ClassName() {} // do nothing

private:
    std::vector<int> m_vecInts;
}

问题> 初始化类的vector成员变量的正确方法是什么? 我们必须初始化它吗?

【问题讨论】:

  • 不,除非你想指定一个初始容量(或者初始化它的内容,你可以使用 C++11 中的初始化列表或 boost 的 list_of认为 )。
  • 使用默认构造函数构造两种方式的向量,但首选第一种方式
  • 如果你在初始化列表中根本没有提到它,默认的构造函数将被调用。否则,调用合适的构造函数(例如,也许你希望它有 100 个默认构造元素)。

标签: c++


【解决方案1】:

http://en.cppreference.com/w/cpp/language/default_initialization

默认初始化在三种情况下进行:

  1. 当一个具有自动存储持续时间的变量声明为没有初始化器时
  2. 当具有动态存储持续时间的对象由不带初始化程序的 new 表达式创建时
  3. 当基类或构造函数初始值设定项列表中未提及该构造函数并且调用该构造函数时

默认初始化的效果是:

  • 如果 T 是类类型,则调用默认构造函数为新对象提供初始值
  • 如果 T 是数组类型,则数组的每个元素都是默认初始化的。
  • 否则,什么都不做。

由于std::vector 是一个类类型,它的默认构造函数被调用。所以不需要手动初始化。

【讨论】:

  • class T2 { int mem; public: T2() {} // "mem" not in initializer list };const T2 t2; // ok, calls the user-provided default ctor // t2.mem is default-initialized 让我大吃一惊
  • 我刚刚在VS2010中测试了上面的代码,它是错误的。 t2.mem 不是默认初始化的!
  • @q0987: memint,它既不是类也不是数组类型,因此不会被默认初始化。 cppreference 上提供的代码几乎总是在 C++11 标准下进行验证,但我不知道这是否会改变给定情况的任何内容(给定 const 限定符)。但是,即使示例不一致甚至可能是错误的,但解释和标准本身却不是。
【解决方案2】:

这取决于。如果你想要一个大小为 0 的向量,那么你不需要做任何事情。如果你想要一个大小为 42 的 N 向量填充,那么使用构造函数初始化列表:

ClassName() : m_vecInts(N, 42) {}

【讨论】:

    【解决方案3】:

    从C++11开始,你也可以在类声明中直接使用非静态成员的list-initialization

    class ClassName
    {
    public:
        ClassName() {}
    
    private:
        std::vector<int> m_vecInts {1, 2, 3}; // or = {1, 2, 3}
    }
    

    【讨论】:

    • 当向量的大小非常大时,是否有替代语法可以提供帮助,比如当我想要一个包含 40 个元素的向量时,全部初始化为 100?
    【解决方案4】:

    您不必显式初始化它,它会在您创建类的实例时创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      相关资源
      最近更新 更多