第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数...

2023-05-16

前言

       如果你不想要编译器帮你自动生成的拷贝机制 (参考前文),那么你应当明确的拒绝。

       如何拒绝?这便是本文要解决的主要问题。

问题描述

       当你定义了一个类,而这个类中各对象之间也是封装的 - 禁止同类对象之间的相互赋值以及复制,那么你需要屏蔽掉编译器帮你生成的拷贝构造函数以及赋值运算符。

       在许多代码中,会看到通过将拷贝构造函数和赋值运算符重载函数声明为私有且不予实现来实现这个功能。然而,这不是最科学的做法。

       因为这没有做到真正的屏蔽:你在自己的成员函数中,或者友元函数中仍然可以调用这两个私有函数,编译器将不会报错。

       也许你会狡辩,这种做法的私有拷贝构造函数以及赋值运算符重载函数都没有实现,编译器会报错。但,报错的不是编译器,是链接器。优质的代码应当将错误尽可能的移至编译期。

科学的做法

       首先专门为阻止拷贝动作设计一个类,如下:


1 class Uncopyable {
2 protected:
3     Uncopyable() {}    // 允许派生类对象构造,析构。
4     ~Uncopyable() {}
5 private:
6     Uncopyable(const Uncopyable &);    // 但阻止拷贝
7     Uncopyable& operator=(const Uncopyable &);
8 };  

       如果你需要屏蔽掉某个类的拷贝机制,需要做的只是私有继承该类:


1 1 class A : private Uncopyable {
2 2     //......
3 3 };  

       类 A 的拷贝函数被顺利屏蔽掉了。当 A 类对象发生拷贝或赋值,必然会先去执行其父类 Uncopyable 类的拷贝构造函数或重载赋值运算符函数。但这两个函数在 Uncopyable 中已经被声明为私有了,因此编译器会不通过。

