在以下四种情况中,如果类中没有定义一个默认构造函数,则编译器会自动生成一个nontrivial的默认构造函数,而不是一个不做事情的trivial默认构造函数:
1.内含一个成员变量,而这个成员变量所属的类中含有默认构造函数,则此时需要为此类生成一个implicit default constructor(隐式的默认构造函数),这个implicit default constructor是nontrivial的,因为内含的成员变量需要进行默认构造操作。
如果内含一个成员变量a,且该成员变量a含有默认构造函数。同时已经对该类定义了默认构造函数但未对a进行操作,则编译器会在自己定义的默认构造函数的开始部分插入一个a所属类的默认构造函数,不然这个自己定义的默认构造函数将会忽视掉a的nontrival默认构造函数。
2.继承自一个类,且该类中有默认构造函数。派生类中没有定义默认构造函数,则编译器会为派生类提供一个上一层基类的默认构造函数。
3.class中声明了一个虚函数。声明了虚函数代表该class中将出现vptr,并需要为虚函数构造一张虚函数表vtbl,这个操作是必须的,因此使该class的默认构造函数成为nontrivial的,因此需要为了这个vptr和vtbl构建默认构造函数,进行初始化操作。
4.带有虚基类的class。因为虚基类的引入,必须要有一个指针或者类似索引的东西来指向虚基类的区域,以使虚基类的派生类们能找到共享的虚基类的存储区域。
如:
class X{public:int i;};
class A:public virtual X {public:int j;};
class B:public virtual X {public:d