我正在尝试学习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;
}
};
Run Code Online (Sandbox Code Playgroud)
现在,在主要内容中,我写道:
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";
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
ctor called
0 1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
我想知道为什么构造函数只创建了7个不同的类temp对象?
因为通过复制参数来初始化向量的元素.您传递的参数的创建是您的代码中唯一一次调用您编写的ctor.该构造函数从std::vector您所呼叫的描述在这里,它的版本(2)您呼叫.
将copy-ctor添加到您的班级以查看发生的情况:
temp(const temp& t)
{
std::cout<<"copy-ctor called"<<std::endl;
this->a = t->a;
}
Run Code Online (Sandbox Code Playgroud)
在您的代码中,编译器为您生成了一个copy-ctor,但显然没有调试输出,因此您无法看到它.
正在为您创建的临时对象调用构造函数temp(5).矢量的所有元素都是通过复制该对象来构造的.这当然会使用复制/移动构造函数.
基本上,vector您调用的构造函数只需要元素的类型CopyInsertable进入该向量.这意味着以下内容必须正常:
allocator_traits<A>::construct(a, p, v);
Run Code Online (Sandbox Code Playgroud)
A分配器类型在哪里,a是分配器对象,p是指向已分配内存的指针,v是从中构造的对象.这将主要使用placement-new来构造向量的元素,将值传递v给它的构造函数.在这种情况下,v是您传递的构造函数的第二个参数,因此它调用复制/移动构造函数.