Effective C++ 剖析(条款1~9)

news2025/3/18 6:47:19

目录

条款01 视C++为一个语言联邦(C++由几部分组成)

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

条款03 尽量使用 const 

条款04 确定对象再使用前已经被初始化

条款05 了解c++默默编写并调用那些函数

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

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

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

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


条款01 视C++为一个语言联邦(C++由几部分组成)

1. C语言:如内置数据类型,数组,指针等。

2. Object-Oriented C++(面向对象C++):如 class,封装,继承,多态,动态绑定等。

3. 泛型编程。

4. STL。

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

1. 宏定义在编译预处理时被替换,故不方便调试。

2. 宏定义可能导致代码膨胀。

3. 一般宏定义无法限制作用域。

4. 宏函数是直接的代码替换可能带来未预料的问题如:

#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
    int a = 5,b = 0;
    CALL_WITH_MAX(++a,b);//a被累加两次
    CALL_WITH_MAX(++a,b+10);//a被累加一次

条款03 尽量使用 const 

1. 使用 const 可以清楚地表明某个变量、参数或返回值不应该被修改。这有助于其他开发者理解代码的意图,避免无意的修改。

2. const 关键字提供了一种在编译时捕捉错误的方式。如果尝试修改一个 const 对象,编译器将报错,这有助于早期发现潜在的逻辑错误。

条款04 确定对象再使用前已经被初始化

说明:如果你使用了一个未被初始化的对象,可能会导致未定义的行为。(某些情况下c++会自动调用默认构造,但不是所有情况都会这样)

聊聊初始化列表

搞清楚什么是赋值,什么是初始化。

在构造函数体内的赋值并非初始化。类的成员变量一般会先调用默认构造函数才会进入类的构造函数本体。相当于成员变量先调用了一次默认构造,又调了一次赋值构造。而初始化列表的调用时机早于构造函数体执行,相当于直接调用了成员对应的构造函数。

结论:推荐使用初始化列表来初始化成员变量。        

条款05 了解c++默默编写并调用那些函数

书中强调类中的默认构造,默认拷贝构造,默认拷贝赋值,默认析构函数(实际不止这些)

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

说明:比如当我们希望某个对象是独一无二不能被拷贝时我们应该拒绝使用默认构造函数,

c++提供delete关键字来帮助我们做到这一点。

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

基类没有为析构函数加virtual关键字,在使用多态特性时,如果我们 delete 了基类指针,通常派生类部分的资源不会被释放。

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

1. 析构函数绝对不要吐出任何异常,如果一个被析构函数调用的函数可能会抛出异常,析构函数因该捕捉任何异常,然后吞下他们或结束程序。

2.如果用户需要对某个函数运行期间抛出异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。

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

在构造函数和析构函数中调用virtual函数往往不会走派生类的函数体。

因为在派生类构造时一些资源还没初始化,c++不允许这时候调用virtual函数以免发生未预料的事情,同理析构函数中可能有些资源已经被释放了。

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

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

相关文章

Java高频面试之集合-13

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:为什么 hash 函数能降哈希碰撞? 哈希函数通过以下核心机制有效降低碰撞概率,确保不同输入尽可能映…

RGV调度算法(三)--遗传算法

1、基于时间窗 https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_1741880736197&bdQuery%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95 2.2019年MathorCup高校数学建模挑战赛B题 2019-mathorcupB题-环形穿梭机调度模型&a…

YOLOv8轻量化改进——Coordinate Attention注意力机制

现在针对YOLOv8的架构改进越来越多,今天尝试引入了Coordinate Attention注意力机制以改进对小目标物体的检测效率。 yolov8的下载和安装参考我这篇博客: 基于SeaShips数据集的yolov8训练教程_seaships处理成yolov8-CSDN博客 首先我们可以去官网找到CA注…

基于SpringBoot+Vue的驾校预约管理系统+LW示例参考

1.项目介绍 系统角色:管理员、普通用户、教练功能模块:用户管理、管理员管理、教练管理、教练预约管理、车辆管理、车辆预约管理、论坛管理、基础数据管理等技术选型:SpringBoot,Vue等测试环境:idea2024,j…

ONNX:统一深度学习工作流的关键枢纽

