我如何编写自己的数组类而不需要 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/