用户定义类的构造函数不使用矢量

Constructor of user-defined class not working with vector

本文关键字:构造函数 定义 用户      更新时间:2023-10-16

我的问题很简单,类的构造函数不适用于std::vector

class my_class
{
public:
    my_class() { std::cout << "my_class constructedn"; }
};
int main()
{
    std::vector <my_class> v;
}

该程序没有输出任何内容,即使它应该输出my_class constructed。然后我假设构造函数适用于vector的每个元素,所以我这样做了:

class my_class
{
public:
    my_class() { std::cout << "my_class constructed"; }
};
int main()
{
    my_class object;
    std::vector <my_class> v;
    v.push_back( object );
}

输出的以下代码:

my_class constructed 

这种构造是因为my_class对象,而不是因为使用了push_back()

如何使构造函数适用于std::vector?如果您需要任何进一步的细节,我很乐意提供。

在第二种情况下,您正在构造一个对象并在向量中复制构造它。如果你想直接在向量内部构造,我建议使用不带参数的emplace_back

v.emplace_back();

您需要设置向量的初始大小,例如按 std::vector <my_class> v(10) .然后它实际上应该调用构造函数 10 次,因为向量的元素默认初始化。

在第二个示例中,当您push_back对象时,该对象可能是复制的,而不是"构造的"。如果实现了复制构造函数,则可以观察到以下行为:

class my_class
{
public:
    my_class();
    my_class(const my_class &m) { cout << "copy constructor called" << endl; };
};
my_class::my_class()
{
    std::cout << "my_class constructedn";
}
int main()
{
    my_class mc;
    std::vector <my_class> v;
    v.push_back(mc);
    return 0;
}

输出:

my_class constructed
copy constructor called

你构造了一个空向量。为什么你希望在这种情况下调用你的构造函数?在你实际将一些对象放入向量之前,它不会被调用。

此外,检测复制构造函数并移动构造函数。