有时候,进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的对象,也就是对该类对象做副本没有任何意义.

因此,需要限制编译器自动生动的拷贝构造函数和赋值构造函数.一般参用下面的宏定义的方式进行限制,代码如下:

// 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宏的作用相关推荐

  1. 【Android NDK 开发】JNI 方法解析 ( JNIEXPORT 与 JNICALL 宏定义作用 )

    文章目录 I . JNIEXPORT 与 JNICALL 宏定义 II . JNIEXPORT 与 JNICALL 宏定义说明 ( Windows 平台 ) III . JNIEXPORT 与 JNI ...

  2. 空的宏定义作用及常见用法

    空的宏定义作用及常见用法 我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SI ...

  3. Linux字符设备驱动中container_of宏的作用

    Linux字符设备驱动中container_of宏的作用 首先看看这个宏的原型: container_of(ptr,type,member) 功能:根据一个结构体变量中的一个成员变量的指针来获取指向整 ...

  4. 关于QT_BEGIN_NAMESPACE宏的作用

    最近注意到QT_BEGIN_NAMESPACE宏,具体如下: #ifndef PREVIEWWINDOW_H #define PREVIEWWINDOW_H#include <QWidget&g ...

  5. 《编码规范和测试方法——C/C++版》作业 ·003——宏定义作用整理、设计删除数组元素的函数

    文章目录 一.宏定义(#define)的作用 1.普通宏 2.带参宏 [注]:特殊用法 3.其他用法和注意点 二.实际问题(函数设计) 1.原题 2.题解参考 (1).面向过程的设计 (2).面向对象 ...

  6. LINUX C编程中_REENTRANT宏的作用

    在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享.在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变.类似的问题还存在于fputs之类的函数中,这些函 ...

  7. c语言宏替换作用,C语言中,宏替换的替换规则

    简单来说:宏定义又称为宏代换.宏替换,简称"宏".是C提供的三种预处理功能的其中一种.复杂的请看下面,讲的很全. 下面的带参宏定义,多行宏定义,在Linux内核源码中很多.另外si ...

  8. Cocos2d-x中常用宏的作用

    1. CC_SYNTHESIZE(int, nTest, Test); 相当于: protected: int nTest; public: virtual nTest getTest(void) c ...

  9. 对普通函数、宏函数、内联函数的作用机制的探索

    这次我们来分析的是C/C++程序员经常遇到的问题,如何在普通函数.宏函数.内联函数之间做取舍,其实它们三者之间并没有什么绝对的你好我差的说法,只要掌握了三者的作用机制的话,结合实际情况一般都能做出正确 ...

最新文章

  1. SQL Server 2008备份策略设计下(六)
  2. 三星笔记本FN功能键操作大全
  3. 直播技术:从性能参数到业务大数据,浅谈直播CDN服务监控
  4. 使用Nginx搭建图片服务器(windows7)
  5. Spring注释,我从来没有机会使用第1部分:@primary
  6. 730阵列卡支持多大硬盘_3分钟告诉你:OPPO Reno普通版和旗舰版的差距到底有多大...
  7. Shell脚本监控专线Network并SendEmail报警
  8. echarts中国地图3D各个城市标点demo
  9. 自定义Flutter控件
  10. 企业要做好安全遵从的五个实用技巧
  11. 临时笔记, 有意思的东西
  12. winrar去弹窗广告激活办法!!
  13. VC调用3dmax自动化对象
  14. 基于AIC评价指标的逐步回归Python语言实现
  15. ionic4开发微信小程序_15个适用于Ionic应用程序开发人员的资源
  16. 肠道核心菌属——优/真杆菌属(Eubacterium),你为什么要关心它?
  17. 谈谈技术债务的定义,影响以及管理
  18. java高级编程之IO流
  19. 【无人驾驶系列五】GPS及惯性传感器在无人驾驶中的应用
  20. 精简jre(JDK6瘦身)

热门文章

  1. 【第一章:技术面试通用必备技能】第2节:业务逻辑面试和HR面试
  2. Java —— 日期时间 API
  3. 微信公众号生成临时二维码
  4. Win8 RP微软原版光盘镜像下载大全(含中文版)
  5. ubutnu18.04/20.04 接入HDMI显示器后,在 root用户下不能播放声音之解决方案
  6. gitlab推送钉钉机器人配置
  7. 可能是最有心的微信文章排版规范
  8. LaTeX 文章排版 列表环境 表格环境
  9. Power BI中计算同比、环比
  10. 基于Matlab的电磁场与波“电磁波的入射、反射、透射”仿真—(可实现波形入射反射过程的仿真)