C++ 为什么使用以下语句调用复制构造函数:myVector.push_back(A());
为什么使用此语句调用复制构造函数?C++ 为什么使用以下语句调用复制构造函数:myVector.push_back(A());,c++,C++,为什么使用此语句调用复制构造函数? vec.push_back(A()) 在这里,我们所做的就是使用A()调用构造函数,然后对象将被存储在vector中。这是因为当您想向vector类添加一些内容,而它的内存中没有足够的空间时,它需要将其所有内容复制到内存中的新空间。因此,当您将对象复制到新的内存位置时,将调用复制构造函数。如果你想知道如何优化它,请查看此视频。 视频的快速摘要 如果你想优化它,你可以使用emplace_back,它将在向量实际添加到向量之前为向量分配内存。在这里,首先创建对象
vec.push_back(A())代码>
在这里,我们所做的就是使用A()
调用构造函数,然后对象将被存储在vector中。这是因为当您想向vector类添加一些内容,而它的内存中没有足够的空间时,它需要将其所有内容复制到内存中的新空间。因此,当您将对象复制到新的内存位置时,将调用复制构造函数。如果你想知道如何优化它,请查看此视频。
视频的快速摘要
如果你想优化它,你可以使用emplace_back,它将在向量实际添加到向量之前为向量分配内存。在这里,首先创建对象,然后将其添加到向量中
…然后对象将存储在向量中
这正是调用复制构造函数的地方。由于向量将其所有值存储在连续数组中,并且a()
对象肯定不在该数组中,因此必须将其复制或移动到其位置
这也正是STL容器提供emplace\uuu
函数的原因,这些函数采用构造函数参数,只在容器中的最后一个位置创建实际对象,从而避免了任何移动/复制的需要。除了其他答案之外,您想像
#include<iostream>
#include<vector>
struct Ex
{
Ex()
{
std::cout<<"Default"<<std::endl;
}
Ex(const Ex &obj)
{
std::cout<<"Copy"<<std::endl;
}
Ex(Ex &&obj)
{
std::cout<<"Move"<<std::endl;
}
};
int main()
{
std::vector<Ex> vec;
std::cout<<"Pushing"<<std::endl;
vec.push_back(Ex());
}
确保您使用的是c++11
一些参考资料:
(一)
2) 临时对象在声明语句末尾被销毁
A(); // will be destroyed at semicolon;
您需要在销毁之前获取对象,这是复制构造函数发生的时候
A obj = A(); // A object created and copied into obj before gets destroyed.
同样的事情也发生在向量push_back
,临时创建并复制到向量
缓冲区以供以后使用,在使用复制构造函数销毁之前。`在这里,您首先创建对象,然后将其添加到向量。`仍将调用复制构造函数?当向量有足够的空间时(例如,使用了reserve
时),也将调用复制构造函数<代码>向后推
将始终创建传递对象的副本。除了hat copy,如果必须调整向量的大小,它可能还需要执行其他移动或复制。
Pushing
Default
Move
A(); // will be destroyed at semicolon;
A obj = A(); // A object created and copied into obj before gets destroyed.