gpt4 book ai didi

c++ - 在 vector 中复制类时调用构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:08 25 4
gpt4 key购买 nike

我有以下代码

class base
{
private:
int k;
public:
base(const base& b){ this->k = b.k; cout<<" c-ctor "<<endl; }
base(int a = 10){ k = a; cout<<" a = "<<a<<endl; }
friend const ostream& operator<<(ostream& out, base& b)
{
return out<<b.k<<endl;
}
};

int main()
{
base b, b1(2);
vector<base> vec = {b, b1};
cout<<" check point "<<endl;
for(auto& elem : vec)
cout<<" "<<elem;
cout<<endl;
return 0;
}

输出:

1-      a = 10                                                                                                                                                                                                       
2- a = 2
3- c-ctor
4- c-ctor
5- c-ctor
6- c-ctor
7- check point
8- 10
9- 2

谁能解释一下为什么 4 次调用复制构造函数,我理解在容器中复制对象时有 2 次调用。怎么4?

最佳答案

原因是初始化 vector<base> vec = {b, b1};创建一个 std::initializer_list<base>并将其传递给适当的 vector 构造函数。然后继续进一步复制它。

可以通过直接初始化std::initializer_list<base>的成员来限制拷贝数,而不是创建命名对象。像这样:

vector<base> vec = {{}, {2}};

或者通过reserve完全消除多余的复制首先在 vector 中存储内存,然后是 emplace将对象放入其中。

vector<base> vec;
vec.reserve(2);
vec.emplace_back();
vec.emplace_back(2);

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com