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

news2025/2/6 3:00:25

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

目录

条款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对象‘的初始化顺序并无明确定义”

这一问题。

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

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

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

相关文章

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.7 Sentinel的线程隔离与Hystix的线程隔离有什么差别

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.7 Sentinel的线程隔离与Hystix的线程隔离有什么差别?54.7.1 Sentinel与Hystix…

计算机毕设Python+Vue学生社团管理(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

基于蓝牙AOA技术的智慧医疗解决方案

1. 应用背景 医院需求分析在医疗体制不断完善的今天,医院的信息化程度已经大大提高,现在的大型医院都已经用上了医院信息系统(HIS),它是医院管理同现代软件技术、网络技术相结合的产物。应用HIS系统后,确实方便了群众就医&#x…

【docker】DockerFile

一、DockerFile dockerfile是用来构建docker镜像的文件!命令参数脚本! 构建步骤: 编写一个dockerfile文件docker build构建成为一个镜像docker run 运行镜像docker push 发布镜像(DickerHub 阿里云镜像仓库!&#x…

【Python机器学习】分类算法任务、分类模型评价指标详解(图文解释)

分类任务 设样本集S{s_1,s_2,…,s_m}包含m个样本,样本s_i(x_i,y_i)包括一个实例x_i和一个标签y_i,实例由n维特征向量表示,即x_i(x_i^(1),x_i^(2),…,x_i^(n))。 在学习过程,分类任务将样本集中的知识提炼出来,形成模…

进程程序替换

文章目录进程程序替换是什么概念原理为什么要进行程序替换如何进行程序替换使用接口execl引入进程创建execvexeclpexecvpexecle进程程序替换是什么 概念 通过之前的学习,我们知道子进程执行的是父进程的代码片段。 如果我们想让创建出来的子进程,执行的…

PPT丑哭了?这个工具做报表上手更简单,效果更酷炫,送40套模板

如果2023年你还做着万年不变的饼图、折线图,你将会再次错失涨薪的机会! 数据有多重要,已经不言而喻,随之而来的是职场对数据分析与展示能力的要求也越来越高。 但是你是不是这种情况?一用图表就只会用饼图、折线图&a…

ice.js 3 的体验优化策略介绍

ice.js 3 已经正式发布,期待更多的业务来使用、验证,一起建设更好的用户体验。ice.js 3 地址:https://v3.ice.work/本文将简单介绍 ice.js 3 中已经落地和正在进行的一些体验优化策略,以供探讨。Chrome 在去年成立了一个名为 Auro…

Allegro如何导出光绘和颜色设置到其它单板上操作指导

Allegro如何导出光绘和颜色设置到其它单板上操作指导 Allegro有个非常强大的功能,支持把光绘设置和颜色设置等等参数从一个PCB导入到另外一块PCB中,如下图 具体操作如下 导出参数设置,file-export选择Parameters

优优绿能冲刺创业板:年营收4.3亿估值25亿 小米是股东

雷递网 雷建平 12月19日深圳市优优绿能股份有限公司(简称:“优优绿能”)日前递交招股书,准备在深交所创业板上市。优优绿能计划募资7亿元,其中,2.7亿元用于深圳市优优绿能股份有限公司充电模块生产基地建设…

[附源码]计算机毕业设计Python二次元信息分享平台的设计及实现(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等…

数商云采购管理系统支付结算功能详解,实现建筑工程企业采购业务智能化管理

建筑工程行业企业过去受技术、场地等限制,一直采用传统的采购方式,再加上整个行业内部信息相对割裂、采购面临层层传播、中间沟通亦面临多层税费等问题,为建筑工程采购工作增添了不少困难。随着互联网时代的发展,在大数据、云计算…

云原生之使用Docker部署Dashdot服务器仪表盘

云原生之使用Docker部署Dashdot服务器仪表盘一、Dashdot介绍二、检查本地系统环境1.检查本地系统版本2.检查docker状态3.检查docker版本三、下载Dashdot镜像四、部署Dashdot应用1.创建安装目录2.创建Dashdot容器3.查看Dashdot容器状态五、访问Dashdot一、Dashdot介绍 Dashdot是…

未来十年,Python将如何发展?

随着人工智能的发展和普及,作为人工智能首选语言的Python,也越来越受到大家的欢迎。可能也有很多同学想知道未来十年,Python会有什么样的发展。如果发展得非常好,就值得我们亲自去机构进行考察试学,值得我们花时间、花…

克隆一个虚拟机

文章目录1、打开虚拟机2、选择要克隆的虚拟机3、选择当前状态4、创建完整克隆(链接克隆会导致本体和克隆体在一些资源上是公用的,不太合适)5、重命名克隆虚拟机的名字,并且更改克隆的虚拟机所在位置7、登录这个虚拟机8、因为两个虚…

[附源码]计算机毕业设计Python防疫物资捐赠(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

[附源码]计算机毕业设计Node.jswai音乐网站(程序+LW)

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

Docker-Nacos的持久化和集群部署

目录 一,准备工作 1.1 修改虚拟机内存大小 二,docker mysql:5.7的持久化存储及远程连接 1.1 下载相关镜像 1.2 在宿主机中相关目录,用于挂载容器的相关数据 1.3.创建mysql5.7容器 1.4.修改mysql允许Navicat远程连接 1.5 创建数据库nacos_…

实用指南:手把手搭建坚若磐石的DevSecOps框架

长期以来,安全问题一直被当作软件开发流程中的最后一步。开发者贡献可以实现软件特性的代码,但只在开发生命周期的测试和部署阶段考虑安全问题。随着盗版、恶意软件及网络犯罪事件飙升,开发流程需要做出改变。 开发过程中的“安全左移”是…

基于java的fofa爬虫

文章目录下载链接介绍使用方法关键字生成器API爬虫Fofa爬虫导出功能修改配置文件下载链接 github : https://github.com/13337356453/FofaSpidercsdn : https://download.csdn.net/download/realmels/87320066 介绍 顾名思义,fofa爬虫。可以用api爬,也…