在什么条件下生成默认构造函数?

时间:2012-05-17 15:17:20

标签: c++ constructor default-constructor

我有以下课程:

class Tileset { //base class

public:
    static std::vector<Tileset*> list;
    virtual ~Tileset() = 0;

protected:
    std::vector<Tile> tiles_list;
    sf::Texture sheet;

private: //non copiable
    Tileset(const Tileset&);
    Tileset& operator=(const Tileset&);
};

其中sf::Texture有默认构造函数

根据我的理解,应该生成一个默认构造函数,因为每个成员也可以默认构造。 但是当我尝试构造派生对象而不调用Tileset构造函数时,我遇到了编译器错误。 有人可以解释为什么没有生成默认构造函数吗?

编辑:忘了提及Tile类没有默认构造函数。我不确定这是否会改变任何内容

3 个答案:

答案 0 :(得分:10)

如果满足以下任何条件,则不会生成默认构造函数

  • 有一个用户定义的构造函数声明
  • 该类型包含const或参考字段

您声明了构造函数,因此C ++不会提供默认生成的构造函数。在这种情况下,尽管Tileset的所有字段都有有用的默认构造函数,因此在这里定义默认构造函数非常容易

Tileset() { }

答案 1 :(得分:1)

当您不提供任何构造函数时,只有编译器才会为您的类生成默认构造函数。如果提供构造函数(甚至是复制构造函数),则编译器将不会生成默认构造函数。

通过“提供”我的意思是当你声明和“可选地”定义你班级的构造函数时。

答案 2 :(得分:1)

来自C ++规范,12.1.5

  

如果类X没有用户声明的构造函数,则隐式声明默认构造函数。 隐式声明的默认构造函数是其类的inline public成员。

您的Tileset类声明了构造函数,因此C ++编译器没有为您声明隐式构造函数。这种行为的基本原理是,由于您提供了带参数的构造函数,因此您可能需要这些参数才能正确初始化类的实例。这里的假设是,除了非默认构造函数之外,如果你想要一个默认构造函数,你只需要声明它。