C++ DISALLOW_COPY_AND_ASSIGN宏的作用
有时候,进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的对象,也就是对该类对象做副本没有任何意义.
因此,需要限制编译器自动生动的拷贝构造函数和赋值构造函数.一般参用下面的宏定义的方式进行限制,代码如下:
// A macro to disallow the copy constructor and operator= functions // This should be used in the priavte:declarations for a class #define DISALLOW_COPY_AND_ASSIGN(TypeName) \TypeName(const TypeName&); \TypeName& operator=(const TypeName&)class Test { public:Test(int t);~Test(); private:DISALLOW_COPY_AND_ASSIGN(Test); };
声明私有的拷贝构造函数和赋值构造函数,但不去定义实现它们,有三方面的作用:
1.声明了拷贝构造函数和赋值函数,阻止了编译器暗自创建的专属版本.
2.声明了private,阻止了外部对它们的调用.
3.不定义它们,可以保证成员函数和友元函数调用它们时,产生一个连接错误.
上述解决方法,面对在成员函数和友元函数企图拷贝对象时,会产生连接器错误.
遵循错误发现越早越好的原则,我们希望将连接期错误移至编译期.
解决思路是:设计一个专门为了阻止copying动作(包含copy和assign)而设计的基类
class Uncopyable { protected:Uncopyable() {}~Uncopyable() {} private:Uncopyable(const Uncopyable&);Uncopyable& operator=(const Uncopyable&); }; class Test:private Uncopyable{ ... //class不再声明copy构造函数或copy assignment操作符 };
如上述代码,当任何人(包括member函数或friend函数)尝试拷贝Test对象时,编译器便试着生成一个copy构造函数和一个copy assignment操作符.
编译器自动生成这些函数时,会调用其基类的对应函数,而基类中这些函数是private,因而那些调用会被编译器拒绝,产生编译器错误.
像Uncopyable这样的基类,没有non-static成员变量,没有virtual函数,也没有virtual base classes,可以满足空白基类最优化的条件(empty base optimization).
C++ DISALLOW_COPY_AND_ASSIGN宏的作用相关推荐
- 【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 )
文章目录 I . JNIEXPORT 与 JNICALL 宏定义 II . JNIEXPORT 与 JNICALL 宏定义说明 ( Windows 平台 ) III . JNIEXPORT 与 JNI ...
- 空的宏定义作用及常见用法
空的宏定义作用及常见用法 我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SI ...
- Linux字符设备驱动中container_of宏的作用
Linux字符设备驱动中container_of宏的作用 首先看看这个宏的原型: container_of(ptr,type,member) 功能:根据一个结构体变量中的一个成员变量的指针来获取指向整 ...
- 关于QT_BEGIN_NAMESPACE宏的作用
最近注意到QT_BEGIN_NAMESPACE宏,具体如下: #ifndef PREVIEWWINDOW_H #define PREVIEWWINDOW_H#include <QWidget&g ...
- 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数
文章目录 一.宏定义(#define)的作用 1.普通宏 2.带参宏 [注]:特殊用法 3.其他用法和注意点 二.实际问题(函数设计) 1.原题 2.题解参考 (1).面向过程的设计 (2).面向对象 ...
- LINUX C编程中_REENTRANT宏的作用
在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享.在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变.类似的问题还存在于fputs之类的函数中,这些函 ...
- c语言宏替换作用,C语言中,宏替换的替换规则
简单来说:宏定义又称为宏代换.宏替换,简称"宏".是C提供的三种预处理功能的其中一种.复杂的请看下面,讲的很全. 下面的带参宏定义,多行宏定义,在Linux内核源码中很多.另外si ...
- Cocos2d-x中常用宏的作用
1. CC_SYNTHESIZE(int, nTest, Test); 相当于: protected: int nTest; public: virtual nTest getTest(void) c ...
- 对普通函数、宏函数、内联函数的作用机制的探索
这次我们来分析的是C/C++程序员经常遇到的问题,如何在普通函数.宏函数.内联函数之间做取舍,其实它们三者之间并没有什么绝对的你好我差的说法,只要掌握了三者的作用机制的话,结合实际情况一般都能做出正确 ...
最新文章
- SQL Server 2008备份策略设计下(六)
- 三星笔记本FN功能键操作大全
- 直播技术:从性能参数到业务大数据,浅谈直播CDN服务监控
- 使用Nginx搭建图片服务器(windows7)
- Spring注释,我从来没有机会使用第1部分:@primary
- 730阵列卡支持多大硬盘_3分钟告诉你:OPPO Reno普通版和旗舰版的差距到底有多大...
- Shell脚本监控专线Network并SendEmail报警
- echarts中国地图3D各个城市标点demo
- 自定义Flutter控件
- 企业要做好安全遵从的五个实用技巧
- 临时笔记, 有意思的东西
- winrar去弹窗广告激活办法!!
- VC调用3dmax自动化对象
- 基于AIC评价指标的逐步回归Python语言实现
- ionic4开发微信小程序_15个适用于Ionic应用程序开发人员的资源
- 肠道核心菌属——优/真杆菌属(Eubacterium),你为什么要关心它?
- 谈谈技术债务的定义,影响以及管理
- java高级编程之IO流
- 【无人驾驶系列五】GPS及惯性传感器在无人驾驶中的应用
- 精简jre(JDK6瘦身)