构造函数在向量中复制类时调用

ins*_*nce 4 c++ vector c++11

我有以下代码

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怎么样?

Sto*_*ica 8

原因是初始化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)