当前位置: 首页 > news >正文

《Effective C++》知识点(1)--让自己习惯C++

多年前看过的这本书(侯捷翻译的),忘得差不多了,重温复习一下。
1. 视C++为一个语言联邦

        C++并不只是一个带有一组守则的一体语言;它是从四个次语言组成的联邦(federation)政府,每个次语言都有自己的规约。

次语言说明
CC是C++的基础,C++对问题的解法其实是较高级的C解法
Object-Oriented C++C with classes,面向对象设计的实施
Template C++C++范型编程,模板元编程TMP
STLtemplate程序库
2. 尽量以 const, enum, inline替换 #define

       #define的变量是由预处理器处理的,编译器不知道它的存在。

   2.1 对于单纯常量,最好以const对象或enum替换#define。enum比较像#define,取enum地址是不合法的,建议优先使用。

   2.2 对于形似函数的宏,最好改用inline函数替换#define。inline函数遵守作用域和访问规则。

3. 尽可能使用const

       将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

   3.1 如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针本身是常量。

   3.2 令函数返回一个常量值(常量对象),可以降低因客户错误而造成的意外,而又保持安全性和高效性。

   3.3 编译器强制实施物理常量性(bitwise constness),但编写程序时应该使用"概念上的常量性"即逻辑常量性。const成员函数承诺绝不改变其对象的逻辑状态。如果成员变量在const成员函数内总是可被更改的,可以用mutable修饰。

   3.4 当const和non-const成员函数有着实质等价的实现时,另non-const版本调用const版本可以避免代码重复。先用static_cast将*this转为const对象调用const成员函数,再用const_cast移除调用返回的const修饰。

4. 确定对象在使用前已被初始化

       永远在使用对象之前先将它初始化。确保每一个构造函数都将对象的每一个成员初始化。

   4.1 为内置型对象进行手工初始化,因为C++不保证初始化它们。这点和Java很不一样。

   4.2 构造函数最好使用成员初始化列表,而不要在构造函数体内使用赋值操作。class的成员变量总是以其声明的次序被初始化的。初始化列表列出的成员变量,其顺序应该与它们在class中声明的次序相同,避免使人迷惑。

   4.3 为避免"跨编译单元之初始化次序"问题,请用local static对象替换non-local static对象。

       所谓编译单元是指产出单一目标文件的源码,基本上是一个cpp文件加上其所包含的头文件。C++对"定义于不同编译单元内的non-local static对象"的初始化顺序没有明确的定义。但是C++保证,函数内的local static对象会在"该对象被调用期间"首次遇上该对象定义式时被初始化。所以请优先使用局部静态对象函数,而不是全局静态对象,可以避免依赖的静态对象未被初始化的情况。

相关文章:

《Effective C++》知识点(1)--让自己习惯C++

多年前看过的这本书(侯捷翻译的),忘得差不多了,重温复习一下。 1. 视C为一个语言联邦 C并不只是一个带有一组守则的一体语言;它是从四个次语言组成的联邦(federation)政府,每个次语言都有自己的规约。 次语言说明CC是C的基础&am…...

UVM 验证方法学之interface学习系列文章(八)《interface不小心引入X态问题》

前面的文章学习,想必大家都对interface 有了深入了解。大家可不要骄傲哦,俗话说:小心驶得万年船。今天,再给大家介绍一个工作中,不是经常遇到,但是一旦遇到,会让你纠结很久的事情。 前面文章提到,随着验证复杂度的不断增加,interface 的bind 的操作,是必不可少的用法…...

BBR算法的几种状态

