在c++中调整vector大小时调用一次类构造函数
Class constructor called once while resizing vector in C++
我正在尝试学习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;
}
};
现在,在main中,我写:
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
因为vector的元素是通过复制形参来初始化的。您所传递的参数的创建是代码中唯一调用您所编写的函数的时候。这里描述了您正在调用的std::vector
中的tor,您正在调用的是版本(2)。
将复制器添加到您的类中,看看发生了什么:
temp(const temp& t)
{
std::cout<<"copy-ctor called"<<std::endl;
this->a = t->a;
}
在您的代码中,编译器为您生成了一个复制因子,但显然没有调试输出,因此您无法看到它
构造函数正在为您用temp(5)
创建的临时对象调用。vector的所有元素都是通过复制该对象来构造的。这当然会使用复制/移动构造函数。
基本上,您调用的vector
的构造函数只要求该向量的元素类型为CopyInsertable
。这意味着以下内容必须是正确的:
allocator_traits<A>::construct(a, p, v);
其中A
是分配器类型,a
是分配器对象,p
是指向已分配内存的指针,v
是要构造的对象。这实际上是使用placement-new来构造vector的一个元素,将v
的值传递给它的构造函数。在本例中,v
是传递给构造函数的第二个参数,因此它调用复制/移动构造函数。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 如何为非常量和常量重载实现一次成员函数?
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 如何在 constexpr 构造函数中初始化矩阵一次?
- 零一参数构造函数
- C++一次将函数标记为静态就足够了?
- 在共享指针的值中调用 std::swap 调用一堆构造函数和析构函数
- C++ - 有没有办法只继承一次某些函数,而其他函数在多次继承中多次继承?
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 当Bool值在UPDATE()方法中更改时,只有一次呼叫函数
- 为什么析构函数被调用两次,而构造函数只被调用一次
- 每秒执行一次的函数,它是有效的,但喜欢每0.5秒执行一次
- std::make_shared在VS2012中进行了两次构造函数调用
- 使c++编译器优化到在map初始化时只调用构造函数一次
- 在没有默认构造函数的OpenMP中,每个线程执行一次代码
- 如何在c++中实现二次构造函数
- 在c++中调整vector大小时调用一次类构造函数
- 现代c++编译器是否内联只调用一次的函数?
- 如何只对move构造函数进行一次调用?
- 在对象数组中,构造函数被调用多次,但运算符new[]只被调用一次,原因是什么