2

我正在尝试了解 C++ STL 中的向量...

我有一堂课temp

class temp
{
private :
    int a;
public :
    //temp() {}
    temp(int a)
    {
        std::cout<<"ctor called"<<std::endl;
        this->a=a;
    }
    void setA(int a)
    {
        this->a=a;
    }
    int getA()
    {
        return a;
    }
};

现在,主要是,我写道:

int main() {
    vector<temp> v;
    v.resize(7,temp(5));
    for(int i=0;i<7;i++) {
        v[i].setA(i);
    }

    for(int i=0;i<7;i++) {
        cout<<v[i].getA()<<"\t";
    }
}

我得到的输出是

ctor called
0 1 2 3 4 5 6 

我想知道为什么即使在创建 7 个不同的 temp 类对象时构造函数也只调用一次?

4

2 回答 2

7

因为向量的元素是通过复制参数来初始化的。您传递的参数的创建是您代码中唯一一次调用您编写的ctor。std::vector您正在调用的 ctor描述为here,它是您正在调用的版本 (2)。

将 copy-ctor 添加到您的类中以查看发生了什么:

temp(const temp& t)
{
    std::cout<<"copy-ctor called"<<std::endl;
    this->a = t->a;
}

在您的代码中,编译器为您生成了一个 copy-ctor,但显然没有调试输出,因此您看不到它。

于 2013-04-06T18:03:05.383 回答
5

正在为您创建的临时对象调用构造函数temp(5)。向量的所有元素都是通过复制该对象来构造的。这当然会使用复制/移动构造函数。

基本上,vector您正在调用的构造函数只要求元素的类型在CopyInsertable该向量中。这意味着必须满足以下条件:

allocator_traits<A>::construct(a, p, v);

其中A是分配器类型,a是分配器对象,p是指向已分配内存的指针,v是要构造的对象。这将本质上使用placement-new 来构造向量的元素,将值传递v给它的构造函数。在这种情况下,v是您传递的构造函数的第二个参数,因此它调用复制/移动构造函数。

于 2013-04-06T18:02:24.980 回答