《More Effective C++》读书笔记(零)Basic 基础条款
这是篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点。我推荐学C++的人都好好读一遍Effective C++ 系列,真是好书啊,对于学完C++ 基础知识的人,这是本高阶秘籍。值得注意的是 More Effective C++ 是以1997年的C++标准写的,那时候标准还不完善,20多年过去了,很多语言的漏洞和技术可能被新特性取代了,应该注意最终向新标准看齐。
笔记
- 条款1:仔细区别pointers 和 reference。 reference 必然指向某个对象,不可以为 null , 不可以改变指向;指着可以为空,可以改变指向。 重载操作符 operator[] 的时候返回reference 更好。
int &a =0;\\错误!, 而int *a = 0 ;\\合法 - 条款2: 最好使用C++ 转型操作符。从可读性和规范来说,不应该使用C语言的转型了,而应该使用以下四种转型操作符。
| static_cast<T>() | const_cast<T>() | dynamic_cast<T>() | reinterpret_cast<T>() | |
|---|---|---|---|---|
| 操作 | 普通转型操作 | 去除某个对象的常量性 | 继承体系中安全的向下转型或者跨系转型 | 用来转换函数指针的类型 |
| 注意事项 | 与C语言旧式转型有相同威力与意义 | 只能用于继承体系中 | 不具备移植性 |
dynamic_cast 可以把指向基类的指针或者引用转换为指向派生类的指针或者引用
条款3:绝对不要以多态的方式处理数组。 所以如果用基类的数组存派生类对象,因为基类对象占用的内存和派生类对象占用内存大小不一样会导致寻址出错。结果不可预期。析构也会出错,通过base class 的指针删除derived classes 的对象构成的数组,结果未定义。多态和指针算术不能混用。
array[i] 表示的是 *(array+i);
条款4:非必要不提供 default constructor。 提供了默认构造函数就是表明构造这个对象不需要额外的参数,表明成员参数都可能被初始化或者类的设计者有责任检查成员函数是否初始化,带来额外的负担。 如果不提供默认构造函数,则在使用对象数组的时候需要逐个构造,这里还介绍了一种分配raw memory 和placement new 的技术(可以参见条款8)避免过度使用内存; 此外,如果不提供默认构造函数,则不适用许多模板容器类 tamplate-based container class; 还有就是对于虚基类,如果没有默认构造函数则要求派生类的使用者了解构造参数的意义。最终实践是如果提供默认你构造函数,请记得保证成员有意义。
有个三五法则专门讲关于构造、析构函数的,准备写一篇总结,专门讲述这方面的。
总结
- 区分 reference 引用和pointer 指针;
- 最好使用 C++ 的转型操作符,弃用旧的C 转型方式;
- 多态和指针运算不能混用(数组索引用了指针算术);
- 除非必要,否则不提供默认构造函数。
《More Effective C++》读书笔记(零)Basic 基础条款的更多相关文章
- Effective STL 读书笔记
Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...
- Effective STL读书笔记
Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...
- effective c++读书笔记(一)
很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- Effective java读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...
- 《CLR via C#》读书笔记 之 线程基础
第二十五章 线程基础 2014-06-28 25.1 Windows为什么要支持线程 25.2 线程开销 25.3 停止疯狂 25.6 CLR线程和Windows线程 25.7 使用专用线程执行异步的 ...
- 读书笔记(06) - 语法基础 - JavaScript高级程序设计
写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...
- CLR via C# 读书笔记-26.线程基础
前言 这俩个月没怎么写文章做记录分享,一直在忙项目上线的事情,但是学习这件事情,停下来就感觉难受,clr线程这章也是反复看了好多遍,书读百遍其义自见,今天我们来聊下线程基础 1.进程是什么,以及线程起 ...
- Effective Java 读书笔记(五):Lambda和Stream
1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public in ...
随机推荐
- Python KafkaProducer and KafkaConsumer的开发模块
1.在python中往kakfa写数据和读取数据,使用的是python-kafka库 2.消费者需持续写入数据,因groupid存在偏移量,才能看看到数据. 3.安装库的命令为pip install ...
- git add用法
git add命令是将工作区内容添加到暂存区.git commit 将暂存区内容添加到版本库. git add -A 提交所有变化 git add -u 提交被修改(modified)和被删除(d ...
- LeetCode40.组合总和|| JavaScript
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...
- Centos 7安装Grafana 4及结合Zabbix3.2实现可视化监控图形
上一篇介绍了如何在Centos 7环境下安装zabbix监控,本章继续介绍在Centos 7环境下安装Grafana,并结合Zabbix实现可视化监控图形! 简介: Grafana 是 Graphit ...
- oracle的sys和system的默认密码
oracle的sys和system默认密码system默认:manager sys默认:change_on_install使用PL/SQL Plus登录数据库时,system用户使用密码manager ...
- iOS 封装一个带复制功能的UILabel
我们发现UILabel不在为我们提供长按弹出复制等操作了, 我们来继承UILabel自己写一个带复制功能的UILabel. 代码: #import "CopyLabel.h" @i ...
- 读取本地json文件另一种方式
function getScenemapData(){ $.ajax({ url: "/js/currency.json", type: "GET" ...
- ssm多数据源的操作
公司要求,需要使用两个数据库,一个mysql,一个oracle.所以需要配置两个数据库来进行操作. 1.首先,需要在jdbc.properties文件中将两个库的配置数据写入,不过一个写driver, ...
- Spring Bean d的作用域
在spring中,可以在<bean>元素的scop属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的. 默认情况下,spring只为每个在IOC容器里声明的bean创建唯 ...
- Python-逻辑运算
1 or 3>2 and 4<5 or 6 and 2<7