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

2023-05-16

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

目录

条款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函数共同调用

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

Effective C++(二):构造/析构/赋值运算 的相关文章

  • 【Yolo】YoloV5训练自定义模型

    Yolo Jetson Orin Nano下部署 YoloV5 上一篇博文主要记录了在Jetson Orin Nano下部署YoloV5环境 xff0c 并运行了yoloV5n pt模型 xff0c 本篇在上一篇的基础上 xff0c 进一步
  • ModSim基本使用(Modbus模拟器)

    ModSim下载地址 打开软件 1 模拟modbus tcp 创建Modbus TCP连接 设置连接端口 xff0c 默认502 xff0c 点击 OK 就自动创建 新建 新建界面如下 xff08 可新建多个界面 xff0c 同时模拟500
  • [java]final关键字的几种用法

    在java的关键字中 xff0c static和final是两个我们必须掌握的关键字 不同于其他关键字 xff0c 他们都有多种用法 xff0c 而且在一定环境下使用 xff0c 可以提高程序的运行性能 xff0c 优化程序的结构 下面我们
  • Ubuntu系统安装分区设置

    1 创建主分区 xff1a 主分区 xff0c 用于存放系统 20G 主分区 空间起始位置 Ext4日志文件系统 2 创建swap分区 xff1a 逻辑分区 大小设置为电脑内存大小 xff0c 2G xff1b 2048MB 逻辑分区 空间
  • 重装Win+Ubuntu双系统中的Ubuntu

    重装双系统中的Ubuntu 想把玩Linux xff0c 又想保留Windows xff0c 有几种途径 1 使用虚拟机软件如 Vmware Virtual Box等 2 再装一个Ubuntu系统成为Win 43 Ubuntu双系统 专业原
  • ROS打不开gazebo的问题

    前段时间 xff0c 将师兄的Ros工程搬到我的电脑上运行 xff0c 但是一直打不开gazebo xff0c gazebo一直卡在了黑屏的页面 同样的工程 xff0c 在师兄电脑上是可以跑的 xff0c 并不是ros工程的问题 于是我让其
  • 02 四旋翼无人机的组成与拼装(上)

    02 四旋翼无人机的组成与拼装 xff08 上 xff09 目录1 总体介绍2 布局设计2 1 机身布局2 1 1 交叉形2 1 2 环形 比较少2 1 3 可折叠交叉形 2 2 旋翼安装2 2 1 常规布局 VS 共轴双桨2 2 2 力矩

