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

条款19:设计class犹如设计type
       当你定义了一个新的class时,也就定义了一个新的type。身为c++程序员,你有许多时间主要用来扩张你的类型系统。这意味着你并不只是class设计者,还是type设计者。重载函数和操作符,控制内存的分配和归还,定义对象的初始化和终结…全都在你的手上。因此你应该带着和“语言设计者当初设计语言内置类型时”一样的谨慎来研讨class的设计。
       几乎每一个class设计都需要面对以下提问。

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

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

       这决定了class的构造函数和赋值(assignment)操作符的行为,以及其间的差别,很重要的是不要混淆了初始化和赋值。

3、  新type的对象如果被passed by value(以值传递),意味着什么?

       copy的构造函数定义了一个type的pass-by-value该如何实现。

4、  什么是新type的合法值?

        对class的成员变量而言,通常只有某些数值集是有效的。那些数值集决定了你的class必须维护的约束条件,也就觉得了你的成员函数(特别是构造函数,赋值操作符以及所谓的seter函数)必须进行的错误检查。

5、  你的新的type需要配合某个继承体系吗?

       如果你继承自某些既有的class,你就受到那些class的设计的束缚,特别是他们的函数是virtual或no-virtual的影响。如果允许其他的classes继承你的class,那么你所声明的函数——尤其是析构函数——是否为virtual。

6、  你的新type需要什么样的转换?

        如果你希望类型T1之物被隐式转换为T2之物,就必须在T1内些一个类型转换函数operator T2或在T2内部写一个non-explicit-one-argument(可被单一实参调用)的构造函数。如果你只允许explicit构造函数存在,就得写出专门负责转换的函数,且不得为类型转换操作符(type conversion operator)或non-explicit-one-argument构造函数。尽量避免隐式转换。

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

8、  什么样的标准函数应该被驳回?

       那些正是你声明为private的函数,比如,构造函数可能会声明为private,也就是不允许进行new操作。

9、  谁该取用type的成员?

       这可以决定哪些成员是public,那些成员是protected,那些为private,也可以决定哪些classes和function是friends。

10、  声明式新type的未声明接口?

11、  你的新type有多么的一般化?

        或许你其实并不是定义一个新type,而是定义一整个types家族。果真如此你就不应该定义一个新的class,而应该定义一个新的class template。

12、 你真的需要一个新的type吗?

       如果只是定义新的derived class以便为既有的class添加新机能,那么说不定单纯定义一个或多个non-members函数或template更能达到目的。

记住
      Class设计就是type的设计。在定义一个新的type之前,请确定已经考虑本条款覆盖的所有内容。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值