这是篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点。我推荐学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; 还有就是对于虚基类,如果没有默认构造函数则要求派生类的使用者了解构造参数的意义。最终实践是如果提供默认你构造函数,请记得保证成员有意义

有个三五法则专门讲关于构造、析构函数的,准备写一篇总结,专门讲述这方面的。

总结

  1. 区分 reference 引用和pointer 指针;
  2. 最好使用 C++ 的转型操作符,弃用旧的C 转型方式;
  3. 多态和指针运算不能混用(数组索引用了指针算术);
  4. 除非必要,否则不提供默认构造函数。

《More Effective C++》读书笔记(零)Basic 基础条款的更多相关文章

  1. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  2. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  3. effective c++读书笔记(一)

    很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...

  4. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  5. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  6. 《CLR via C#》读书笔记 之 线程基础

    第二十五章 线程基础 2014-06-28 25.1 Windows为什么要支持线程 25.2 线程开销 25.3 停止疯狂 25.6 CLR线程和Windows线程 25.7 使用专用线程执行异步的 ...

  7. 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...

  8. CLR via C# 读书笔记-26.线程基础

    前言 这俩个月没怎么写文章做记录分享,一直在忙项目上线的事情,但是学习这件事情,停下来就感觉难受,clr线程这章也是反复看了好多遍,书读百遍其义自见,今天我们来聊下线程基础 1.进程是什么,以及线程起 ...

  9. Effective Java 读书笔记(五):Lambda和Stream

    1 Lamdba优于匿名内部类 (1)DEMO1 匿名内部类:过时 Collections.sort(words, new Comparator<String>() { public in ...

随机推荐

  1. iOS 关闭图片渲染

    在为Button 设置背景图片的时候, 会发现显示的效果和UI给的图片不一样, 往往是把图片显示成为蓝色, 这是因为在新版的iOS中, 会自动对图片渲染. 我们只要把图片渲染关掉就OK了 - (UII ...

  2. 基于MySql数据库的单表与多表联合查询

    这里以学生 班级 身份证 以及课程为例 1,启动MySql数据库  开启服务 2.1.0新建一张班级表 备注:CHARSET = UTF8 (指定编码格式为utf8 防止中文乱码) /*班级表*/ C ...

  3. EF Core 2.0 已经支持自动生成父子关系表的实体

    现在我们在SQL Server数据库中有Person表如下: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ) NULL, ) NULL, [Cr ...

  4. CSP 试题编号201803-2 Java实现

    package HB; import java.util.Scanner; public class Test_06 { public static void main(String[] args) ...

  5. crashes

    iOS 僵尸对象调试 - 简书 iOS APP审核被拒的解决之道(2.1) - - ITeye博客 iOS应用崩溃日志分析 - CocoaChina 苹果开发中文站 - 最热的iPhone开发社区 最 ...

  6. Java并发编程(四)锁的使用(上)

    锁的作用 锁是一种线程同步机制,用于实现互斥,当线程占用一个对象锁的时候,其它线程如果也想使用这个对象锁就需要排队.如果不使用对象锁,不同的线程同时操作一个变量的时候,有可能导致错误.让我们做一个测试 ...

  7. thinkphp3.2 上传图片兼容小程序

    第一步在配置文件中设置图片的大小和路径 return array( //'配置项'=>'配置值' 'img_save'=>[ 'size' =>[ 'app_gszc_Card'=& ...

  8. Linux系统初学-第一课 虚拟机安装CentOS6.5以及Root密码找回

    Linux系统初学第一课 虚拟机安装CentOS6.5以及Root密码找回 虚拟机安装CentOS6.5 一.安装虚拟机 1-1.安装虚拟机VMware Station,新建虚拟机,选择典型配置. 1 ...

  9. 嵌入式C语言自我修养 09:链接过程中的强符号和弱符号

    9.1 属性声明:weak GNU C 通过 __atttribute__ 声明weak属性,可以将一个强符号转换为弱符号. 使用方法如下. void __attribute__((weak)) fu ...

  10. 《你不知道的JavaScript》系列分享专栏

    <你不知道的JavaScript>系列分享专栏 你不知道的JavaScript”系列就是要让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部 ...