随机推荐

  • 03 四旋翼无人机的组成与拼装(下)

    03 四旋翼无人机的组成与拼装 xff08 下 xff09 目录1 螺旋桨1 1 作用1 2 参数1 型号2 弦长3 转动惯量 重要 4 力效5 桨叶数6 安全转速7 静平衡与动平衡 2 电机2 1 作用2 2 工作原理2 2 1 相位切换
  • 05 无人机动态模型

    05 无人机动态模型 目录1 无人机动态模型简介1 1 无人机动态模型2 刚体运动与姿态表示2 1 如何描述一个刚体2 2 地球坐标系与机体坐标系2 3 坐标系旋转与向量旋转的区别2 4 旋转轴与旋转角2 5 欧拉角 xff08 1 xff
  • 06 飞行控制器

    06 飞行控制器 目录1 XTDrone动态模型代码讲解2 自动控制初步2 1 自动控制概述多旋翼飞行器控制实例 2 2 控制性能2 3 传递函数与状态方程示例 3 PID控制器3 1 PID控制器3 2 比例项调节3 3 积分项调节积分饱
  • Django-注册用户时候保存密码加密问题

    1 导入django内置模块 注册用户时候保存密码加密问题 from django contrib auth hashers import make password 2 获取post参数并创建用户并对密码加密 email 61 reque
  • FrankMocap

    FrankMocap 摘要介绍相关工作3D参数化人体模型单图像3D人体姿势估计单图像3D手姿势估计身体和手的联合3D姿势估计 方法SMPL X模型概述3D手估计模块手模块结构训练方法数据集预处理训练数据增强 3D身体估计模块整个身体集成模块
  • TortoiseGit间接处理linux目录下的仓库,用到window映射linux目录方案

    原始需求 习惯用TortoiseGit查看git仓库信息和历史日志 xff0c 但这个工具只支持window xff0c 我希望linux也能用虽然有其他linux的GUI的git工具 xff0c 但我用到的linux基本都是无界面版本 x
  • 关于C中的Int类型到底是几个字节。

    C语言标准是这样规定的 xff1a int最少16位 xff08 2字节 xff09 xff0c long不能比int短 xff0c short不能比int长 xff0c 具体位长由编译器开发商根据各种情况自己决定 在32位x86处理器上
  • Jetson TX2开启高功耗模式

    Jetson TX2 工作模式及相应的CPU和GPU频率 xff1a 上电的时候 xff0c 默认最低功耗模式1 xff0c 风扇不转 1 直接运行home下的jetson clocks sh xff0c 开启最大频率 sudo jetso
  • 在失望中重找希望——我的2013年工作总结

    时间过的真的是快 来广州已整整工作了一年啦 从2012年长沙工作离职后 为了我的女朋友 我毅然踏上了南下广州的征途 来到羊城后 很快 xff0c 一个礼拜就找到了现在工作的这家公司 现在回想一下 真觉得当初没有好好斟酌一下 2013年里 x
  • 【100%有效】解决AndroidStudio 控制台编译输出中文乱码,亲测解决!

    背景 在AndroidStudio中新建了一个Java Module xff0c 但是点击 Run app 之后 xff0c Build Output 控制台输出的中文都是乱码 xff0c 都是问号一样的字符 google了很多方法 xff
  • 图传数传模块

    文章中写了关于如何调摄像头的程序 https blog csdn net JanKin BY article details 103929781 如何将摄像头获取的视频发送到远端实现图传数传 xff0c 按RJ45的网口线路排布 xff0c
  • TX2系统烧录jetpack4.6 ubuntu18.04

    sdk版本与系统版本相关 xff0c 下载的4 6为ubuntu 18 04 1 烧录下jeston nvidia官方网站上下载sdk manager Jetson 下载中心 NVIDIA Developer sudo apt instal
  • 如何把UCF101数据集分成训练集和测试集

    34 After extracting the RAR we run this to move all the files into the appropriate train test folders Should only run th
  • 强国的语言与语言强国

    强国的语言与语言强国 作者 xff1a 教育部语言文字信息管理司司长 教育部语言文字应用研究所所长 中国社会科学院研究生 李宇明 理论上语言是一律平等的 xff0c 现实中语言是有强有弱的 语言的强弱与语言所属社团的强弱盛衰呈正相关 古罗马
  • 基于时间序列的异常检测算法小结

    最近在学习基于时间序列的异常检测算法 xff0c 看到一篇好文 xff0c 原文博客地址 xff1a http blog rexking6 top 2018 11 05 基于时间序列的异常检测 以下是相应的知识 xff1a 简介 搜罗了网上
  • Python函数

    定义函数 def def是定义define definition 的缩写 Python中使用def来定义函数 xff0c 函数的命名规则和变量的命名规则相同 函数名后的 xff08 xff09 用于传入参数 xff0c 函数体以冒号 xff
  • JDK和SDK的区别

    JDK和SDK的区别如下 xff1a 1 SDK是Software Development Kit的缩写 xff0c 中文意思是 软件开发工具包 这是一个覆盖面相当广泛的名词 xff0c 可以这么说 xff1a 辅助开发某一类软件的相关文档
  • 【无标题】

    GANimator Neural Motion Synthesis from a Single Sequence This repository provides a library for novel motion synthesis f
  • Effective C++(一):让自己习惯C++

    个人读书记录 xff0c 不适用教学内容 目录 条款01 xff1a 视C 43 43 为一个语言联邦 条款02 xff1a 尽量以const xff0c enum xff0c inline替换 define 条款03 xff1a 尽可能使
  • Effective C++(二):构造/析构/赋值运算

    个人读书记录 xff0c 不适用教学内容 目录 条款05 xff1a 了解C 43 43 默默编写并调用了哪些函数 条款06 xff1a 若不想使用编译器自动生成的函数 xff0c 就该明确拒绝 条款07 xff1a 为多态基类声明virt