对于空类
声明时编译器不会生成任何成员函数
对于空类,声明时,编译器不会生成任何的成员函数,只会生成1个字节的占位符。
有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、一对取址运算符和一个this指针
代码:
#include
using namespace std;
class empty_one
{
};
class empty_two
{
};
class empty_three
{
virtual void fun() = 0;//虚函数
};
class empty_four : public empty_two, public empty_three
{
};
int main()
{
cout<<"sizeof(empty_one):"<
运行结果:
分析:
类empty_one、empty_two是空类,但空类同样可以被实例化,而每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以sizeof(empty_one)和sizeof(empty_two)的大小为1。
类empty_three里面因有一个纯虚函数,故有一个指向虚函数的指针(vptr),64位系统分配给指针的大小为8个字节,所以sizeof(empty_three)的大小为8。
类empty_four继承于empty_two和empty_three,编译器取消empty_two的占位符,保留一虚函数表,故大小为8。
空类定义时会生成6个成员函数
当空类empty_one定义一个对象时empty_one pt;sizeof(pt)仍是为1,但编译器会生成6个成员函数:
- 缺省的构造函数
- 拷贝构造函数
- 析构函数
- 赋值运算符
- 两个取址运算符
等价于:
class empty
{
public:
empty(); //缺省构造函数
empty(const empty &rhs); //拷贝构造函数
~empty(); //析构函数
empty& operator=(const empty &rhs); //赋值运算符
empty* operator&(); //取址运算符
const empty* operator&() const; //取址运算符(const版本)
};
使用时的调用情况:
empty *e = new empty(); //缺省构造函数
delete e; //析构函数
empty e1; //缺省构造函数
empty e2(e1); //拷贝构造函数
e2 = e1; //赋值运算符
empty *pe1 = &e1; //取址运算符(非const)
const empty *pe2 = &e2; //取址运算符(const)