1、缺省构造函数。

2、缺省拷贝构造函数。

3、 缺省析构函数。

4、缺省赋值运算符。

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>

结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSXJlYW5fTGF1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

分析:

类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。

2、空类。定义时会生成6个成员函数

当空类Empty_one定义一个对象时Empty_one pt;sizeof(pt)仍是为1,但编译器会生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、两个取址运算符。

  1. class Empty
  2. {};

等价于:

  1. class Empty
  2. {
  3. public:
  4. Empty();                            //缺省构造函数
  5. Empty(const Empty &rhs);            //拷贝构造函数
  6. ~Empty();                           //析构函数
  7. Empty& operator=(const Empty &rhs); //赋值运算符
  8. Empty* operator&();                 //取址运算符
  9. const Empty* operator&() const;     //取址运算符(const版本号)
  10. };

使用时的调用情况:

  1. Empty *e = new Empty();    //缺省构造函数
  2. delete e;                  //析构函数
  3. Empty e1;                  //缺省构造函数
  4. Empty e2(e1);              //拷贝构造函数
  5. e2 = e1;                   //赋值运算符
  6. Empty *pe1 = &e1;          //取址运算符(非const)
  7. const Empty *pe2 = &e2;    //取址运算符(const)

C++编译器对这些函数的实现:

  1. inline Empty::Empty()                          //缺省构造函数
  2. {
  3. }
  4. inline Empty::~Empty()                         //析构函数
  5. {
  6. }
  7. inline Empty *Empty::operator&()               //取址运算符(非const)
  8. {
  9. return this;
  10. }
  11. inline const Empty *Empty::operator&() const    //取址运算符(const)
  12. {
  13. return this;
  14. }
  15. inline Empty::Empty(const Empty &rhs)           //拷贝构造函数
  16. {
  17. //对类的非静态数据成员进行以"成员为单位"逐一拷贝构造
  18. //固定类型的对象拷贝构造是从源对象到目标对象的"逐位"拷贝
  19. }
  20. inline Empty& Empty::operator=(const Empty &rhs) //赋值运算符
  21. {
  22. //对类的非静态数据成员进行以"成员为单位"逐一赋值
  23. //固定类型的对象赋值是从源对象到目标对象的"逐位"赋值。

  24. }

比如:m是类C中的一个类型为T的非静态成员变量。若C没有声明拷贝构造函数(赋值运算符)。 m将会通过T的拷贝构造函数(赋值运算符)被拷贝构造(赋值);该规则递归应用到m的数据成员,直到找到一个拷贝构造函数(赋值运算符)或固定类型(比如:int、double、指针等)为止。

三、总结

上述执行结果依赖于编译器和64位、32位不同的系统。

【C++缺省函数】 空类默认产生的6个类成员函数的更多相关文章

  1. C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解

    http://blog.csdn.net/gmstart/article/details/7046140 在C++的类定义里面,可以看到类似下面的定义: 01 class List { 02 priv ...

  2. C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数

    class Empty {     public:     Empty(); // 缺省构造函数     Empty( const Empty& ); // 拷贝构造函数     ~Empty ...

  3. python类中保存非绑定方法作为成员函数

    习惯了函数式,动不动传一个函数.但是直接把函数作为类方法保存,再调用时会报错. 举一个unittest时的例子 class MyTestCase(unittest.TestCase): @classm ...

  4. 聊聊 C++ 中几类特殊成员函数

    一:背景 在 C# 中要说类默认给我们定义的特殊成员函数,莫过于 构造函数,但在 C++ 中这样的特殊函数高达 6 种,有必要整合一下聊一聊. 二:特殊成员函数 1. 默认构造函数 和 C# 一样,很 ...

  5. C++ 空类默认产生的类成员函数

    C++的空类有哪些成员函数:. 缺省构造函数.. 缺省拷贝构造函数.. 缺省析构函数.. 缺省赋值运算符.. 缺省取址运算符.. 缺省取址运算符 const.     注意:有些书上只是简单的介绍了前 ...

  6. c++11 类默认函数的控制:"=default" 和 "=delete"函数

    c++11 类默认函数的控制:"=default" 和 "=delete"函数 #define _CRT_SECURE_NO_WARNINGS #include ...

  7. c++11 类默认函数的控制:"=default" 和 "=delete"函数 void fun() = default; void fun()=delete;

    转自:lsgxeva #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...

  8. c++基础知识_c++11 类默认函数的控制:"=default" 和 "=delete"函数

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...

  9. C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数

    getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似.即    cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符) [例13.7] 用get ...

随机推荐

  1. 【微信支付】公众号、商户基础配置和流程(包括设置支付授权目录、测试支付目录和白名单、JS接口安全域名、授权回调域名等)

    一.使用场景以及说明 使用场景:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 说明:1.用户打开图文消息或者扫描二维码,在微信内置浏览器打开网 ...

  2. 主从复制时报:ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in t

    centos 6.5 mysql5.7 在从库作stop slave时报: error:ERROR 1794 (HY000): Slave is not configured or failed to ...

  3. PHP-WebService中Endpoint、Disco、WSDL都是做什么的?

    Endpoint: http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx   web服务的URI地址,你访问之后,就会出现web服务的相 ...

  4. PHP-数据库长连接mysql_pconnect的细节

    PHP的MySQL持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之.这到底是为啥么.近距离观察后发现,这家伙也不容易啊,要看Apache的脸色,还得听MySQL指挥. 对于作为Apache模 ...

  5. 摘:LIB和DLL的区别与在VC中的使用

    共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.一种是LIB包含函数 ...

  6. 02、Windows Phone 套接字(Socket)实战之服务器端设计

    这里主要写 PC 服务器端的逻辑,UI 使用的是 WPF,因为 WPF 比普通的 WinForm 的流式布局 更容易控制,而且比 WinForm 美观一些,显示截图: 一.页面 UI MainWind ...

  7. Vs code 通用插件

    Vs code 通用插件 转自:https://segmentfault.com/a/1190000006697219 HTML Snippets 超级实用且初级的 H5代码片段以及提示 HTML C ...

  8. javac使用笔记

    一般写java都用的IDE,今天临时要测试一下JDK安装好没,就用了一下javac,结果各种不会用 目录 javac -help查到了有javac -sourcepath,他喵的我还以为这是查找sou ...

  9. linux服务器 IE中ico 不能正常显示

    问题: mime_type: image/vnd.microsoft.icon 的,但发现在 IE 下面,直接打开 icon 的地址,图标不能正常显示 1.将ico放在windows服务器上,直接访问 ...

  10. android4.0.3源码之USB wifi移植心得

    http://blog.csdn.net/eastmoon502136/article/details/7850157 http://forum.cubietech.com/forum.php?mod ...