Effective cpp 读书笔记4

来源:互联网 发布:淘宝代购衣服是正品吗 编辑:程序博客网 时间:2024/05/11 12:04

设计与声明(上)

18.让接口容易被使用,不易被误用

  1. “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容

  2. “阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任

  3. shared_ptr支持定制型删除器。这可防范DLL问题,可被用来自动解除互斥锁等

    • 如果接口要求客户必须记得做某些事情,就是有着”不正确使用“的倾向
    • shared_ptr提供的构造函数接受2个实参,一个是被管理的指针,一个是引用次数变0时将被调用的“删除器”
    • “将原始指针传递给pInv构造函数”会比“先将pInv初始化为null再对它做一次赋值操作”更好
    • cross-DLL problem:对象在动态链接程序库(DLL)中被new,却在另一个DLL内被delete。许多平台,这一类“跨DLL的new/delete”会导致运行错误,shared_ptr则能解决这个问题

19.设计class犹如设计type

  1. 新type的对象应该如何被创建和销毁(涉及构造和析构函数)

  2. 对象初始化和对象赋值应该有什么差别(涉及构造和assignment)

  3. 新type的对象如果被passed by value,意味着什么?(复制构造)

  4. 什么是新type的“合法值”(注意错误检查,抛出异常)

  5. 新type是否需要配合某些继承图系(涉及virtual)

  6. 新type需要什么样的转换(涉及隐式转换与否,构造函数是否explicit)

  7. 什么样的操作符和函数对新type合理(需要声明什么成员函数)

  8. 什么样的标准函数应该驳回(那些需要声明为private)

  9. 谁该用新type的成员(确定public、private、protected函数)

  10. 什么是新type未声明的接口

  11. 新type有多么一般化(定义类,函数模板类)

  12. 是否真的需要设计type


20.宁以pass-by-reference-to-const替换pass-by-value

  1. 尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题

  2. 以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较适当

    • by-reference主要是避免复制构造,同时,const能够提示用户保证不修改输入
    • 切割问题:函数的参数是一个基类,那么函数内调用的虚函数只能对应基类。当用户使用的时候,调用该函数,输入的派生类会被默认“转为”基类。by-reference可能保证这种情况下,仍然调用派生类的虚函数- 因为virtual的函数导致class存在虚函数表,增大了存储空间
    • pass-by-value在内置类型和STL中效果比references好,是因为它们小,而且编译器有优化。用户自定义的类型,即使小,也应该尽量用by-reference-to-const的形式

21.必须返回对象时,别妄想返回其reference

  1. 绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象

  2. 一个“必须返回新对象”的函数的正确写法是让它返回新对象,尽管表面上似乎违背条款3

    • 指向local stack对象,因为在返回时自动销毁,指向了奇怪的地方
    • 指向heap-allocated对象,有可能会忘记销毁或者导致无法销毁
    • 指向local static对象,会对多线程安全性出现问题
0 0