《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 ...
随机推荐
- 查看mysql中所有表的数据记录
select table_name,table_rows from tables where TABLE_SCHEMA = 'database name' order by table_rows de ...
- RabbitMQ镜像模式双节点部署时故障转移过程中队列中消息的状态
场景 现有节点Node1和Node2,建立Exchange:yu.exchange,创建队列yu1.queue镜像队列master位于Node1,yu2.queue镜像队列位于Node2,使用topi ...
- git 从远程仓克隆到本地新分支
克隆远程仓代码到本地 git clone http://******:8080/DEV1-WMALL_DQ/WMALL_DQ_Front.git // git 库地址 当前分支是master ...
- P1015 回文数解题思路(非原创)
测试 #include<bits/stdc++.h> using namespace std; int n,m,step; string nn; int len,nex; bool dfs ...
- select2 多选 排序(版本3.4.6)
使用select2多选,页面选择值的顺序与传到control的值的顺序不一致,为了方便,没有改变本来js文件,在页面上面通过change方法改变. 1.页面代码(添加修改使用同一个页面) <li ...
- activemq的搭建、启动,简单demo
一.搭建activeMQ 在官网下载window版本,直接解压就可以. 二.启动 在解压完的目录/bin/win64,双击击activemq.bat,运行完之后打开浏览器,输入http://127.0 ...
- 基于 pyMongo 和 wxPython 实现的 MongoDB Schema Analyser
MongoDB 作为文档型 NoSql 数据库,它的集合表结构往往不像关系型数据库那么固定和统一,同一个集合下的文档(document)的字段变化和差异可能很大,特别是在数据模型缺乏良好规划和规范的数 ...
- HAProxy负载均衡策略
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理.HAProxy是支持虚拟主机的,HAProxy的优点能够补充Nginx的一些 ...
- docker inspect获取详细参数的两种方法
docker inspect xx 返回的是一个json格式的数据 以下为部分返回值 [ { "Id": "706813b0da107c4d43c61e3db9da908 ...
- HxUtils: 批量转换换行符,print2to3
在 windows 和 linux 系统,换行符有时需要转换,其代码文件 HxUntils.py 如下: ''' HxUtils.py 2018 by x01 ''' import os, sys d ...