引言 在深度学习领域,模型创建与部署的割裂曾是核心挑战。不同框架训练的模型难以在多样环境部署,而 ONNX(Open Neural Network Exchange)作为开放式神经网络交换格式,搭建起从模型创建到部署的统一桥梁,完…

蓝桥杯————23年省赛 ——————平方差

3.平方差 - 蓝桥云课 一开始看题我还没有意识到问题的严重性 我丢,我想 的是用两层循环来做,后来我试了一下最坏情况,也就是l1 r 1000000000 结果运行半天没运行出来,我就知道坏了,孩子们,要出事&#…

一、串行通信基础知识

一、串行通信基础知识 1.处理器与外部设备通信有两种方式 并行通信:数据的各个位用多条数据线同时传输。(传输速度快,但占用引脚资源多。) 串行通信:将数据分成一位一位的形式在一条数据线上逐个传输。(线路…

自带多个接口,完全免费使用!

做自媒体的小伙伴们,是不是经常为语音转文字的事儿头疼? 今天给大家推荐一款超实用的语音转文字软件——AsrTools,它绝对是你的得力助手! AsrTools 免费的语音转文字软件 这款软件特别贴心,完全免费,而且操…

Qt QML解决SVG图片显示模糊的问题

前言 在QML中直接使用SVG图片,使用Image控件加载资源,显示出来图片是模糊的,很影响使用体验。本文介绍重新绘制SVG图片,然后注册到QML中使用。 效果图: 左边是直接使用Image加载资源显示的效果 右边是重绘后的效果 …

【Linux我做主】基础命令完全指南上篇

Linux基础命令完全指南【上篇】 Linux基础命令完全指南github地址前言命令行操作的引入Linux文件系统树形结构的根文件系统绝对路径和相对路径适用场景Linux目录下的隐藏文件 基本指令目录和文件相关1. ls2. cd和pwdcdpwd 3. touch4. mkdir5. cp6. mv移动目录时覆盖写入的两种特…

Designing Dashboards with SAP Analytics Cloud

Designing Dashboards with SAP Analytics Cloud

项目实战系列:基于瑞萨RA6M5构建多节点OTA升级-系统设计<一>

项目背景 原嵌入式控制系统采用分布式模块化架构,由12个功能板卡(通信控制、信号采集、驱动执行等)组成。系统维护阶段存在以下痛点: 低效的本地烧录机制:各板卡固件升级需通过JTAG接口逐一手动连接JLINK仿真器&#x…

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下)

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下) 摘要 本文介绍了家庭网站V1.3版本的更新内容,主要聚焦于AI管家功能的优化与完善。V1.3版本对AI管家模块进行了全面升级&#xff0…

c++基础知识-图论进阶

一、拓扑排序 1、基础知识 1)什么是拓扑排序 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若,则u在线性序列中出现在v之前。 2)拓扑排序的操作方法 重复执行…

[Java实战]Spring Boot服务CPU 100%问题排查:从定位到解决

Spring Boot服务CPU 100%问题排查:从定位到解决 1. 引言 当Spring Boot服务出现CPU占用率100%时,系统性能会急剧下降,甚至导致服务不可用。本文将通过真实代码案例,详细讲解如何快速定位问题根源,并提供解决方案。无…

1.6 极限存在准则

1.夹逼定理(迫敛定理) 1.1 数列型 1.1.1 准则 1.2 函数型 2. 两个重要极限

大华SDK协议在智联视频超融合平台中的接入方法

一. 大华SDK协议详解 (一)、大华SDK协议概述 大华SDK(Software Development Kit)协议是大华股份为开发者提供的一套软件开发工具包,旨在帮助开发者快速集成大华设备(如摄像头、NVR、DVR等)的功…

卓越的用户体验需要智能内容

摘要:这篇文章指出静态文档已无法满足现代用户的需求,而智能内容则是构建卓越用户体验的关键。文章从智能内容的定义、优势和实际应用等方面进行了详细阐述,并强调了企业应积极拥抱智能内容,以提升客户满意度、降低成本并创造新的…

【蓝桥杯】1124修建公路1(Kruskal算法)

思路 找到能够连通所有城市的最小树即可,可用Prim或Kruscal。 !!注意,m的范围是包括0的,可就是包含没有道路的情况,要单独输出0 code import os import sys# 输入 n,m map(int,input().split()) road …