当问到大家什么时候会提供默认构造函数时,有的人会不会一下子就想到当我们没有定义构造函数的时候,它就会提供默认的构造函数,但我们想想一个问题,假如没有意义的情况下提供了默认构造函数,那是不是把编译器搞得像一个傻子一样?其实呀,编译器不傻。
所以总结如下:
下面两种情况下,编译器才会提供默认的构造函数:
a.本类.本类中定义的成员对象或者父类中有虚函数存在
解释:由于需要初始化虚表,且这个工作理应在构造函数隐式完成,因此在没有定义构造函数的情况下,编译器会添加默认的构造函数用于隐式完成虚表的创建工作
b.父类或本类中定义的成员对象带有构造函数
解释:在对象被定义时,由于对象本身为派生类,因此构造顺序实现构造父类再构造自身。当父类中带有构造函数时,将会调用父类的构造函数,而这个调用过程需要在构造函数中完成,因此编译器添加了默认的构造函数来完成这个调用过程。成员对象带有构造函数的情况与此相同
在没有定义构造函数的情况下,当类中没有虚函数存在时,父类和成员对象也没有定义构造函数时,提供默认构造函数已没有任何意义,只会降低程序的执行效率。