面试总结之C++类默认缺省函数

来源:互联网 发布:js抽奖转盘视频教程 编辑:程序博客网 时间:2024/06/06 05:17

一、编译器定义的默认缺省函数

编译器会为每一个类产生六个缺省函数:

构造函数

拷贝构造函数

析构函数

赋值运算符重载

取地址运算符重载

取地址运算符重载(const版)

这六个函数的实现如下:

Demo::Demo()                       //缺省构造函数  {}Demo::~Demo()                         //析构函数  {}Demo *Demo::operator&()               //取址运算符(非const)  {return this;}const Demo *Demo::operator&() const    //取址运算符(const)  {return this;}Demo::Demo(const Demo &rhs)           //拷贝构造函数  {//对类的非静态数据成员进行以"成员为单位"逐一拷贝构造  //固定类型的对象拷贝构造是从源对象到目标对象的"逐位"拷贝  }Demo& Demo::operator=(const Demo &rhs) //赋值运算符  {//对类的非静态数据成员进行以"成员为单位"逐一赋值  //固定类型的对象赋值是从源对象到目标对象的"逐位"赋值。  }
二、关于空类的大小

空类在定义时并没有上面说的六个函数,只有一个字节的占位符,当需要用到时编译器才会生成上面六个函数。

//定义三个类class Foo1 {};class Foo2 { public:virtual void foo(); };class Foo3 :public Foo1, public Foo2 {public:virtual void foo();};
//输出三个类的大小cout << sizeof(Foo1) << endl;cout << sizeof(Foo2) << endl;cout << sizeof(Foo3) << endl;//输出三个实例对象的大小Foo1 f1;Foo2 f2;Foo3 f3;cout << sizeof(f1) << endl;cout << sizeof(f2) << endl;cout << sizeof(f3) << endl;
上面的输出结果是1 4 4 1 4 4

首先,三个类的大小。Foo1是一个空类,只有一个字节的占位符,Foo2有一个虚函数,所有有一个指向虚函数的指针,因此Foo2的大小是4个字节。Foo3继承Foo1和Foo2,取消了Foo1的占位字节,继承了Foo2的虚函数,也是4个字节。

类被实例化时编译器会生成上面的六个函数,但对象的大小仍然跟类一样。



0 0
原创粉丝点击