5、缺省取址运算符。
6、 缺省取址运算符 const。
<span style="font-size:18px;">
class A { public: A(){}//缺省构造函数 A(const A&){}//拷贝构造函数 ~A(){}//析构函数 A&operator=(const A&){}//赋值运算符 A*operator&(){}//取址运算符 const A*operator&()const{}//取址运算符 const };
</span>
在C++中,编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢?
对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符。
有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、一对取址运算符和一个this指针。
代码:
<span style="font-size:18px;">
#include <iostream> 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):"<<sizeof(Empty_one)<<endl; cout<<"sizeof(Empty_two):"<<sizeof(Empty_two)<<endl; cout<<"sizeof(Empty_three):"<<sizeof(Empty_three)<<endl; cout<<"sizeof(Empty_four):"<<sizeof(Empty_four)<<endl; return 0; }
</span>
分析:
类Empty_one、Empty_two是空类,但空类同样可以被实例化,而每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以sizeof(Empty_one)和sizeof(Empty_two)的大小为1。
类Empty_three里面因有一个纯虚函数,故有一个指向虚函数的指针(vptr),32位系统分配给指针的大小为4个字节,所以sizeof(Empty_three)的大小为4。
类Empty_four继承于Empty_two和Empty_three,编译器取消Empty_two的占位符,保留一虚函数表,故大小为4。
当空类Empty_one定义一个对象时Empty_one pt;sizeof(pt)仍是为1,但编译器会生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、两个取址运算符。
C++编译器对这些函数的实现:
原文地址:http://blog.csdn.net/irean_lau/article/details/46393015