Effective C++(二):构造/析构/赋值运算

news2025/2/5 6:43:51

个人读书记录,不适用教学内容。

目录

条款05:了解C++默默编写并调用了哪些函数

条款06:若不想使用编译器自动生成的函数,就该明确拒绝

条款07:为多态基类声明virtual析构函数

条款08:别让异常逃离析构函数

条款09:绝不在构造和析构过程中调用virtual函数

条款10:令operator=返回一个reference to *this

条款11:在operator=中处理“自我赋值”

条款12:复制对象时勿忘每一个成分


条款05:了解C++默默编写并调用了哪些函数

  • default 构造函数
  • copy构造函数
  • copy assignment操作符
  • 析构函数

原文如下,值得学习:

“什么时候empty class(空类)不再是个空类?在C++处理过它后。”

有道理,这里我也加一句,什么时候C++会处理过它?是在我们使用它的时候。也就是这个类之前就是一个trivial类。

“如果你自己没声明,编译器就会为它声明一个copy构造函数,一个copy assignment操作符和一个析构函数。如果没有,也会声明一个default 构造函数。所有这些函数都是public且inline的”

书中原文剩下部分的内容大抵可总结如下:

  • 编译器为我们生成的函数都是non-virtual的(省内存)
  • 对非内置类型的copy,会以拷贝变量内的每一个bits来完成初始化(无奈之举)
  • 如果拷贝中有references,那么编译器会拒绝这个行为(引用不能更改)
  • 如果拷贝中有const,也会拒绝(const不能更改)
  • 如果base class中的copy操作符函数是private,那编译器不会为这个类生成copy操作符函数

条款06:若不想使用编译器自动生成的函数,就该明确拒绝

省流:将对应的成员函数声明为private,并且不予实现。或者如下:

 

条款07:为多态基类声明virtual析构函数

其实这个学过C++都应该知道的。

这里从书中get了一个新知识:string和STL容器都不被设计作为base class来使用。

另外书中的一些内容可以感觉到有些过时,提到了final,在C++11中引入了final这一关键字。而书中说C++并没有这样的关键字。

条款08:别让异常逃离析构函数

这里暂时存疑

条款09:绝不在构造和析构过程中调用virtual函数

“在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class。(比起当前执行构造和析构的那层)。”

所以说即便我们调用了也不会得到想要的结果。

根本原因如下:

derived class构造期间,在构造base class的时期,其对象类型是base class而不是derived class

也好理解,你说这derived还没构造完呢,就开始调用virtual函数了,这能安全么?出于设计者的角度自然不会这么做,所以视derived不存在,而视为base存在。

条款10:令operator=返回一个reference to *this

没啥好说的

条款11:在operator=中处理“自我赋值”

简而言之就是说如果=两边是同一个对象(值)怎么办。

尤其涉及到在堆中分配的对象,如果一上来就把原来的指针delete掉,想去赋一个新对象,但此时新旧对象却是同一个。那就麻烦了。

所以需要特别判断一下:

或者做一个副本

 

条款12:复制对象时勿忘每一个成分

感觉没有太多好说的,直接解释原文:

  • 确保复制“对象内所有成员变量”及“所有base class成分“
  • 不要尝试以某个copy函数实现另一个copy函数,应该将共同部分放到第三个函数中,并有两个copy函数共同调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设备巡检系统哪个软件好?

本文将介绍:1、好用的设备巡检系统,2、评价设备巡检系统好用的标准;3、做好设备管理的几大关键 现今许多企业,尤其是制造业,规模日趋机械化、自动化、大型化、高速化和复杂化,对设备巡检工作的要求越加精细…

微信小程序网络请求

