Nav*_*K N 11 c++ constructor stl
我知道STL容器就像vector在添加对象时复制对象一样.push_back方法看起来像:
void push_back ( const T& x );
Run Code Online (Sandbox Code Playgroud)
我很惊讶地看到它将该项目作为参考.我写了一个示例程序,看它是如何工作的.
struct Foo
{
Foo()
{
std::cout << "Inside Foo constructor" << std::endl;
}
Foo(const Foo& f)
{
std::cout << "inside copy constructor" << std::endl;
}
};
Foo f;
std::vector<Foo> foos;
foos.push_back(f);
Run Code Online (Sandbox Code Playgroud)
这复制了对象,我可以看到它正在调用copy-constructor.
我的问题是,当push_back把item作为参考时,它是如何调用copy-constructor的?或者我在这里遗漏了什么?
有什么想法吗..?
Tho*_*mas 12
它可能使用"placement new"在其内部数组中就地构造对象.放置new不分配任何内存; 它只是将对象放在您指定的位置,并调用构造函数.语法是new (address) Class(constructor_arguments).
T::T(T const &)调用复制构造函数以就地创建副本.像这样(简化):
template<T>
void vector<T>::push_back(T const &item) {
// resize if necessary
new (&d_array[d_size++]) T(item);
}
Run Code Online (Sandbox Code Playgroud)
请注意,T必须有一个复制构造函数才能使用.默认情况下(如果你什么都不做),它会免费获得一个.如果你明确地定义它,它必须是public为vector<T>工作.
这是GNU的libstdc ++如何做到这一点,但我怀疑它会非常具有启发性.有一个分配器(第二个模板参数vector)使它不那么简单.
| 归档时间: |
|
| 查看次数: |
8309 次 |
| 最近记录: |