侧边栏壁纸
博主头像
如此肤浅

但行好事,莫问前程!

  • 累计撰写 52 篇文章
  • 累计创建 6 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

条款19 设计class犹如设计type

如此肤浅
2022-05-27 / 0 评论 / 0 点赞 / 34 阅读 / 1,188 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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

设计每一个 class 时,都应该有以下疑问:

  • 新 type 的对象应该如何被创建和销毁?
    需要思考构造函数和析构函数以及内存分配函数和释放函数要如何编写。

  • 对象的初始化和对象的赋值该有什么样的差别?
    需要思考构造函数和赋值操作符的行为,以及其差异。

  • 新 type 的对象如果被 passed by value(按值传递),意味着什么?
    需要思考拷贝构造函数如何实现一个 type 的 pass-by-value。

  • 什么是 type 的“合法值”?
    对类的成员变量而言,合法的取值范围决定了在成员函数中要进行错误检查工作。

  • 你的新 type 需要配合某个继承图系(inheritance graph)吗?
    如果新的 type 继承自某些已有的类,那么需要考虑受到哪些束缚,特别是受到“它们的函数是 virtual 或 non-virtual” 的影响。如果你允许其它的类继承你的 class,那么会影响你所声明的函数——尤其是析构函数——是否为 virtual(见条款7).

  • 你的新 type 需要什么样的转换?
    如果你希望允许类型 T1 之物被隐式转换为类型 T2 之物,就必须在 class T1 内写一个类型转换函数( operator T2)或在 class T2内写一个 non-explicit-one-argument(可被单一实参调用)的构造函数。如果你只允许 explicit 构造函数存在,就得写出专门负责执行转换的函数,且不得为类型转换操作符或 non-explicit-one-argument 构造函数。(条款15有隐式和显式转换函数的范例。)

  • 什么样的操作符和函数对此新type而言是合理的?
    思考需要为这个类设计哪些函数,其中哪些是成员函数,哪些不是。

  • 什么样的标准函数应该被驳回?
    将编译器会自动生成,而你不想要的标准函数声明为 private(见条款6)。

  • 谁该取用新 type 的成员?
    思考哪些成为为 public,哪些为 protected,哪些为 private;思考哪些类和函数应该是友元;思考将某个类嵌套在其它类中是否合理。

  • 什么是新 type 的“未声明接口”(undeclared interface)?
    它对效率、异常安全性(见条款29)以及资源运用(例如多任务锁定和动态内存)提供何种保证?你在这些方面提供的保证将为你的 class 实现代码加上相应的约束条件。

  • 你的新 type 有多么一般化?
    你的新 type 有多么一般化?或许你其实并非定义一个新 type,而是定义一整个 types 家族。果真如此你就不该定义一个新 class,而是应该定义一个新的 class template。

  • 你真的需要一个新 type 吗?
    如果只是定义新的 derived class 以便为现有的 class 添加新功能,那么说不定单纯定义一个或多个 non-member 函数或 templates,更能够达到目标。

0

评论区