C++空类编译器自动生成的6个成员函数
来源:互联网 发布:ubuntu如何卸载jdk 编辑:程序博客网 时间:2024/06/04 16:38
一、问题
在C++中,编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢?
二、详解
1、空类,声明时编译器不会生成任何成员函数
对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符。
有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、一对取址运算符和一个this指针。
代码:
运行结果:分析:
类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。
2、空类,定义时会生成6个成员函数
当空类Empty_one定义一个对象时Empty_one pt;sizeof(pt)仍是为1,但编译器会生成6个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、两个取址运算符。
等价于:
使用时的调用情况:
C++编译器对这些函数的实现:
例如:m是类C中的一个类型为T的非静态成员变量,若C没有声明拷贝构造函数(赋值运算符), m将会通过T的拷贝构造函数(赋值运算符)被拷贝构造(赋值);该规则递归应用到m的数据成员,直到找到一个拷贝构造函数(赋值运算符)或固定类型(例如:int、double、指针等)为止。
三、总结
(1)上述运行结果依赖于编译器和64位、32位不同的系统。
(2)本博文只是总结一些C++特性,也有无法理解的地方,不足之处还请指出,在此先感谢!
原文地址:http://blog.csdn.net/taiyang1987912/article/details/43485569
个人理解:好像挺有道理的,efficient c++里面貌似看到过,不过好像深入理解对象模型里面讲得更加复杂。
- C++空类编译器自动生成的6个成员函数
- C++空类编译器自动生成的6个成员函数
- C++空类编译器自动生成的6个成员函数
- C++空类编译器自动生成的6个成员函数
- C++空类编译器自动生成的6个成员函数
- C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数
- Effective C++(6) 如何拒绝编译器的自动生成函数
- C++空类,编译器默认产生的成员函数
- 隐式成员函数:由编译器自动生成的函数(自动是罪恶的根
- 类的设计--编译器生成的成员函数
- 当心编译器生成的隐含成员函数
- <Effective C++>:Item 6 :明确拒绝不想编译器自动生成的函数
- 定义一个C++空类,编译器会自动生成哪几个函数?
- 【C++缺省函数】 空类默认产生的6个类成员函数
- 【C++缺省函数】 空类默认产生的6个类成员函数
- C++空类默认产生6个类成员函数
- C++编译器为类自动生成的函数
- EffictiveC++屏蔽编译器自动生成的函数
- Android源码工程转化为Android Studio项目的方法
- solr5.X的几个重要配置模板
- condition variable 和 srwlock的一个例子
- 假设检验介绍
- 盒模型再回顾:外边距折叠与怪异盒模型
- C++空类编译器自动生成的6个成员函数
- Android 点击按钮实现控件显示隐藏
- 用Python在训练好的log文件中提取出数据并画图
- 001
- [CF#365 (Div. 2) Mishka and Interesting sum] 线段树离线处理区间不同数
- 前台如何调用MD5加密
- C# 通过IHttpModule来实现Url Rewrite,且Session有效
- Android 反编译与混淆技术(上)
- Python的time模块datetime模块