为什么需要在QVector <myclass>中使用默认构造函数?

时间:2019-01-17 23:53:36

标签: c++ qt vector qvector

我在编译以下内容时遇到问题:

#include <QVector>
#include <QDebug>
#include <vector>

class item
{
    int var;
public:
    //Without default constructor this program will not compile
    //item(){}

    item(int value)
    {
        var = value;
    }
    int getVar()
    {
        return var;
    }
};

int main()
{
    //This code will not compile
    QVector<item> y;
    y.append(item(1));
    qDebug() << y[0].getVar();

    //std::vector however will work despite an absence of a default contructor
    std::vector<item> z;
    z.push_back(item(1));
    qDebug() << z.at(0).getVar();

    return 0;
}

确切地说,附加行不会编译。

为什么在这种情况下项目必须具有默认构造函数?

1 个答案:

答案 0 :(得分:1)

std::vector工作方式不同的原因在于,在向量中分配了原始未初始化的内存,然后在需要时调用copy构造函数进行复制。此过程不需要为resize() 调用默认构造函数。这就是为什么默认构造函数没有这种依赖性的原因。

有关更多信息,请参见AnT的答案here

QVector要求类型是默认可构造的,因为内部功能realloc()的实现方式。

来源:Understanding the Qt containers