c++ - 为什么 std::vector 的元素不需要默认构造函数?

标签 c++ vector default-constructor

我如何编写自己的数组类而不需要 its 元素的默认构造函数?现在,当我执行 new [] 分配空间时,我需要一个默认构造函数。

std::vector 没有。

他们是如何做到这一点的?

最佳答案

std::vector 不需要默认构造函数,因为它从不使用它。每次它需要构造一个元素时,它都使用复制构造函数来完成,因为每次它都有一些东西要复制:现有的 vector 元素或你自己通过方法的参数提供的用于复制的元素(显式或隐式,通过依赖 默认参数)

您可以用完全相同的方式编写这样的类:每次您需要在数组中构造一个新元素时,都要求用户提供一个用于复制的元素。在这种情况下,构建原始元素成为用户的责任。

每次它看起来好像 std::vector “需要”你的默认构造函数,它只是意味着你在某个地方依赖于某些 vector 的默认参数code> 的方法,即 you 试图默认构造一个元素,而不是 vector 。同样, vector 本身永远不会尝试默认构造元素。

为了避免内存分配过程中的默认构造函数要求,标准库分配 raw uninitialized 内存块,然后立即在该原始内存块中复制构造新元素(这是 new [] 做不到)。此功能封装在 std::allocator 类中。您也可以在代码中使用 std::allocator,这意味着您也可以立即使用“魔法”。

注意:以上适用于 C++11 之前版本的 C++ 语言规范。 C++11 改变了很多东西。这些变化确实创造了 std::vector 可以在内部使用默认构造函数的情况。

另外值得注意的是,即使是最初的 C++98 规范也允许实现使用函数重载而不是默认参数来实现标准库接口(interface).这意味着形式上可以有一个有效的 C++98 实现 std::vector 使用默认构造函数内部

关于c++ - 为什么 std::vector 的元素不需要默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2376989/

相关文章:

c++ - opencv格式字符串

c++ - 在 C++ 中使用指针 vector 时会泄漏内存吗?

c++ - 为什么即使在调用参数化构造函数时也会调用默认构造函数?

c++ - 如何仅在定义的时间获取事件?

c++ - Boost.Bind 返回类型

c++ - 用 cin 检测输入结束

c++ - 删除引用调用 vector 的重复项

c++ - 是否可以从数组初始化字符串 vector ?如果是这样,如何?

c++ - 在不调用默认构造函数的情况下声明对象

c# - : base()代码是什么