相信对C++有过了解的人都知道,类的默认构造方法。就是当定义一个类时,有时编译器会给类添加一个默认的构造方法。那么疑问来了,什么情况下编译器会给类添加默认构造方法,这些构造方法具体做了什么操作?下面来探讨一下:
1.类里面有类成员数据,且类成员有构造方法
class A{
public:
A(){}
int a;
};
class B{
public:
int b;
A aa;
};
B b;
此时编译器会给B类添加默认构造函数,且这个构造函数会调用A的构造函数;因为当实例化B对象时,类成员aa也需要被实例化,需要调用构造方法。如果编译器不给B添加这样的构造方法,那么A的构造方法将不会被调用,显然不合理。
2.类成员函数含有虚函数
class A{
public:
int a;
virtual void fun1(){
cout<<"this is virtual function"<<endl
}
};
对于这样的类A,编译器也会添加默认构造方法,为什么呢?上节已说过,类对象内存空间只有非静态数据成员和虚函数指针,如果一个类有虚函数那么这个类一定会有一个虚函数指针来指向虚函数表。那么这个虚函数指针就是在构造方法中产生。
3.父类含有构造方法
class A{
public:
A(){}
int a;
};
class B:A{
public:
int b;
};
此时对于B类编译器会添加一个没有参数的默认构造方法,这个构造方法会调用A的构造方法。
4.类中含有虚基类
class Base{
public:
int m_base_i;
};
class Derived1:virtual Base{
};
class Derived2:virtual Base{
};
class A:public Derived1,public Derived2{
};
这里实例化A会调用默认构造函数,对虚基类表指针进行赋值,通过虚基类来访问基类成员。