小结

       这种做法的科学依据在于,目标类的成员函数或者友元函数也都无法调用被屏蔽的拷贝构造函数和赋值运算符重载函数。

       如果调用发生,报错的也是编译器,而非链接器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数... 的相关文章

  • 暗渡陈仓:用低功耗设备进行破解和渗透测试

    信息安全技术丛书 暗渡陈仓 xff1a 用低功耗设备进行 破解和渗透测试 Hacking and Penetration Testing with Low Power Devices 美 菲利普 布勒斯特拉 xff08 Philip Pol
  • EPG

    简介 EPG 是Electronic Program Guide的 英文缩写 xff0c 意思是电子节目菜单 IPTV所提供的各种业务的索引及导航都是通过 EPG系统来完成的 IPTV EPG实际上就是 IPTV的一个门户系统 EPG系统的
  • 什么是寄存器

    我们看到的 STM32 芯片已经是已经封装好的成品 xff0c 主要由内核和片上外设组成 若与 电脑类比 xff0c 内核与外设就如同电脑上的 CPU 与主板 内存 显卡 硬盘的关系 STM32F429 采用的是 Cortex M4 内核
  • 编程-函数栈与进程栈

    https mp weixin qq com s QsY3cwpLQ5qthgrpZJkBng 一 代码编程极简进化史 从纸带上的机器码 xff0c 到汇编语言算是比较自然而然的变化 因为汇编语言每一条指令即对应着一条机器指令码 汇编中的j
  • 开源飞控

    OpenPilot 官网 xff1a http www openpilot org WiKi xff1a http wiki openpilot cc 论坛 xff1a http bbs tryfly cn forum php KK飞控 M
  • Windows Server 2008r2 取消屏幕自动锁定

    Windows Server 2008r2取消屏幕锁定 企业网管在日常维护服务器的时候 xff0c 往往不会每次有问题都去机房处理 xff0c 一般都是通过远程连接到服务器终端上 xff0c 但是很多企业网管总是被Server 2008服务
  • JAVA中对List<Map<String,Object>>中的中文汉字进行排序

    转载于 xff1a http blog csdn net flykos article details 54631573 参考 xff1a http www jb51 net article 88710 htm 本篇文章 xff0c 对中文
  • Python maketrans() 方法

    描述 Python maketrans 方法用于给 translate 方法创建字符映射转换表 可以只接受一个参数 xff0c 此时这个参数是个字典类型 xff08 暂不研究这种情况 xff09 对于接受两个参数的最简单的调用方式 xff0
  • vue-cli3 项目从搭建优化到docker部署

    项目地址 vue cli3 project 欢迎 star 原文地址 www ccode live lentoo list 1 创建一个vue项目 相信大部分人都已经知道怎么创建项目的 xff0c 可以跳过这一节 xff0c 看下一节 1
  • 解决Linux:No route to host

    在VPS上面配置了某分布式服务 xff0c 死活跑不起来 xff0c 该配置的都配置了 xff0c 真是见鬼了 日志里面很多 xff1a No route to host 但是 xff0c 我能ping通 xff0c 为了排除是程序自身原因
  • 停止linux的ntpd服务

    service ntpd status service ntpd stop service ntpd status chkconfig list ntpd chkconfig level 35 ntpd off chkconfig list
  • 09.打印“caoliuzhenhao”

    printf 命令用于格式化输出 xff0c 是echo命令的增强版 它是C语言printf 库函数的一个有限的变形 xff0c 并且在语法上有些不同 注意 xff1a printf 由 POSIX 标准所定义 xff0c 移植性要比 ec
  • http://www.seattletechinterviews.com/

    http www seattletechinterviews com 转载于 https www cnblogs com kungfupanda p 6503751 html
  • inode的若干锚

    insert inode hash hash an inode 64 inode unhashed inode 64 hashval unsigned long value used to locate this object in the
  • Swap Nodes in Pairs

    Given a linked list swap every two adjacent nodes and return its head For example Given 1 gt 2 gt 3 gt 4 you should retu
  • Redis

    介绍 官网 xff1a http redis io Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 xff0c 并提供多种语言的API 从2010年3月15日起 xff0c
  • 转 C++常用的类库

    1 系统和网络编程库 xff1a ACE 除了ACE之外 xff0c 还有很多系统和网络编程方面的程序库 比如在线程库方面 xff0c 还有ZThread boost thread xff0c 如果放大到C C 43 43 领域 xff0c
  • Linux零碎记录之ulimit【堆栈大小、stack size、进程数限制、文件句柄限制、linux用户空间限制】...

    写了个小程序 本来打算写个hash表的 xff0c 但是出现 段错误 include lt stdio h struct a char a 4096 char a1 4096 char a2 4096 char a3 4096 int ma
  • 串口扫盲十一:RS-232至RS-485RS-422接口的智能转换器

    摘要 详细地介绍了如何从RS 232信号线上高效率地产生电源 如何实现RS 232接口与RS 485RS 422接口的智能转换 同时 也给出了具体的硬件设计及软件设计方法 关键词 RS 232 RS 485RS 422 接口 智能转换器 随
  • strcpy()/strcat()

    为什么80 的码农都做不了架构师 xff1f gt gt gt char p1 15 61 34 abcd 34 p2 61 34 ABCD 34 str 50 61 34 xyz 34 strcpy str 43 2 strcat p1

