Effective C++ 读书笔记----接口和类的设计

  • 设计接口时要让接口容易被正确使用,不易被误用。应该让接口具有如下这些性质:
    1. “促进被正确使用”,接口的一致性(比如STL中各个容器的接口)以及与内置类型的行为兼容。自定义的类型支持的操作尽量与内容类型的使用保持一致。
    2. “阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除对象的资源管理责任。
  • 消除对象的资源管理责任。比如说,如果某个函数返回一个指向动态开辟的内存的指针,要求调用这个接口的客户要记得将这块内存释放,如果客户忘了就会造成内存泄漏,而且还有用户对同一块内存释放多次的风险。为了防止防止这些风险,可以先发之人。将这块内存使用智能指针来管理,这样,就要求客户必须将返回值存储于一个指正指针中来使用。
  • boost中的shared_ptr是元是指针的两倍大,以动态内存作为薄记用途和“删除器之专属数据”,以virtual形式调用删除器,并在多线程程序修改引用计数时蒙受线程同步化的的额外开销。(可以通过定义一个预处理符号关闭多线程支持)。它比元是指针大且慢,而且使用辅助动态内存,但是在降级用户错误方面很有成效。
  • 设计一个类就相当于设计一种类型,设计一个高效的类需要将如下情况都设计好:

    1. 新类型的对象怎么创建和销毁。这关乎到构造函数和析构函数以及内存分配函数和释放函数。
    2. 对象的初始化和对象的赋值有什么样的差别。这是构造函数和赋值函数需要考虑的问题。
    3. 新类型的对象如果被值传递,意味着什么。拷贝构造函数用来定义设计的类型的值传递该如何实现。
    4. 什么是新类型的合法值。在构造函数和赋值操作符中必须对值的合法性进行检查。
    5. 新类型是否需要配合某个继承体系。比如说,如果设计的类允许被继承并且有可能被继承,那么应该将析构函数设置为虚函数。
    6. 新类型需要什么样的类型转换。如果希望允许由类型T1被隐式转换为类型T2,就必须在类T1中写一个类型转换函数(operator T2)或者在类T2中写一个可被单一实参调用的构造函数。
    7. 什么有的操作符和函数对新类型来说是合理的。也就是说怎么设计类的成员函数。
    8. 谁能取用新类型的成员。即类成员应该声明为public、protected、private还是friend。
    9. 什么是新类型的“未声明接口”。它对效率、异常安全性以及资源运用提供何保证。并为这些保证设置相应的约束条件。
    10. 是定义一个新类型还是定义一个模板类型。
    11. 是否真的需要定义一个这样的类型。或许单纯的定义一个函数或一个模板就能达到目标。

猜你喜欢

转载自blog.csdn.net/guaiguaihenguai/article/details/81428311