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

jaz*_*azz 4 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**
}
Run Code Online (Sandbox Code Playgroud)

在这一点上,我想调用Foo的构造函数并将参数int x和float y传递给它.Foo的构造函数根据x和y的值做不同的事情.

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

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

在for循环中我想以这种方式初始化每个Foo元素:

foovector[i].Foo(int x, float y);
Run Code Online (Sandbox Code Playgroud)

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

问题是,我该怎么办?

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

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

arrayofFloats.resize (x);
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Ker*_* SB 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
Run Code Online (Sandbox Code Playgroud)


Sam*_*man 1

如果我理解正确的话,您希望 Bar 构造函数在向量中构造多个 Foo 实例,每次都使用与 Foo 构造函数相同的参数。如果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、和使用该托管内存。因此,无论 Foo 对象的向量中有多少项,它的大小都是相同的。size()resize()reserve()