随机推荐

  • 路由器逻辑接口配置总结

    逻辑接口配置 1 Loopback接口配置 Loopback 回环 接口是完全软件模拟的路由器本地接口 xff0c 它永远都处于UP状态 发往Loopback接口的数据包将会在路由器本地处理 xff0c 包括路由信息 Loopback接口的
  • 联合体、结构体简析

    1 联合体 结构体定义 联合体 xff1a 在进行某些算法的C语言编程的时候 xff0c 需要使几种不同类型的变量存放到同一段内存单元中 也就是使用覆盖技术 xff0c 几个变量互相覆盖 这种几个不同的变量共同占用一段内存的结构 xff0c
  • tcpdump抓包命令

    该命令是抓包分析工具 xff0c 可以将数据包的头或者是整个包抓取下来进行分析 xff0c 支持针对特定协议 主机进行过滤 xff0c 同时支持逻辑操作 抓取本机第一个网络接口通常是eth0上所有的包 tcpdump 抓取指定指定网卡上的的
  • rundll32.exe命令使用大法

    lt DOCTYPE html PUBLIC WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml strictdtd gt Rundll32 exe是什么 xff1f 顾名思意 xff0c 执行3
  • sftp

    引述自 xff1a http cs ecust edu cn snwei studypc oftencommand ftp htm sftp的命令格式为 xff1a sftp v d i n g hostname v 显示远程服务器的所有响
  • L298N接线图

    转载于 https my oschina net surenpi blog 481745
  • 大数据:Hive - ORC 文件存储格式

    一 ORC File文件结构 ORC的全称是 Optimized Row Columnar xff0c ORC文件格式是一种Hadoop生态圈中的列式存储格式 xff0c 它的产生早在2013年初 xff0c 最初产生自Apache Hiv
  • WPF RichTextBox 禁止换行

    原文 WPF RichTextBox 禁止换行 这个问题困扰了好久 xff0c 进过不断的努力 xff0c 终于解决了 lt RichTextBox Margin 61 34 0 44 10 0 34 Name 61 34 codeText
  • 浅谈微信小程序用setStorage和getStorage缓存和获取数据

    缓存数据 每个微信小程序都可以有自己的本地缓存 xff0c 可以通过 wx setStorage xff08 wx setStorageSync xff09 wx getStorage xff08 wx getStorageSync xff
  • 微信扫码登录是如何实现的?

    网页版微信刚推出时 xff0c 无数人被它的登录方式惊艳了一下 xff0c 不需要输入用户名密码 xff0c 打开手机微信扫一扫 xff0c 便自动登录 从原理上讲 xff0c 二维码只能是一段文本的编码 xff0c 如何用它实现快捷登录的
  • python - http请求带Authorization

    背景 接入公司的一个数据统计平台 xff0c 该平台的接口是带上了Authorization验证方式来保证验签计算安全 方法 其实很简单 xff0c 就是在header中加入key 61 Authorization xff0c value是
  • element设置设置日期0点到23:59:59

    2019独角兽企业重金招聘Python工程师标准 gt gt gt js方式 var start 61 new Date new Date new Date toLocaleDateString getTime 当前日期0点到23 xff1
  • 一张图看懂亮度、明度、光度、光亮度、明亮度

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 亮度 明度 光亮度 xff0c Luminance和Brightness lightness其实都是一个意思 xff0c 只是起名字太难了 提出一个颜色模型后 xff0c
  • prfpset文件怎么导入pr?pr预设如何导入?

    prfpset文件是一种可以导入到Adobe Premiere Pro中使用的预设文件 xff0c 导入后即可为你的画面进行调色 xff0c 不同的pr预设拥有不同的调色效果 xff0c 那么prfpset格式预设怎么打开 xff1f pr
  • How does java technology relate to cloud computing?

    Java Paas shootout 64 IBM developer Cloud computing is always a hot topic around IT field today How can it bring to us H
  • LCD1602A接线图

    转载于 https my oschina net surenpi blog 481697
  • 3dmax2020卸载/安装失败/如何彻底卸载清除干净3dmax2020注册表和文件的方法

    3dmax2020提示安装未完成 xff0c 某些产品无法安装该怎样解决呢 xff1f 一些朋友在win7或者win10系统下安装3dmax2020失败提示3dmax2020安装未完成 xff0c 某些产品无法安装 xff0c 也有时候想重
  • matlab练习程序(生成黑白网格)

    提供了两种生成方法 xff0c 一个是自己编程实现 xff0c 比较灵活 xff1b 另一个是调用系统的checkerboard函数 xff0c 似乎只能生成8 8网格 至于用途 xff0c 也许可以用来下国际象棋 自己函数生成 xff1a
  • git 基本操作

    配置 user name user email git config global user name 34 fatdai 34 git config global user email 34 1012607376 64 qq com 34
  • 第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数...

    前言 如果你不想要编译器帮你自动生成的拷贝机制 参考前文 xff0c 那么你应当明确的拒绝 如何拒绝 xff1f 这便是本文要解决的主要问题 问题描述 当你定义了一个类 xff0c 而这个类中各对象之间也是封装的 禁止同类对象之间的相互赋值