小程序的网络请求的文档是很少的,只提供了API,例子也不举。 基本使用 最简单的使用如下: 就是调用wx.request方法,这个方法已经能够应付大部分的网络请求了。 onLoad() {wx.request({url: http://123.207.32.32:1888/api/city/a…

我学python的那段日子(五)python中的函数

python中的函数 1.1自定义函数 1.1.1 函数的定义 ​ 和Java一样,python也有内置函数和自定义函数,内置函数是python已经定义好的函数,而自定义函数则是我们根据需要自己定义的函数。 ​ 语法 def 函数名称(参数): ​ 函数体 ​ 其中参数的…

一个转行学习前端的初学者,应该如何计划自己的学习规划?

就目前的发展来看,在语言排行中,前端多年霸主的地位还未被撼动,前端语言的特点就注定了很多公司会选用它,强大的第三方库使前端正在web端的强大无法被替代。目前由于大数据,人工智能的发展,互联网成为了发展…

Bootstrap5 复选框与单选框

如果您希望用户从预设选项列表中选择任意数量的选项&#xff0c;可以使用复选框&#xff1a; 实例 <div class"form-check"> <input class"form-check-input" type"checkbox" id"check1" name"option1" value&quo…

【Python机器学习】朴素贝叶斯分类的讲解及预测决策实战(图文解释 附源码)

需要代码请点赞关注收藏后评论区留言私信~~~ 朴素贝叶斯分类 朴素贝叶斯&#xff08;nave Bayes&#xff09;分类是基于贝叶斯定理与特征条件独立假定的分类方法。 设试验E的样本空间为S&#xff0c;A为E的事件&#xff0c;B_1&#xff0c;B_2&#xff0c;⋯&#xff0c;B_n为…

深入浅出理解Java并发AQS的共享锁模式

自定义共享锁例子 首先我们通过AQS实现一个非常最最最轻量简单的共享锁例子&#xff0c;帮助大家对共享锁有一个整体的感知。 Slf4j public class ShareLock {/*** 共享锁帮助类*/private static class ShareSync extends AbstractQueuedSynchronizer {private int lockCount…

C. Sequence Pair Weight(数学贡献法)

Problem - 1527C - Codeforces 序列的权重被定义为具有相同值&#xff08;aiaj&#xff09;的无序索引对&#xff08;i,j&#xff09;&#xff08;这里i<j&#xff09;的数量。例如&#xff0c;序列a[1,1,2,2,1]的权重是4&#xff0c;具有相同值的无序索引对的集合是&#x…

结构篇-适配器模式

文章目录一、跨越鸿沟靠适配二、插头与插孔的冲突1.三相插孔接口2.两相插孔接口3.电视机机类TV4.客户端类二、通用适配1. 适配器2.客户端类三、专属适配1.电视机专属适配器2.客户端类总结1. 对象适配器2. 类适配器总结适配器模式(Adapter)通常也被称为转换器&#xff0c;顾名思…

数字孪生炒得火热,但好像对企业发展还没有任何实质性的突破,是否只是表面功夫?

首先&#xff0c;什么是数字孪生&#xff1f; ​ 数字孪生是充分利用物理模型、传感器更新、运行历史等数据&#xff0c;集成多学科、多物理量、多尺度、多概率的仿真过程&#xff0c;在虚拟空间中完成映射&#xff0c;从而反映相对应的实体装备的全生命周期过程。数字孪生是一…

const成员,流插入,流提取重载,初始化列表!(6千字长文详解!)

c详解之const成员&#xff0c;流插入&#xff0c;流提取重载&#xff0c;初始化列表&#xff01; 文章目录c详解之const成员&#xff0c;流插入&#xff0c;流提取重载&#xff0c;初始化列表&#xff01;<< 流插入 和 >> 流提取的重载解决共有成员函数问题链式访问…

实用!7个强大的Python机器学习库!⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 机器学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/41 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/412 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

如何借助扬尘视频监测系统开展扬尘污染防控工作?

一、方案背景 目前&#xff0c;跟随国家快速发展的步伐&#xff0c;城市化建设也在飞速发展&#xff0c;各种建设工程遍地开花。如何更好抵管理施工扬尘&#xff0c;杜绝各种违规及不文明现象&#xff0c;一直是施工企业、政府管理部门关注的焦点。 二、系统介绍 环境扬尘视频…

手把手教你一套完善且高效的k8s离线部署方案

作者&#xff1a;郝建伟 背景 面对更多项目现场交付&#xff0c;偶而会遇到客户环境不具备公网条件&#xff0c;完全内网部署&#xff0c;这就需要有一套完善且高效的离线部署方案。 系统资源 编号主机名称IP资源类型CPU内存磁盘01k8s-master110.132.10.91CentOS-74c8g40g0…

SkeyeVSS储备地块可视化管理信息系统 助力土地批后全程监管解决方案

一、方案背景 近年来&#xff0c;储备地块经常遭遇倾倒渣土、隐蔽性私搭乱建等违法行为的侵害&#xff0c;在违法行为发生之后又面临追责难度大、效率低的问题&#xff0c;因此可视化监管系统的建设将有效地解决单纯靠人力巡查、巡查时间长、巡查效率低以及发现侵害行为后追责…

阿里云轻量服务器--Docker--Mqtt(eclipse-mosquitto)安装

1 获取镜像&#xff1a; docker pull eclipse-mosquitto:1.6.14查看获取的镜像&#xff1a; docker images 2 安装&#xff1a; 2.1 新建日志和数据目录&#xff1a; # 配置文件存放 mkdir -p /root/mosquitto/config # 数据文件存放 mkdir -p /root/mosquitto/data # 日志文…

安全智能分析技术 神经网络架构搜索

神经网络架构搜索 定义内涵 神经网络架构搜索是为给定数据集自动找到一个或多个架构的任务&#xff0c;这些架构将为给定 的数据集生成具有良好结果的模型&#xff0c;其本质是在高维空间的最优参数搜索问题。 技术背景 深度学习模型的使用越来越大众化&#xff0c;在很多行…

论多线程之中断篇

线程中断一. 启动线程的方式二. 安全中断三. 线程的补充知识3.1 线程常用方法和线程的状态&#xff1a;3.2 线程的优先级概念&#xff1a;一. 启动线程的方式 新启线程的方式 继承Thread类实现Runnable接口&#xff0c;实际上也是通过Thread类来进行线程的操作的 package cn.…

嵌入式:数据处理指令详解

文章目录数据处理指令的特点数据处理指令的汇编格式数据处理指令&#xff0d;指令表&#xff08;1&#xff09;ADD、ADC、SUB、SBC、RSB和RSC&#xff08;2&#xff09;AND、ORR、EOR和BIC&#xff08;3&#xff09;MOV和MVN&#xff08;4&#xff09;CMP和CMN&#xff08;5&am…

如何下载及安装BIGEMAP GIS Office

如何下载及安装BIGEMAP GIS Office 发布时间&#xff1a;2018-01-17 版权&#xff1a; 本产品支持主流winodws操作系统&#xff08;xp sp3,vista,windows 7,windows 8及windows 10 11&#xff09;&#xff0c; 可通过访问Bigemap官网(BIGEMAP-卫星地图_高清卫星地图制图软件_…