EffectiveC++-条款19:设计 class 犹如设计 type

一. 内容

  1. C++ 就像其他 OOP(面向对象编程)语言一样,当你定义一个新 class ,也就新定义了一个 type 。这意味你不仅是 class 设计者,还是 type 设计者。重载函数和操作符,控制内存的分配和归还,定义对象的初始化和销毁...全都在你手上。因此我们应该带着和语言设计者当初设计内置类型时,一样的谨慎来研讨 class 的设计。
  2. 如果设计高效的 class ?以下是一些问题:
    • 新 type 的对象应该如何被创建和销毁?这会影响到构造函数和析构函数,内存分配函数和释放函数(Operator new 和Operator delete / [ ]对应版本)
    • 对象的初始化和对象的赋值该有什么样的差别?这会影响构造函数和赋值操作符的行为及差异。
    • 新 type 的对象如果被 passed by value,意味着什么?这会影响拷贝构造函数的行为。
    • 什么是新 type 的合法值?对于 class 的成员变量而言,通常只有某些数值集是有效的。这些数值集决定了你的 class 必须维护的约束条件,也决定了你的成员函数,特别是构造函数,赋值函数,赋值操作符等必须进行的错误检查。
    • 你的新 type 需要配合某个继承图系吗?如果你的 class 继承自某些既有的 class,你就应该配合那些 classes 的设计,特别是对于 virtual 函数部分。
    • 你的新 type 需要什么样的转换?你的 type 生活在 types 的汪洋大海,应该要有转换行为吗?如果需要,可以编写类型转换函数 operator xxx(),或者显式编写转换函数。
    • 什么样的操作符和函数对此 type 而言是合理的?这会影响你的 class 声明那些函数。
    • 什么样的标准函数应该被驳回?这会影响编译器自动生成的函数。
    • 谁该取用新 type 的成员?这会影响哪些成员是 public,哪些成员是 protected,哪些成员是 private。
    • 什么是新 type 的未声明接口?接口的实现对效率,异常安全性,以及资源运用提供哪种保证?
    • 你的新 type 有多么一般化?如果你其实需要定义一类 types,其实更好的选择是定义一个新的 class template。
    • 你真的需要一个新 type 吗?如果只是定义新的 derived class 以便为既有的 base class 添加功能,说不定单纯定义一个或多个 non-member 函数或者 templates,更能达到目标。

二. 总结

  1. Class 的设计就是 type 的设计。在定义一个新的 type 之前,请确定你已经考虑过本条款覆盖的所有讨论主题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值