我知道 STL 容器,比如vector
添加对象时复制该对象。push_back
方法如下:
void push_back ( const T& x );
我很惊讶地发现它把该项目作为参考。我编写了一个示例程序来看看它是如何工作的。
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);
这会复制对象,我可以看到它正在调用复制构造函数.
我的问题是,当push_back
以item为参考,它是如何调用复制构造函数的?或者我在这里遗漏了什么?
有什么想法吗..?
它可能使用“放置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);
}
注意T
必须有一个复制构造函数才能工作。默认情况下(如果您什么都不做),它会免费获得一个。如果明确定义它,则必须是public
for vector<T>
上班。
GNU 的 libstdc++ 是这样做的 http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01011_source.html#l00721,但我怀疑这是否会很有启发。有一个分配器(第二个模板参数vector
)这使得它变得不那么简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)