【C++缺省函数】 空类默认产生的6个类成员函数
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个成员函数:一个缺省的构造函数、一个拷贝构造函数、一个析构函数、一个赋值运算符、两个取址运算符。
- class Empty
- {};
等价于:
- class Empty
- {
- public:
- Empty(); //缺省构造函数
- Empty(const Empty &rhs); //拷贝构造函数
- ~Empty(); //析构函数
- Empty& operator=(const Empty &rhs); //赋值运算符
- Empty* operator&(); //取址运算符
- const Empty* operator&() const; //取址运算符(const版本号)
- };
使用时的调用情况:
- Empty *e = new Empty(); //缺省构造函数
- delete e; //析构函数
- Empty e1; //缺省构造函数
- Empty e2(e1); //拷贝构造函数
- e2 = e1; //赋值运算符
- Empty *pe1 = &e1; //取址运算符(非const)
- const Empty *pe2 = &e2; //取址运算符(const)
C++编译器对这些函数的实现:
- inline Empty::Empty() //缺省构造函数
- {
- }
- inline Empty::~Empty() //析构函数
- {
- }
- inline Empty *Empty::operator&() //取址运算符(非const)
- {
- return this;
- }
- inline const Empty *Empty::operator&() const //取址运算符(const)
- {
- return this;
- }
- inline Empty::Empty(const Empty &rhs) //拷贝构造函数
- {
- //对类的非静态数据成员进行以"成员为单位"逐一拷贝构造
- //固定类型的对象拷贝构造是从源对象到目标对象的"逐位"拷贝
- }
- inline Empty& Empty::operator=(const Empty &rhs) //赋值运算符
- {
- //对类的非静态数据成员进行以"成员为单位"逐一赋值
- //固定类型的对象赋值是从源对象到目标对象的"逐位"赋值。
- }
比如:m是类C中的一个类型为T的非静态成员变量。若C没有声明拷贝构造函数(赋值运算符)。 m将会通过T的拷贝构造函数(赋值运算符)被拷贝构造(赋值);该规则递归应用到m的数据成员,直到找到一个拷贝构造函数(赋值运算符)或固定类型(比如:int、double、指针等)为止。
三、总结
上述执行结果依赖于编译器和64位、32位不同的系统。
【C++缺省函数】 空类默认产生的6个类成员函数的更多相关文章
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
http://blog.csdn.net/gmstart/article/details/7046140 在C++的类定义里面,可以看到类似下面的定义: 01 class List { 02 priv ...
- C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数
class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty ...
- python类中保存非绑定方法作为成员函数
习惯了函数式,动不动传一个函数.但是直接把函数作为类方法保存,再调用时会报错. 举一个unittest时的例子 class MyTestCase(unittest.TestCase): @classm ...
- 聊聊 C++ 中几类特殊成员函数
一:背景 在 C# 中要说类默认给我们定义的特殊成员函数,莫过于 构造函数,但在 C++ 中这样的特殊函数高达 6 种,有必要整合一下聊一聊. 二:特殊成员函数 1. 默认构造函数 和 C# 一样,很 ...
- C++ 空类默认产生的类成员函数
C++的空类有哪些成员函数:. 缺省构造函数.. 缺省拷贝构造函数.. 缺省析构函数.. 缺省赋值运算符.. 缺省取址运算符.. 缺省取址运算符 const. 注意:有些书上只是简单的介绍了前 ...
- c++11 类默认函数的控制:"=default" 和 "=delete"函数
c++11 类默认函数的控制:"=default" 和 "=delete"函数 #define _CRT_SECURE_NO_WARNINGS #include ...
- c++11 类默认函数的控制:"=default" 和 "=delete"函数 void fun() = default; void fun()=delete;
转自:lsgxeva #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...
- c++基础知识_c++11 类默认函数的控制:"=default" 和 "=delete"函数
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...
- C++学习46 getline()函数读入一行字符 一些与输入有关的istream类成员函数
getline函数的作用是从输入流中读取一行字符,其用法与带3个参数的get函数类似.即 cin.getline(字符数组(或字符指针), 字符个数n, 终止标志字符) [例13.7] 用get ...
随机推荐
- IDEA使用及优化
1.修改IntelliJ IDEA\bin\idea64.exe.vmoptions文件的内容 2.Setting配置 2.1 设置主题 2.2 设置编辑区主题 如果想要更多的主题效果的话,可以到如下 ...
- mysql数据库创建删除带横杠的数据库名
mysql> create database d-d; ERROR 1064 (42000): You have an error in your SQL syntax; check the m ...
- SIM800L透传模式配置
UART1_SendString("AT+CIPCLOSE=1"); //关闭连接 delay_ms(100); Second_AT_Command("AT+CIPSHU ...
- TCP/UDP,SOCKET,HTTP,FTP 简析
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...
- 连接到 Linux 服务器时首先要运行的 5 个命令
作为一个系统管理员/SRE 工作 5 年后,我知道当我连接到一台 Linux 服务器时我首先应该做什么.这里有一系列关于服务器你必须了解的信息,以便你可以(在大部分时间里)更好的调试该服务器. 连上 ...
- Linux 指令篇:磁盘管理--tree
Linux 指令篇:磁盘管理--tree 功能说明:以树状图列出目录的内容. 语 法:tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式&g ...
- Java计算两个字符串日期之间的天数差
Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException { String a = ...
- Atitit. 解决80端口 System 占用pid 4,,找到拉个程序或者服务占用http 80服务
Atitit. 解决80端口 System 占用pid 4,,找到拉个程序或者服务占用http服务 这个是http.sys系统服务占用了... net stop http ,三,没法儿终止 1. 寻 ...
- iOS7 Xcode 5如何设置隐藏状态栏
转自:http://www.cocoachina.com/ask/questions/show/99658 最简单直接的方法: 直接在RootViewController.mm里面(Cocos2d-x ...
- (3)FluidMoveBehavior 之模仿 Windows Phone 开始菜单的 Tile 长按后排序
这个工程和上一篇 (2)中介绍的排序大同小异,只是比上一篇交换复杂一点,不是通过单击进行交换, 而是拖动一个 Tile 到另一个 Tile 上时,判断两个 Tile 的中心距离是否符合条件来判断是否进 ...