BBR(Bottleneck Bandwidth and Round-trip propagation time)算法根据互联网的拥塞行为定义了四种状态:STARTUP、DRAIN、PROBE_BW和PROBE_RTT。下面对每种状态进行详细解释,并说明它们之间的区别: STARTUP(…...

利用jupyter进行分类

Jupyter Notebook是一个非常强大的工具,可以用于各种数据分析和机器学习任务,包括分类问题。在Jupyter Notebook中进行分类通常需要以下步骤: 导入所需的库:首先,你需要导入必要的Python库,例如NumPy、Pand…...

【LeetCode 算法专题突破】滑动窗口(⭐)

文章目录 前言1. 长度最小的子数组题目描述代码 2. 无重复字符的最长子串题目描述代码 3. 最大连续1的个数 III题目描述代码 4. 将 x 减到 0 的最小操作数题目描述代码 5. 水果成篮题目描述代码 6. 找到字符串中所有字母异位词题目描述代码 7. 串联所有单词的子串题目描述代码 …...

按键中断控制LED灯亮灭

EXTI—外部中断/事件控制器 EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的 检测。EXTI可…...

YOLOV8目标检测——模型训练

文章目录 1下载yolov8([网址](https://github.com/ultralytics/ultralytics))2用pycharm打开文件3训练自己的YOLOV8数据集4run下运行完了之后没有best.pt文件5导出为onnx文件 本章内容主要解决如何训练自己的YOLOV8模型。 1下载yolov8(网址&a…...

利用dockerfile升级flink的curl

最近Nusses扫出flink镜像有CURL漏洞,才发现要更新到最新版本 8.4.0,笔者当时flink版本为: flink:1.17.1-scala_2.12-java8 官方镜像仓库:https://hub.docker.com/_/flinkapt源 我试了如上2种方法,都不能更新curl到8…...

element 日期选择器禁止选择指定日期前后时间

画圈重点&#xff1a;disabledDate的写法要用箭头函数&#xff0c;不能用普通函数写法&#xff0c;否则this指向就错了&#xff0c;会报 undefined <el-date-picker v-model"time" type"date" value-format"yyyy-MM-dd" :…...

00TD时尚女童睡衣,蕾丝边+蝴蝶结太好看了

甜美又可爱的蕾丝花边加蝴蝶结 真的一下子戳中了我的心巴&#xff0c; 满满的少女风真的很好看&#xff0c; 妥妥的可爱小公主一枚 柔软又亲肤&#xff0c;厚厚的很保暖 睡觉真的很舒服 还有袖口和裤脚都做了松紧设计哟&#xff01;...

网络基础知识点

osi七层模型&#xff1a; 应用层&#xff1a;提供用户接口&#xff0c;与用户进行交互 表示层&#xff1a;进行数据格式的转换 会话层&#xff1a;建立、维护和验证会话 传输层&#xff1a;保证目标从源到目的地的传输&#xff08;传输协议和端口号&#xff09; 网络层&#x…...

力扣每日一题54:螺旋矩阵

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#…...

基于WebRTC的程序因虚拟内存不足导致闪退问题的排查以及解决办法的研究

目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上&#xff0c;没有感知到异常或中断 3.2、Windbg感知到了中断&#xff0c;中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …...

2023年9月青少年软件编程(C 语言) 等级考试试卷(三级)

2023年9月青少年软件编程&#xff08;C 语言&#xff09; 等级考试试卷&#xff08;三级&#xff09;含答案 1.谁是你的潜在朋友 题目描述 “臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男&#xff0c;你…...

用节点亲和性把 Pod 分配到节点

用节点亲和性把 Pod 分配到节点 当前集群信息&#xff1a; rootk8s-master:~# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s…...

GB28181学习(十)——视音频文件下载

要求 SIP服务器接收到媒体接收者发送的视音频文件下载请求后向媒体流发送者发送媒体文件下载命令&#xff0c;媒体流发送者采用RTP将视频流传输给媒体流接收者&#xff0c;媒体流接收者直接将视频流保存为媒体文件&#xff1b;媒体流接收者或SIP服务器可通过配置查询等方式获取…...

2023 年和 2024 年 10 个最佳加密货币趋势

1.熊市低迷 加密货币市场已进入持续数月的长期看跌阶段。尽管 2023 年初出现了一些看涨走势&#xff0c;但大多数领先的加密货币随后都出现了看跌低迷&#xff0c;导致其市值大幅下跌。 此外&#xff0c;持续的熊市可归因于一系列因素&#xff0c;包括宏观经济不确定性、利率…...

0026【Edabit ★☆☆☆☆☆】Convert Hours and Minutes into Seconds

0026【Edabit ★☆☆☆☆☆】Convert Hours and Minutes into Seconds language_fundamentals math Instructions Write a function that takes two integers (hours, minutes), converts them to seconds, and adds them. Examples convert(1, 3) // 3780 convert(2, 0) //…...

Java 枚举类

一、枚举类简介 1、枚举类概念 类的对象只有有限个且确定的&#xff0c;这种类称之为枚举类&#xff1b;因为在jdk1.5之前没有enum关键字来定义枚举类&#xff0c;只能采用class定义一个类然后将类做一些修改满足对象个数有限且确定&#xff0c;那么这种类就是枚举类&#xf…...

SQL sever中的存储过程

在Oracle的专篇中我也有仔细总结了存储过程的相关内容&#xff0c; 文章链接&#xff1a;http://t.csdnimg.cn/Z8AnH 尽管Oracle和SQL sever之间是存在一些区别&#xff0c;但许多基本的概念和原则在Oracle和SQL Server之间是通用的。它们之间有一些常见的区别&#xff0c;如下…...

5步精通ruoyi-vue-pro邮件系统:从模板化发送到全链路监控的实战指南

5步精通ruoyi-vue-pro邮件系统&#xff1a;从模板化发送到全链路监控的实战指南 【免费下载链接】ruoyi-vue-pro &#x1f525; 官方推荐 &#x1f525; RuoYi-Vue 全新 Pro 版本&#xff0c;优化重构所有功能。基于 Spring Boot MyBatis Plus Vue & Element 实现的后台管…...

TShock 5.1.2 配置精解:从安全防护到游戏体验的全方位调校指南

1. TShock 5.1.2 配置文件基础认知 初次接触TShock服务器的朋友&#xff0c;面对config.json里密密麻麻的参数难免会感到头疼。其实这个配置文件就像乐高积木的说明书&#xff0c;掌握关键模块就能搭建出理想的游戏环境。我刚开始管理服务器时&#xff0c;花了整整三天才摸清门…...

保姆级避坑指南:在Ubuntu 20.04上搞定ego-planner与PX4仿真(解决eigen3版本冲突)

Ubuntu 20.04下ego-planner与PX4仿真的深度避坑手册 当你在深夜的实验室里&#xff0c;面对满屏红色报错信息时&#xff0c;是否也曾怀疑人生&#xff1f;作为过来人&#xff0c;我完全理解那种在搭建ego-planner三维路径规划环境时的崩溃感。本文将带你穿越这片"雷区&quo…...

SAP MM开发避坑指南:BAPI_GOODSMVT_CREATE调用时,如何快速找到自定义移动类型对应的GOODSMVT_CODE?

SAP MM开发实战&#xff1a;自定义移动类型与GOODSMVT_CODE的精准匹配策略 在SAP物料管理&#xff08;MM&#xff09;模块的开发过程中&#xff0c;BAPI_GOODSMVT_CREATE是最常用的接口之一&#xff0c;但许多开发者在处理自定义移动类型时都会遇到一个共同难题&#xff1a;如何…...

地统计学新手必看:如何用Arcgis的探索性分析发现数据隐藏规律?

地统计学入门实战&#xff1a;用ArcGIS探索性分析揭开数据的神秘面纱 第一次接触地统计学时&#xff0c;我盯着屏幕上密密麻麻的点数据完全不知所措。直到导师扔给我一句话&#xff1a;"数据会说话&#xff0c;关键看你用什么工具去倾听。"这句话彻底改变了我处理空间…...

终极指南:如何用Web Scraper Chrome扩展零代码抓取网页数据

终极指南&#xff1a;如何用Web Scraper Chrome扩展零代码抓取网页数据 【免费下载链接】web-scraper-chrome-extension Web data extraction tool implemented as chrome extension 项目地址: https://gitcode.com/gh_mirrors/we/web-scraper-chrome-extension 还在为手…...

如何快速实现网页视频下载:VideoDownloadHelper开源工具的完整实战指南

如何快速实现网页视频下载&#xff1a;VideoDownloadHelper开源工具的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法…...

快速掌握开源工具:3分钟实现高效电子书转换

快速掌握开源工具&#xff1a;3分钟实现高效电子书转换 【免费下载链接】anyflip-downloader Download anyflip books as PDF 项目地址: https://gitcode.com/gh_mirrors/an/anyflip-downloader 你是否曾为在线电子书无法离线保存而烦恼&#xff1f;当网络不稳定或需要随…...

别再只用官方工具了!手把手教你为Dify打造专属图片生成工具(基于硅基流动API)

突破Dify官方限制&#xff1a;构建专属图像生成工具的实战指南 在AI应用开发领域&#xff0c;Dify以其强大的工作流编排能力赢得了众多开发者的青睐。但当我们真正深入实际业务场景时&#xff0c;往往会发现官方提供的标准化工具就像一把瑞士军刀——虽然功能齐全&#xff0c;却…...

从SQL到Cypher:一个后端工程师的Neo4j避坑与效率提升指南

从SQL到Cypher&#xff1a;一个后端工程师的Neo4j避坑与效率提升指南 第一次接触Neo4j时&#xff0c;我被它处理复杂关联查询的能力震撼了。记得当时需要分析一个社交网络的六度关系&#xff0c;用传统SQL写了三层嵌套JOIN还是性能堪忧&#xff0c;而切换到Cypher后&#xff0c…...