我们何时需要默认构造函数?

XMa*_*all 25 c++ language-lawyer

我的问题很简单.我们何时需要默认构造函数?请参考以下代码:

class Shape
{
    int k;

public:
    Shape(int n) : k(n) {}
    ~Shape() {}
};

class Rect : public Shape
{
    int l;

public:
    Rect(int n): l(n)
    {}      //error C2512: 'Shape' : no appropriate default constructor available

    ~Rect() {}
};
Run Code Online (Sandbox Code Playgroud)
  1. 为什么编译器不会在类Rect中隐式生成零参数默认构造函数?

  2. 据我所知,如果一个类(Rect)派生自另一个具有默认构造函数(隐式生成或显式提供)的类(Shape),则默认构造函数应由编译器生成.

Lig*_*ica 24

如果您使用参数创建自己的构造函数,则不会合成默认构造函数.既然你给Shape了自己的构造函数,那么你现在必须明确写出一个默认的Shape构造函数:

class Shape
{
      int k;

  public:
      Shape() : k(0) {}
      Shape(int n) : k(n) {}
      ~Shape() {}
};
Run Code Online (Sandbox Code Playgroud)

(你可以省略空的~Rect() {}定义,因为它们将被合成.)

但是,我觉得你不想在这里使用Shape的默认构造函数.有Rect构建Shape正确的基础:

class Shape
{
      int area; // I've had to guess at what this member means. What is "k"?!

  public:
      Shape(const int area)
         : area(area)
      {}
};

class Rect : public Shape
{
     int l;
     int w;

  public:
     Rect(const int l, const int w)
        : Shape(l*w)
        , l(l)
        , w(w)
     {}
};
Run Code Online (Sandbox Code Playgroud)

另请注意,此示例被引用为滥用OO.考虑一下你是否真的需要继承.


Nic*_*ick 11

如果没有定义其他构造函数,则只能由编译器自动生成默认构造函数.无论任何继承.

而且你还需要通过调用来构造你的基类:

Rect( int n ) : Shape( n ), l(n)
{
}
Run Code Online (Sandbox Code Playgroud)