ano*_*non 25 c++ vector default-constructor
如何编写自己的数组类,不需要为其元素提供默认构造函数?现在,当我执行new []来分配空间时,我需要一个默认的构造函数.
std :: vector没有.
他们如何做到这一点?
AnT*_*AnT 30
std::vector
不需要默认构造函数,因为它从不使用它.每次需要构造一个元素时,它都是通过使用复制构造函数来完成的,因为每次都有复制的东西:现有的vector元素或你自己提供的元素,用于通过方法的参数进行复制(显式或隐式,依赖在默认参数上)
您可以以完全相同的方式编写类似的类:每次需要在数组中构造新元素时,都需要用户提供复制元素.在这种情况下,构建该原始元素将成为用户的责任.
每当它看起来好像std::vector
"需要"你的默认构造函数时,它只是意味着你依赖某些vector
s方法的默认参数,即你试图默认构造一个元素,而不是向量.另外,向量本身永远不会尝试默认构造元素.
为了避免在内存分配期间的默认构造函数要求,标准库分配原始未初始化的内存块,然后立即复制构造该原始内存块中的新元素(这是不可行的new[]
).此功能在std::allocator
课堂上封装.您也可以std::allocator
在代码中使用,这意味着您也可以立即使用"魔法".
注意:以上内容适用于C++之前的C++语言规范版本.C++ 11改变了很多东西.而这些更改确实会创建std::vector
可以在内部使用默认构造函数的情况.
此外,值得注意的是,即使是最初的C++ 98规范也允许实现使用函数重载而不是默认参数来实现标准库接口.这意味着正式地可以在内部std::vector
使用默认构造函数的有效C++ 98实现.
Dan*_*Dan 11
std::vector
如果您以需要默认构造函数的方式使用它,则只需要元素具有默认构造函数.所以这段代码(从删除的答案中窃取)将无法编译,因为X
没有默认的ctor:
#include <vector>
struct X
{
X(int) {}
};
int main(void)
{
std::vector<X> x(1); // vector of length 1, second argument defaults to X() !!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但如果你这样写main
:
int main(void)
{
std::vector<X> x; // make empty vector
x.push_back(X(1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后它工作正常.
您可以分配一个字节块,然后在将新项目推送到向量的后面时,使用放置new
来T
通过复制构造函数(当然不是默认构造函数)创建(您的参数类型)的新实例.这将不允许进行"N默认初始化TS的载体"(其中的std ::向量可以-这就是为什么它确实需要吨至具有用于此目的的默认构造函数),但你能有这样的开始向量空的,可以把Ts推到他们身上.
归档时间: |
|
查看次数: |
15116 次 |
最近记录: |