这是篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点。我推荐学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. ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中

    我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...

  2. Factory(工厂)模式

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题. ...

  3. 用JavaScript中jQuery编写放大镜效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 利用PDCA工具改进周例会

    PDCA简介 PDCA循环又叫戴明环,是美国质量管理专家休哈特博士首先提出的,由戴明采纳.宣传,获得普及,从而也被称为“戴明环”. PDCA最早用来解决全面质量管理问题,但是PDCA也可以用来作为一个 ...

  5. iOS开发Mac配置(CocoaPods、SourceTree、ssh key)

    作为开发,有一个自己的饭碗还是有必要的.因为交接旧电脑的时候,你会遇到了一些问题,而自己的电脑就方便很多了. 要开发,当然要装一些与开发相关的东西,那么新电脑入手,要做些什么呢? 1.安装Xcode: ...

  6. 纯swift开发,弹幕,演唱会广告牌

    最近去了次演唱会,看见有人在用这个,刚好没事,我自己也写了一个. 顺手练一练swift,第一个纯swift开发工程. 支持字体大小切换,滚动速度切换,字体切换,字体颜色切换 工程Git:https:/ ...

  7. 执行 sql 报错未缓冲查询,错误码 2014

    sql语句为 SELECT COUNT(id) AS tp_count FROM `tableName` WHERE `status` = 0 AND `source` = 1 AND ( `end_ ...

  8. es6 入坑笔记(一)---let,const,解构,字符串模板

    let  全面取代var 大概相似于C++的定义,一个变量必须得先定义后使用,没有预编译 注意let的作用域,一个{}就是一个作用域,上述规则须在一个作用于内 坑:for(let i =0;i < ...

  9. JQuery传值,接收PrintWriter的int接收不了

    <servlet>中的代码 <JSP中的代码> 很苦恼,我想要,<servlet>中传入的(0),在<jsp>中接收到这个参数,然后进行判断,从而达到判 ...

  10. sublime text3 插件安装方法

    1.按Ctrl+`(ESC下方的键)调出console粘贴以下代码到底部命令行并回车 2.输入:import urllib.request,os,hashlib; h = '6f4c264a24d93 ...