Effective C++(一):让自己习惯C++

2023-05-16

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

目录

条款01:视C++为一个语言联邦

条款02:尽量以const,enum,inline替换#define

条款03:尽可能使用const

所谓的"顶层const"和"底层const"

const返回值

const成员函数

bitwise constness和logical constness

在const和non-const成员函数中避免重复

条款04:确定对象被使用前已先被初始化

不要混淆赋值(assignment)与初始化(initialization)

成员初始化顺序

不同编译单元内的non-local static对象初始化顺序


条款01:视C++为一个语言联邦

感觉没有啥好说的。

  • C++是以C为基础的
  • Objected-Oriented C++。C++是面向对象的语言
  • Template。以泛型编程为特色
  • STL。template程序库

条款02:尽量以const,enum,inline替换#define

说白了就是指出了#define宏替换的种种弊端,所有原因都指向于:

#define使用的名称可能并未进入记号表(symbol table)。(或者叫符号表)

这个原因使得在目标码(也就是代码区)生成多份代码,而const常量就不会这样。(const和#define的区别)

其他的就是尽量用inline函数替换#define定义的函数宏,因为函数用极易因少一个括号等因素而引发错误。

条款03:尽可能使用const

所谓的"顶层const"和"底层const"

第一点需要学习的就是所谓的”顶层const“和”底层const“这个东西,这个知识点在C++primer中令许多人头疼,不说人话。

而在这本书里则讲解的清晰明了:

const语法虽然变化多端,但并不莫测高深。

  • 如果const出现在 * 左边,被指物是常量
  • 如果const出现在 * 右边,表示指针自身是常量
  • 如果const出现在 * 两边,表示被指物和指针都是常量

书中例子:

 

const返回值

防止出现自定义类型中重载运算符发生的错误:

而const会预防这个错误。

const成员函数

有两个作用

  • 控制成员函数是否可以改动对象的成员变量
  • 控制成员函数是否可以操作const对象

bitwise constness和logical constness

在const和non-const成员函数中避免重复

简单说似乎是想利用const_cast来进行代码复用。因为const和non-const版本的成员函数内容十分类似。

说实话目前还真没遇到过类似的问题。。。可能是代码量和项目经验太少了。书中的这个两次cast的做法也没有深刻体会到其意义所在,故先存疑。

条款04:确定对象被使用前已先被初始化

简单说,就是除了内置类型(比如int,char这些)其他的自定义类型都应该由我们负责的、主动的去进行初始化。

不要混淆赋值(assignment)与初始化(initialization)

原文如下,非常值得学习: 

这会导致ABEntry对象带有你期望的指,但不是最佳做法。“C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前在ABEntry构造函数内,theName,theAddress和thePhones都不是初始化,而是被赋值初始化发生的时间更早,发生于这些成员的default函数被自动调用之时(比进入ABEntry构造函数本体的时间更早)。

基于上述原因,推荐使用成员初始化列表来进行初始化,这也是C++面试八股文中常见的知识点:

 效率高的原因是:

  • 之前copy的版本:先调用default构造函数,然后再赋值。所以default构造函数所作的一切都被浪费了
  • 初始化列表:直接利用列表中的成员实参去直接进行copy构造

另外注意一点,在member initialization list中,实参如果置为空,自定义类型会调用default构造函数,内置类型则可能会出现未定义的行为

如果成员变量是const或references,就一定需要初值,不能被赋值

综上所述:最简单的做法就是,总是使用member initialization list

 

成员初始化顺序

  • base class早于derived class被初始化
  • class的成员变量以声明顺序被初始化,即便在member initialization list它们的顺序不同

不同编译单元内的non-local static对象初始化顺序

其实一言简之,就是用单例模式来解决:

“C++对’定义不同编译单元内的non-local static对象‘的初始化顺序并无明确定义”

这一问题。

具体的内容看原书解释吧。这里不多赘述。

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

Effective C++(一):让自己习惯C++ 的相关文章

  • 【原创】树莓派4B + VSCode + MAVSDK-Python + PX4环境搭建

    一 前言 为了在树莓派下开发机载计算机相关功能 xff0c 通过MAVSDK与PX4进行通讯需要搭建相关环境 以往都是东拼西凑最后成功编译运行 xff0c 但过一段时间就得重新来过 xff0c 年龄大了不能老这么折腾 xff0c 这次记录一
  • 【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 尽可能使