我有以下代码
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?
答案 0 :(得分:8)
原因是初始化vector<base> vec = {b, b1};
创建了std::initializer_list<base>
并将其传递给适当的向量构造函数。然后继续复制它。
您可以通过直接初始化std::initializer_list<base>
的成员来限制副本数,而不是创建命名对象。像这样:
vector<base> vec = {{}, {2}};
首先通过reserve
向量中的内存完全消除多余的复制,然后emplace
将对象放入其中。
vector<base> vec;
vec.reserve(2);
vec.emplace_back();
vec.emplace_back(2);