Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用以下语句调用复制构造函数:myVector.push_back(A());_C++ - Fatal编程技术网

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.