Effective C++ 条款19 设计class犹如设计type

条款19 : 设计class犹如设计type

C++ 是面向对象编程语言, 当你定义了一个新class, 也就定义了一个新type. 然而设计一个优秀的class是一项艰巨的任务, 正如设计一个好的type是一项艰巨的任务. 本条款将依照一个好的类型应有的行为来指导我们class的设计, 并一一列举出来.

当我们要设计一个class时, 让我们对自己提出这些问题吧 :

  • 新type的对象应该如何创建和销毁?

    想想class的构造和析构是否可以默认生成 不能的话该怎样编写.

    想想是否要是设计内存的分配函数和释放函数.

  • 对象的初始化和对象的赋值该有什么样的差别?

    想想在class构造时需要有什么特殊的步骤, 以及是否需要设置一个init函数辅助构造.

    想想copying时的策略是怎样的. (见条款14)

  • 新type的对象如果被 pass-by-value(以值传参) , 意味着什么?

    记住copy构造函数用来定义一个typepass-by-value 应当产生的行为.

  • 什么是新type的”合法值”?

    想想class的成员变量在你的预期中是否有一个合法的范围, 想想该怎样约束.

    想想是否要设置超出合法范围时触发的检查机制.

  • 新type需要配合某个继承图系吗?

    如果其继承自某些既有的class, 你就应当受到那些class设计的束缚, 好好分析那些virtual函数是否要重写, 哪些不用.

    尤其看看析构函数是否为virtual. (见条款7)

  • 新type需要什么样的转换?

    想想你的class可以和其他class产生什么可能且合理的转换, 如果有可以考虑实施.

    如果有就写一个类型转换函数或接受其他类型的构造函数, 没有请声明explicit.

  • 什么样的操作符和函数对此新type而言是合理的?

    这个属于你的设计私事, 但也必须考虑清楚.

  • 什么样的默认成员函数应该驳回?

    将需要驳回的成员函数设置为private或者直接delete掉. (见条款6)

  • 谁该取用新type的成员?

    想想哪些成员应设为public, 哪些应设为protected, 哪些应设为private.

    想想哪些classes/functions应是friends.

  • 什么是新type的”未声明接口”?

    想想你的class不对外的底层函数可以提供什么样的服务, 是否进行资源运用, 是否需要应对多线程情况, 以此在实现中加上相应的约束条件.

  • 新type有多么一般化?

    想想你的class是否要接受泛型编程, 有没有使用泛型编程的必要.

  • 真的需要一个新type吗?

    想想真的要定义一个新的class吗? 在你定义derived class时, 如果只是单纯地想添加一些机能, 而不是出于多态考虑, 那么说不定单纯定义一个或多个 non-member 函数或 templates, 更能够达到目标. 就像是STL源码中的priority_queue, 为了使用堆机制其实并没再建立一个专属的堆类, 而是写了几个用于调整堆结构的函数, 再套在vector上就实现了堆的功能.


请记住 :

  • class的设计就是type的设计, 在设计一个class之前请确定思考过本条款所提出的所有问题.

by 天目中云


Effective C++ 条款19 设计class犹如设计type
http://example.com/2024/11/30/[Effective C++]条款19 设计class犹如设计type/
作者
天目中云
发布于
2024年11月30日
许可协议