当前关注:《EffectiveC++》读书笔记(1):让自己习惯C++
时间:2023-06-15 10:29:46 来源:面包芯语
点击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号”
干货福利,第一时间送达!
小伙伴们大家好,我是飞宇。。
【资料图】
前几天分享了一下自己关于《C++并发编程实战》这本书的读书笔记:
《C++并发编程实战》读书笔记(1):并发、线程管控
《C++并发编程实战》读书笔记(2):并发操作的同步
收到不少点赞,有人在后台留言问有没有《Effective C++》的读书笔记,还真有,今天也来分享一下自己当初这本书的读书笔记吧,后面会继续更新《Effective C++》和《C++并发编程实战》的读书笔记的。
今天就在公众号上更新《Effective C++》第一部分的读书笔记好了。
学C++要读《Effective C++》已经是老生常谈的事情了。本书以条款为单位讲解一般性的设计策略与特定的语言特性,旨在告诉读者如何有效运用C++。
限于时代因素(第三版写于2005年),本书依据的主要还是C++98/03标准,而目前主流的是C++11标准(最新标准甚至是20/23),所以书中部分点已被新特性取代。公众号日后会更新讲解新特性的《Effective Modern C++》或者《现代C++语言核心特性解析》。
本系列仅作简要整理,还是推荐大家有时间的话读一下全书。
条款1、视C++为一个语言联邦
最初,C++只是C加上一些面向对象特性。但随着它逐渐成熟,今天的C++已经是个多重范型语言。
可以将C++视为一个由4个次语言组成的联邦而非单一语言:1、C,说到底C++仍是以C为基础。2、object-oriented C++,包括封装、继承、多态等面向对象设计。3、template C++,泛型编程,衍生出模板元编程(在各个新标准中逐步完善)。4、STL,包括容器、迭代器、算法与函数对象。
每个次语言都有自己的规约,而C++高效编程守则视情况而变化。
条款2、尽量以const、enum、inline替换#define
#define可以用来定义一些变量、函数,但它只是一方面单纯的文本替换,并且没有任何类型检查,导致容易引起莫名其妙的问题,另一方面预处理后已经消失,编译链接过程中没有其符号信息,出问题时无法定位到它。
即使上文的宏已经仔细地为所有参数添加小括号,仍然出现了问题:第一次调用中a被累加两次,第二次调用中a被累加一次。
更加可预测并且类型安全的写法是,对于定义常量,使用const对象(对于一系列常量,使用枚举或枚举类,而不是一系列#define),对于定义函数,使用模板内联函数。
条款3、尽可能使用const
const可被施加于各种作用域中的各种对象,告诉编译器某值应该不变。
真正威力强大的用法是面对函数声明时,const可以和函数返回值、各参数、成员函数自身产生关联。例如令函数返回const,往往可以降低因用户错误而造成的意外,又不至于放弃安全性和高效性。
对于成员函数自身的const,编译器强制实施bitwise const,即强制不能修改任何成员变量。但实际上很多情况下我们需要的是logical const,即const成员函数也应该可以修改某些客户不可见的数据,这时可以用mutable成员变量来绕过const成员函数的限制。
例如对于一个文本块的对象而言,其内部很可能存在高速缓存;对于查询文本块长度这样的const操作,仍然需要更新高速缓存:
C++中两个函数如果只是常量性不同,也可以重载。当const成员函数与非const成员函数有着实质等价的实现时,为了避免冗余,可以令non-const版本调用const版本:
条款4、确定对象被使用前已先被初始化
C++中变量并非一定会进行初始化。最佳处理办法是:对于内置类型必须手动初始化,而对于用户定义的对象,在使用对象前将其初始化(责任落在构造函数上)。
构造函数包含成员初值列与函数体。1、最好使用成员初始列的初始化而非函数体内的赋值,否则对象会在成员初始列的步骤中进行默认初始化,再在赋值的过程中进行拷贝,成本增高。2、成员初始列的排列顺序应与在类中的声明次序一致,因为成员初始化顺序只与后者有关,前者若与后者不一致的话可能导致误解。
只剩最后一个难点:函数内的静态变量称为local静态变量,其他的都是non-local;而不同编译单元(一个编译单元指产出单一目标文件的源码们)内定义的non-local静态对象的初始化顺序并未规定。倘若存在这样的两个变量a和b,且b的初始化需要使用a,如果a尚未初始化就被b使用了,显然程序会出错。
解决方法也很简单:将每个non-local静态变量移到自己的专属函数内,这些函数返回该静态变量的引用,用户使用这些函数而非直接使用变量(类似单例模式)。至此,non-local静态变量被local静态变量取代。
你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索以及字节跳动电商等部门担任Linux C/C++后端研发工程师。
同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。
有个朋友收集了一些C++开发手册、LeetCode刷题模板等精品资料,可加他的微信免费领取。
标签:
最新文章推荐
- 陕西7名核酸检测阳性外省游客活动轨迹公布
- 万人说新疆 | 棉花朵朵赛白云,阿克苏美出新高度!
- 万人说新疆 | 孙芳红:我在新疆每天过得很充实也很快乐
- 万人说新疆 | 棉农阿卜来提开心地笑了
- 万人说新疆 | 阿迪力的棉花合作社年入300万
- 四川乐山犍为县发生4.3级地震 无人员伤亡
- 西安全面开展排查管控 目前20481人核酸检测结果均阴性
- 陕西7名核检阳性者为一旅行团同行人员 活动轨迹公布
- 西安交大举行2021级本科生迎新会 校长:学习是主动作为之事
- 【母亲河畔的中国】黄河岸边的这个村庄如何打好旅游服务牌?
资讯中心
芯原股份上半年营收净利双高增 半导体IP授权业务市占率全球第七
2022-08-09
预计投资15亿元!齐峰新材拟投建年产20万吨特种纸项目
2022-06-20
新疆(含兵团)15日新增本土无症状感染者1例
2021-10-18
强冷空气继续影响中东部地区 局地降温14℃以上
2021-10-18
热点资讯
-
1
当前关注:《EffectiveC++》读书笔记(1):让自己习惯C++
-
2
【环球播资讯】打印遗嘱符合什么要件才有效
-
3
学生的学籍号怎么查询_学生的学籍号怎么查
-
4
佳县特产介绍(榆林佳县特产大全) 天天看热讯
-
5
300欧能买到“工程师证书”,西班牙警方破获诈骗案,20多人被捕_动态
-
6
口岸工作“回头看” 接续奋斗“铆干劲” 环球今日报
-
7
snowbreeze使用教程 snowbreeze-当前报道
-
8
每日速递:曹玘(关于曹玘介绍)
-
9
新的布加迪凯龙Pur运动首次亮相有这个巨大的碳翼_全球播资讯
-
10
环球观点:离岸人民币兑美元在美联储决议声明发布后转跌,最低触及7.1771元
-
11
继调查小米之后印度再提新要求:当地中国手机品牌高管应为印籍人士
-
12
全球“街”力丨当欧洲人“碰上端午”能碰出什么火花?|播资讯
-
13
今日精选:体内有癌,皮肤先知!一颗黑痣竟能癌变?ABCDE原则教你如何防范
-
14
保险丝是干什么用的 6张图片看懂 每日信息
-
15
经销商是什么意思_与4S店的区别是什么?
-
16
多地严控地方债务风险:确保不发生突发性、临时性的兑付风险 决不寅吃卯粮-世界热点评
-
17
最高奖补1.5亿!两部门:3年3批 干这件事!这些行业将受益
-
18
当前聚焦:近10个交易日37股获高管增持,海康威视获最多增持
-
19
把握制造业转型升级趋势|全球热闻
-
20
华尔街:CPI报告意味着美联储“本轮加息周期结束”
