我有以下代码
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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么4个调用复制构造函数,我理解在复制容器中的对象时的2个调用.4怎么样?
原因是初始化vector<base> vec = {b, b1};创建了一个std::initializer_list<base>并将其传递给适当的向量构造函数.然后进一步复制它.
您可以通过直接初始化成员来限制副本数std::initializer_list<base>,而不是创建命名对象.像这样的东西:
vector<base> vec = {{}, {2}};
Run Code Online (Sandbox Code Playgroud)
或者reserve首先通过向量中的内存完全消除多余的复制,然后emplace将对象放入其中.
vector<base> vec;
vec.reserve(2);
vec.emplace_back();
vec.emplace_back(2);
Run Code Online (Sandbox Code Playgroud)