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

时间:2016-12-15 09:21:36

标签: c++ c++11 vector

我有以下代码

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?

1 个答案:

答案 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);