Effective C++ 笔记

  • 如果你完全不担心该对象的构造和析构成本,你其实是明显逃避了你的专业责任
  • 这将是一张通往不明确行为和彻夜调试大会的直达车票
  • 简直是对资源泄露的一个死亡邀约

Const

  • const 代替 define
  • template inline 代替 define
  • 最小化原则,const operator*解决了a*b=c这种隐患
  • bitwise const, logical const(忽略mutable变量)

non-const call const

cahr & operator[](std::size_t position)
{
    return const_cast<char&>(
        static_cast<const TextBlock&>(*this) // 避免自调用
        [position]);
}

使用前被初始化

  • 如果成员变量是const 或者references, 则使用前一定要背初始化。
  • member initialization list:
AB:AB(p1, p2, p3):p1(p1),p2(p2),p3(p3){}

类基础方法

C++ 会自动生成一个默认构造函数,一个copy构造函数,一个copy assignment操作符和一个析构函数
- default 构造析构主要是给编译器一个地方用来放置藏身幕后的代码
- copy构造函数和copy assignment单纯将每一个con-static成员变量拷贝到目标对象
- 阻止编译器自动生成可以声明而不用定义一个private的对应函数,用在C++ iostream阻止拷贝
- 多态基类析构函数应当声明为virtual,虚函数通过vptr(virtual table pointer)指向vtbl
- 但是不能将所有函数声明为virtual,每一个virtual对象占用空间至少翻倍,STL不含虚析构函数!继承:(
- 析构函数异常时,可以将析构方法封装,而后交给用户(外部)处理
- 不宜在构造析构函数中使用虚函数,因为基类会先于继承类被实现
- operator=返回一个reference to *this, 并且需要考虑(this == &rhs)
- copy函数应该确保复制对象和基类所有成分,不要尝试一个copy调用另一个=,而应该适度封装
- 把资源放进管理对象内,我们便可倚赖C++析构函数自动调用机制来确保资源被释放(RAII,资源获取时初始化)
- RCSP(引用技术型智慧指针,shared_ptr),对比RC,无法打破环状引用
- auto_ptr, shared_ptr都在析构函数内delete, 而不是delete[]
- auto_ptr不能多对一,复制行为会指向null
- 返回RAII指针来保证内存安全

设计与声明

  • 应该如何被创造和销毁
  • 对象初始化和赋值应当有何区别
  • 新type被copy by value是调用了copy构造函数
  • 什么是新type的合法值(约束条件)
  • 需要配合virtual继承图系吗
  • 需要什么类型的转换,需要什么操作符
  • 什么样的标准函数应当被驳回?(private)
  • 谁该取用新type成员(protect,friend)
  • 真的需要新type吗(template)

const by ref传参提高效率:构造析构,编译器拒绝缓存double,stl复制

  • public继承意味着is a
  • NVI手法:让客户通过Public non-virtual调用private virtual
  • 不要重新定义一个继承而来的non-virtual函数
  • 通过多态实现函数的动态类型
  • EBO:空白基类最优化
  • 钻石继承,必须令爷爷类被需继承

泛型编程

写出的是代码和处理的对象类型彼此独立

接口 多态
classes 以函数签名为中心
template 基于有效表达是

- template具现化只有当改类别被使用.
- 为了让类型转换发生于所有实参身上,我们需要一个non-member函数,为了令这个函数被自动具现化,我们需要将它声明在class内部,也就是在class内部声明friend
- traits 通过偏特化来实现编译期多态的优化,类型相关信息在编译期可用
- TMP模板元编程:让编译期帮你实现函数

内存管理

  • new 失败会调用new handler
  • 自行定义new handler是new 优于malloc的地方//雷火面试
  • 重定义new和重定义构造函数意义是不同的,new运算符进行内存控制更加优秀
  • placement new/delete:接受额外参数(logging)
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页