文档章节

再读Effective C++

C
 C00king
发布于 2014/12/22 22:17
字数 1428
阅读 90
收藏 3

Effective C++ 笔记

10年后再读Effective C++ 3rd(English),没有对细节的追问,更多的是对C++设计思路的思考,各章节标题为是个章节的概括和总结

让自己习惯C++

  • C++由多个部分构成

      C, Object-Oriented, Template, STL  
    
  • 尽量多的使用const,enums,inline代替define

      更好的静态检查
    
  • 尽量多用const

      不仅是防御式编程,更重要的是再检验设计的合理性
    
  • RAII 资源获取即初始化

      c++编程里永不过时的一句,无论声明一个变量或者获得某种资源		
    

默认生成的函数们

  • 留意C++自动生成的代码:构造,析构,copy构造,operator =

      自动生成代码运行的机制,绝对是笔试,面试中的常客
    
  • 如果不需要,就显式的禁用自动生成的代码

      各种笔试,面试经常出现只能栈上分配,堆上分配,不能继承,不能copy等等都是变种
    
  • 多态基类的析构必须是虚函数

      毋庸置疑,C++派生规则中必须遵守的一条,简单粗暴点就是基类的析构一定是虚函数
    
  • 析构函数不要抛异常

      抛了异常就会导致析构传递断裂,资源泄漏在所难免
    
  • 构造/析构中不要调用虚函数

      笔试,面试中经常出现
    
  • operator = 返回 *this

      链式使用不可少
    
  • 处理好operator = 自赋值

      同样经典,必不可少
    
  • 拷贝构造一定要拷贝全

      不要为什么,如果copy少了,必须是copy错了
    

资源管理

  • 使用对象管理资源

      3年经验的必须懂
    
  • 资源管理类的copy行为要慎重

  • 资源管理类提供访问Raw-Resource的方法

      std::string::c_cstr()要明白
    
  • new/delete 形式要对应

      new <=> delete, new [] <=> delete []
    
  • 存储new分配的资源在smart pointer中单独处理

      void foo(tr1::shared_ptr<Data> obj);
      foo(new data); // wrong
      tr1::shared_ptr<Data> pd (new Data());
      foo(pd); // all right
    

设计和声明

  • 接口好用不易错

      类型转换处理好
      语意上自然
    
  • 类设计就是类型设计

      类设计的基本规则之一
    
  • 常引用传递代替值传递

      不仅减少对象生成消亡的开销,还可以简化代码
    
  • 该返回对象时,勿返回引用

      c++不是java,没有天生的引用计数机制
    
  • 数据成员私有

      多一层保护多一层自由,要不C#也不会搞属性,Java搞setter/getter出来
    
  • 使用非成员,非友元函数替代成员函数

      增强封装,弹性以及功能扩展,简单的说,不必要的不要放在内部
    
  • 当参数都需要类型变化时,声明为非成员函数

      负数类operator + , 如果可以接受 int,char,double那么就声明为非成员函数,大家都开心
    
  • 支持无异常交换

      swap很重要,无论是在拷贝构造还是赋值运算中
    

实现

  • 尽量推迟变量的定义

      首先你要弄清楚什么是定义,哈哈
    
  • 最小化CAST

      尽量不用,尤其是dynamic_cast,必须用的时候尽量封装到函数里,优先C++ style, no C
    
  • 避免返回对象的内部处理细节

      对于这样的代码情何以堪:
      const Rect r(left, up, right, down);
      rect.getLeftup().setX(x);
      另外,临时对象也很难hold住
    
  • 异常安全

      这个怎么说都不过分
    
  • 明白inline函数的输入输出

      內联函数短小精悍,二进制升级要考虑好。
    
  • 最小化文件编译依赖

      现在的代码似乎根本不在乎这一套		
    

继承和面向对象设计

  • 继承要符合“is-a”模型

      关键在于怎么理解企鹅是鸟不会飞这样的无厘头
    
  • 避免隐藏继承来的名字

      这个就是所谓的“隐藏规则”,笔试,面试都会有
    
  • 区别接口继承和实现继承

      virtual的都要设计成接口,非虚的都是实现
    
  • 考虑虚函数以外的其他选择

      解决问题的方法不止一个		
    
  • 绝不重新定义继承而来的非虚函数

      C++就是这样,虚与实之间的界限有时清晰有时晦涩
    
  • 绝不重新定义继承而来的有默认参数的函数

      c++默认参数静态绑定
    
  • 使用组合来表示“A包含B”、“A以B的形式实现”

      弄清楚AB的关系比什么都重要
    
  • 明智的使用私有继承

      私有继承意味着全部都不能继续继承了
    
  • 明智的使用多继承

      单继承多实现是个好主意
    

