何时在cpp中调用复制构造函数?

Cas*_*let 4 c++ vector capacity

#include<iostream>
#include<vector>
#include<list>
#include<queue>
#include<map>
using namespace std;
class dog{
    public:
        string name;
        dog();
        dog(const dog & d);
        void barkname(){
            cout<<"bark "<<name<<endl;
        }
        virtual ~dog(){
            //cout<<"delete dog "<<name<<endl;
        }
};

dog::dog(){
    cout<<"blank dog"<<endl;
    this->name="blank";
}

dog::dog(const dog &d){
    cout<<"copy dog"<< " "+d.name<<endl;
    string temp=d.name;
    this->name=temp+" copied";
}


int main(){
    dog d;
    d.name="d";
    dog dd;
    dd.name="dd";
    dog ddd;
    ddd.name="ddd";
    vector<dog> doglist;
    doglist.push_back(d);
    doglist.push_back(dd);
    doglist.push_back(ddd);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你好,我是cpp的新手.我试图在我的班级狗中使用复制构造函数.我使用push_back三次将三只狗推入载体.所以我期望复制构造函数被调用三次.但是,执行代码后,我发现复制构造函数被调用了六次,结果如下:

blank dog
blank dog
blank dog
copy dog d
copy dog dd
copy dog d copied
copy dog ddd
copy dog d copied copied
copy dog dd copied
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么狗被复制了很多次.我只执行了三次push_back.谢谢.

感谢您指出一个类似的问题: 为什么在执行vector.push_back时调用copy-constructor两次

在这篇文章中,作者只有push_back一个对象,但复制构造函数被调用了两次.但是,在我的情况下,当我调用push_back一次时,复制构造函数只被调用一次.我已经明白我的问题所在,谢谢大家的帮助.

Lig*_*ica 17

向量需要一些地方来放置你的狗,所以它为它们分配内存.但它不能分配无限的内存.当您添加更多狗时,矢量需要分配更大的内存块,每次执行此操作时,它必须将您的狗重新安置到新家.与你目前设计的课程一样,唯一的方法是复制它们,然后将原件放入睡眠状态.

如果你首先为所有的狗保留了足够的空间(如下图所示),那么这就没有必要了,你的狗可能已经开始做正确的麻烦,没有分心不断搬家.

doglist.reserve(3);
Run Code Online (Sandbox Code Playgroud)

  • 哈哈:"它必须将你的狗搬到他们的新家":) (4认同)
  • @PaulStelian:不是每次都 - [增长率不同但通常是几何](http://stackoverflow.com/q/5404489/560648).是的元素将尽可能移动. (3认同)