一、空类默认产生的成员
一个空类默认会产生一下成员函数:
class Empty {};
Empty(); // 默认构造函数
Empty( const Empty& ); //默认拷贝构造函数
~Empty(); // 默认析构函数
Empty& operator=( const Empty& ); // 默认赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符const
可以看出,一个空类默认为我们产生出了6个函数。关于这些函数是在编译的哪个阶段产生及产生的情况,我们下一个阶段在讨论。
#include <iostream>
using namespace std;
class Empty
{
public:
Empty* operator&()//取地址操作符
{
cout<<"AAAA"<<endl;
return this;
}
const Empty* operator&() const//间接取值运算符
{
cout<<"BBBB"<<endl;
return this;
}
};
int main(void)
{
Empty e;
Empty* p = &e; // 等价于e.operator&();
const Empty e2;
const Empty* p2 = &e2;
cout<<sizeof(Empty)<<endl;
return 0;
}
最后打印出对象的大小为1,为什么是1而不是0呢?因为如果要对对象取地址,该对象必须有自己的内存空间,而大小为0的对象是没有办法分配内存的。所以没有任何数据成员的对象编译器默认分配1个空间。