何时创建类对象的向量时调用构造函数?

时间:2013-03-18 17:57:03

标签: c++ class vector

假设我有一个名为Foo的课程。 Foo没有默认构造函数。它有一个构造函数Foo(int x,float y)。

Bar是一个容器类。它包含一个包含Foo实例的向量。

Bar::Bar(int numberOfFoos, int x, float y) {

foovector.resize (numberOfFoos);
for(int i = 0; i < numberOfFoos; i++) {
   **read below**
}

此时,我想调用Foo的构造函数并将参数int x和float y传递给它。 Foo的构造函数根据x和y的值做不同的事情。

假设Foo有一个默认构造函数,调整大小矢量函数究竟做了什么?它是否只是在不调用默认构造函数的情况下调整向量的大小?换句话说,是为Foo类型的n个元素保留的空间,但它们没有初始化为任何东西??

如果它没有,如果在这种情况下怎么办?

在for循环中

我想以这种方式初始化每个Foo元素:

foovector[i].Foo(int x, float y);

但是我无法以这种方式使用点访问运算符来调用构造函数。我现在甚至不知道构造函数是否已经被resize函数调用过。

问题,我该怎么办?

关于班级向量的另一个相关问题:

在Foo中有一个包含浮点数的向量。 float x参数是它应该保持的浮点数。 Foo的构造函数有一行

arrayofFloats.resize (x);

但这意味着计算机事先并不知道Foo的大小。每个foo可以有不同的大小。它不会导致Foo的矢量问题吗?如果每个Foo可以有不同的大小,如何声明特定大小的向量?

抱歉英语不好,我希望它已经足够清楚了。

谢谢。

3 个答案:

答案 0 :(得分:6)

请勿使用resize来预留空间。相反,请使用reserve

foovector.reserve(n);                          // reserves memory only, no object
                                               // constructions take place
for (std::size_t i = 0; i != n; ++i)
{
    foovector.emplace_back(12 * i, i / 3.0);   // pushes a new Foo(12*i, i/3.0)
}                                              // at the back of the vector

答案 1 :(得分:1)

如果我理解这一点,你希望Bar构造函数在向量中构造许多Foo实例,每次都有与Foo构造函数相同的参数。 IF Foo构造函数的工作原理是Foo对象在构造之后都是相同的,你可以使用std::vector::assign(size_type n, const value_type& val),其中value_type在这种情况下是Foo。如果调用foovector.assign( numberOfFoos, Foo(x, y) ),向量将构造一个临时Foo对象,并用该对象的numberOfFoos个副本填充自身。 assign()还可以处理所有调整大小的需求。

但是如果Foo构造函数涉及随机行为,静态计数器或导致连续调用构造函数导致不同对象的其他东西,则复制不是您想要的。

您的其他问题:

在C ++中,每种类型都有固定的大小。 (这就是多态性仅适用于指针或传递引用语义的原因。)许多类(如std::vector)管理可根据需要增长或缩小的额外内存。这一切都是在幕后用指针完成的。附加内存(例如向量包含的数据)在某些其他内存位置关闭,不会影响实际内存 对象的大小。 vector方法size()resize()reserve()可以使用该托管内存。因此,无论其向量中有多少项,Foo对象的大小都相同。

答案 2 :(得分:0)

resize 初始化新元素;具体来说,它初始化一个临时对象(使用默认构造函数,如果它是一个类类型),然后使用它复制初始化每个元素。

如果它没有默认构造函数,或者无法进行复制初始化,则无法使用resize

但是,您可以使用reserve来保留内存而不初始化其中的任何对象;然后在该空间中使用push_backinsert元素。在C ++ 11中,您还可以使用emplace_back来避免复制元素:

foovector.reserve (numberOfFoos);
for(int i = 0; i < numberOfFoos; i++) {
   foovector.push_back(Foo(42, 1.23));   // C++03, requires copy constructor
   foovector.emplace_back(42, 1.23);     // C++11, doesn't require copy constructor
}

关于你的额外问题:

  

但这意味着计算机事先并不知道Foo的大小

是的。向量是一个小对象,包含指向某些动态分配的内存的指针;它的大小是固定的,并不依赖于它分配的内存量。

相关问题