模版和范型

  • 理解隐式接口,编译期多态

      理解接口,理解编译期多态,理解万岁
    
  • 理解typename的两个含义

      1:和class一样在模版中,2:表示后面是一个类型
    
  • 如何访问模板化基类中的名字

      1:this, 2:using 3:fullname
    
  • 把与参数无关的代码抽离templates

      模版生成代码膨胀要注意
    
  • 模版函数尽量多的兼容类型

      多多益善
    
  • 需要类型转换时请为模板定义非成员函数

      放在里面很别扭
    
  • 使用traits classes表现类型信息

      典型的函数式思路和STL实现
    
  • 了解模版元编程

      运行期放到编译期
    

自定义new和delete

  • 理解new-handler

      new的内部细节
    
  • 理解替换new和delete的时机

      没有特别的理由无需重载
    
  • 按照约定实现new和delete

      new和delete都有自己的格式
    
  • 放置new和放置delete

      new和delete一定要对应
    

© 著作权归作者所有

共有 人打赏支持
上一篇: unittest sample
下一篇: Web.py 之 Processor
C
粉丝 0
博文 5
码字总数 2518
作品 0
私信 提问
C++各阶段学习书目

1. 入门 Lippman的《Essential C++》 顾名思义,这本书是很短小精悍的。通过这本书,可以对C++的最常用和重要的特性有全面的了解,并对C++的全貌有一个概念。虽然这远远不够,但就是这样的书...

晨曦之光
2012/04/24
301
1
001-EMC 深入解读-目录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1007729991/article/details/82717008 除了刚毕业的应届生,从来没人敢说他精通 C++,Bjarne Stroustrup (C...

--Allen--
2018/09/15
0
0
提升 C++ 技能的 7 种方法

本文由伯乐在线 -精算狗 翻译,艾凌风 校稿。未经许可,禁止转载! 英文出处: Jonathan Boccara。欢迎加入 翻译组。 夏天时常会谈到大海、太阳、沙滩、大山或者你的家庭住宅。更充裕的时间也...

伯乐在线
2017/08/24
0
0
C#转C++的一点分享

从C#转C++有段时间了,一直想分享点什么,但又不太好意思分享,毕竟自己做C++的时间不太长,最近感觉自己已能胜任现有工作,想分享的想法又强了点,前几天看到这样一篇博客《那些年·我们读过的专业...

爱情经纬线
2014/01/17
3.7K
10
学习C++的50条,谨以送给C++的粉丝们

1.把C++当成一门新的语言学习(和C没啥关系!真的);   2.看《Thinking In C++》,不要看《C++变成死相》(C++编程思想,翻译的非常差);   3.看《The C++ Programming Language》(这...

地瓜儿
2013/01/11
1K
7

没有更多内容

加载失败,请刷新页面

加载更多

Java单例模式学习记录

在项目开发中经常能遇见的设计模式就是单例模式了,而实现的方式最常见的有两种:饿汉和饱汉(懒汉)。由于日常接触较多而研究的不够深入,导致面试的时候被询问到后有点没底,这里记录一下学习...

JerryLin123
昨天
4
0
VSCODE 无法调试

VSCODE 无法调试 可以运行 可能的原因: GCC 的参数忘了加 -g

shzwork
昨天
5
0
理解去中心化 稳定币 DAI

随着摩根大通推出JPM Coin 稳定币,可以预见稳定币将成为区块链落地的一大助推器。 坦白来讲,对于一个程序员的我来讲(不懂一点专业经济和金融),理解DAI的机制,真的有一点复杂。耐心看完...

Tiny熊
昨天
4
0
5.线程实现

用于线程实现的Python模块 Python线程有时称为轻量级进程,因为线程比进程占用的内存少得多。 线程允许一次执行多个任务。 在Python中,以下两个模块在一个程序中实现线程 - _thread 模块 th...

Eappo_Geng
昨天
7
0
ServiceLoader

创建一个接口文件在resources资源目录下创建META-INF/services文件夹在services文件夹中创建文件,以接口全名命名创建接口实现类 内容me.zzp.ar.d.PostgreSQLDialectme.zzp.ar.d.Hype...

Cobbage
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部