Effective C++——条款19(第4章)

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

Treat class design as type design
    
    C++就像在其他OOP(面向对象编程)语言一样,当定义一个新的 class,也就定义了一个新type.
    如果设计高效的 class 呢?首先必须了解面对的问题,几乎每一个 class 都要求面对以下问题:
    1.新type的对象应该如何被创建和销毁?
这会影响到 class 的构造函数和析构函数以及内存分配函数和释放函数(operator new,operator new[], operator delete, operator delete[],详见第8章)的设计.
     2.对象的初始化和对象的赋值该有什么样的差别?这个答案决定构造函数和赋值操作符的行为,以及其间的差异.特别重要的是不要混淆了"初始化"和"赋值",因为它们对应于不同的函数调用(详见 条款4).
     3.新type的对象如果被pass by value,意味着什么?记住,copy构造函数用来定义type的pass by value该如何实现.
     4.什么是新type的"合法值"?对 class 的成员变量而言,通常只有某些数值集是有效的.那些数值决定了 class 必须维护的约束条件,也就决定了成员函数(特别是构造函数,赋值操作和set函数)必须进行的错误检查.它也影响函数抛出的异常.
     5.新type需要配合某个继承图系(inheritance graph)吗?如果继承自某些既有的 class,就会受到那些 class 设计的束缚,特别是受到"它们的函数是virtual或non-virtual"的影响.如果允许其他 class 继承,那么会影响所声明的函数,尤其是析构函数,是否为 virtual.
     6.新type需要什么样的转换?如果允许类型T1的对象转换为类型为T2的对象,就必须在 class T1 内写一个类型转换函数(operator T2).
     7.什么样的操作符和函数对新type而言是合理的?这个问题的大难决定为 class 声明哪些函数.
     8.什么样的标准函数应该驳回?那些正是必须声明为 private 的(详见 条款6).
     9.谁该取用新type的成员?这个问题可以帮助决定哪个成员为 public,哪个为 protected,哪个为 private.它也帮助决定哪一个 class/function 应该是 friend.
     10.什么是新type的"未声明接口"?它对效率,异常安全性以及资源运用提供何种保证,在这些方面的保证将为 class 实现代码加上相应的约束条件.
     11.新type有多么一般化?或许并非定义一个新type,而是定义一整个types家族.果真如此,则不应该定义一个 class,而是应该定义一个新的 class template.
     12.真的需要一个新type吗?如果只是定义新的derived class 以便为既有的 class 添加机能,那么说不定单纯定义一个或多个non-member函数或 template,更能够达到目标.
    这些问题并不容易回答,所以电脑诡异出一个高效的 class 是一种挑战.
     注意:
    class 的设计就是type的设计.在定义一个新的type之前,请确定已经考虑本条款覆盖的所有讨论主题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值