c++ - 什么时候在cpp中调用复制构造函数?

标签 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;
}

你好,我是 cpp 的新手。我试图在我的类(class)狗中使用复制构造函数。我将三只狗插入 vector 中,使用 push_back 三次。所以我希望复制构造函数被调用三次。但是,执行代码后,发现调用了6次copy constructor,结果如下:

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

我很困惑为什么这条狗被复制了这么多次。我只执行了 3 次 push_back。 谢谢。

感谢您指出类似的问题: why the copy-constructor is called twice when doing a vector.push_back

在这篇文章中,作者只 push_back 一个对象,但复制构造函数被调用了两次。但是,就我而言,当我调用 push_back 一次时,复制构造函数只被调用一次。我已经明白我的问题出在哪里了,谢谢大家的帮助。

最佳答案

vector 需要一些地方来放置你的狗,因此它会为它们分配内存。但它不能分配无限内存。当你添加更多的狗时,vector 需要分配更大的内存块,并且每次它都必须将你的狗重新安置到它们的新家。按照当前设计的方式,唯一的方法是复制它们,然后让原件休眠。

如果您一开始就为所有的狗预留了足够的空间(如下所示),那么这就没有必要了,您的狗本可以继续四处奔波,成为一个真正的讨厌鬼,没有不断搬家的干扰。

doglist.reserve(3);

关于c++ - 什么时候在cpp中调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38170026/

相关文章:

c++ - 与 const 相反 - 换句话说,一个 writeonly 限定符?

c++ - 与 const 成员成对的 vector

java - 为什么ArrayList没有capacity()方法,却有ensureCapacity(int),而Vector、StringBuffer、StringBuilder两者都有?

javascript - JDK 8 Nashorn Javascript 引擎限制

c++ - vector C++ 中的非重复随机数

javascript - iOS Mobile Safari Service Worker 缓存限制

c++ - C++中的链接列表错误

c++ - 通过引用传入的值的 constexpr

c++ - 即使安装了CppUnit,也无法通过 “TestFactoryRegistry.h: No such file or directory”在MinGW上构建zxing

c++ - 插入 vector C++