问题聚焦:
    这一节不涉及代码,但是我们需要明确的一点是,思想比代码要重要得多。
    设计优秀的classes是一项艰巨的工作,就像设计好的types一样。
    我们应该带着和“语言设计者当初设计语言内置类型时”一样的谨慎来研讨class的设计。

那么,如何设计高效的classes呢?
下面几乎每一个针对class设计的提问,往往就是你所需要遵守的设计规范。
1 新type的对象应该如何被创建和销毁?
    这会影响到你的class的构造函数和析构函数以及内存分配函数和释放函数的设计。
2 对象的初始化和对象的赋值该有什么样的差别?
    这个答案决定你的构造函数和赋值操作符的行为,以及其间的差异。
    很重要的一点:别混淆了“初始化”和“赋值”,因为它们对应于不同的函数调用。
3 新type的对象如果被passed by value,意味着什么?
    记住,拷贝构造函数用来定义一个type的pass-by-value该如何实现。
4 什么是新type的合法值?
    对class的成员变量而言,通常只有某些值集是有效的。
    那些值集决定了你的class:
  • 必须维护的约束条件
  • 决定了你的成员函数必须进行的错误检查工作
  • 影响函数抛出的异常
  • 函数异常明细列表

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

    如果你继承自某些既有的classes,你就受那些classes的设计的束缚,特别是受到它们的函数是virtual或non-virtual的影响。
    如果你允许其他classes继承你的class,那会影响你所声明的函数,尤其是析构函数。
6 你的新type需要什么样的转换?
    你的type生存于其他一堆types之间,因此彼此该有转换行为吗?
    如果你希望允许类型T1被隐式转换为类型T2,就必须在class T1内写一个类型转换函数或在class T2内写一个non-explicit-one-arument的构造函数。
7 什么样的操作符和函数对此新type而言是合理的?
    这个问题的答案决定你将为你的class声明哪些函数。其中某些该是member函数,某些则不是。
8 什么样的标准函数应该被驳回?
    那些正是你必须声明为private的函数。
9 谁该取用新type的成员?
    这个提问可以帮你你决定哪个成员为public,哪个为protected,哪个为private。
    它也帮助你决定哪一个classes和/或functions应该是friends,以及将它们嵌套于另一个之内是否合理。
10 什么是新type的“未声明接口”?
    它对效率,异常安全性以及资源运用提供何种保证?
    你在这些方面提供的保证将成为你的class实现代码加上相应的约束条件。
11 你的新type有多么一般化?
    或许你其实并非定义一个新type,而是定义个整个types家族。果真如此,你就不应该定义一个新class,而是应该定义一个新的class template。
12 你真的需要一个新type吗?
    如果只是定义新的derived class 以便为既有的class 加机能, 那么说不定单纯定义一或多个non-member函数或templates,更能打到目标。
这些问题不容易回答,所以定义出高效的classes是一种挑战。

小结:
class 的设计就是type的设计。
在定义一个新type或class之前,请认真考虑本节的12个问题。
参考资料:
《Effective C++ 3rd》

Effective C++(19) 设计class犹如设计type的更多相关文章

  1. Effective C++ -----条款19:设计class犹如设计type

    Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...

  2. 条款19:设计class犹如设计TYPE(Treat class design as type design)

    NOTE: 1.Class 的设计就是type的设计.在定义一个新type之前,请确认自己已经考虑过本条款所有主题(具体参考effective c++).

  3. EC笔记:第4部分:19、设计class犹如设计type

    设计一个class,应该考虑以下问题: 新type的对象应该怎样创建和销毁? 构造函数 析构函数 内存分配 内存释放 对象的初始化和对象的赋值应该有什么样的差别? 拷贝构造函数 赋值运算符 新对象如果 ...

  4. 【19】设计class犹如设计type

    设计class 的时候,需要好好考虑下面的问题: 1.新type的对象应该如何被创建和销毁? 2.对象的初始化和对象的赋值该有什么样的差别? 3.新type的对象如果pass by value,意味着 ...

  5. [Effective C++ --019]设计class犹如设计type

    前言 我们在编写程序的时候,无论哪一种语言,总是会告诉你这种语言应该有的类型.我们将它们直接拿来使用,可是从来没有考虑过这些类到底是怎么设计出来的! 所幸的是:在OOP中,每当我们定义一个新的clas ...

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

    1,新的type对象应该如何被创建和销毁? 这会影响class的构造函数ctor和析构函数dtor,以及内存分配函数和释放函数   //operator new //operator new[] // ...

  7. 《Effective C++》第4章 设计与声明(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  8. Effective C++笔记(四):设计与声明

    参考:http://www.cnblogs.com/ronny/p/3747186.html 条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接 ...

  9. 《Effective C++》第4章 设计与声明(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

随机推荐

  1. log4j与commons-logging,slf4j的关系(转)

    前面有一篇日志中简单的介绍了 log4j,同时也介绍了它与commons-logging的关系,但是突然冒出来一个slf4j,并且slf4j有取代commons-logging的趋势,所以,我们可以推 ...

  2. python派QQ邮件

    #encoding=utf-8 __author__ = 'ds' #文件名冲突 from email.mime.text import MIMEText import smtplib if __na ...

  3. springMVC3得知(五岁以下儿童)--MultiActionController

    Spring为了提供一个多动作控制器,您可以使用它的几个行动统一到一个控制器,这可以放在一起功能. 多动作控制器存在在一个单独的包中--org.springframework.web.mvc.mult ...

  4. 至linuxNIC添加多个IP

    由于工作的需要,只是有一个2以太网端口server构造3个月IP.制linux. 整理如以下的现在的过程,有离开后,,学生们也将不能够引用. IP1:10.110.97.68 IP2:10.115.2 ...

  5. AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔)

    AspNet.WebAPI.OData.ODataPQ 这是针对 Asp.net WebAPI OData 协议下,查询分页.或者是说 本人在使用Asp.Net webAPI 做服务接口时写的一个分页 ...

  6. C#二维码生成与解码(二)

    本文内容在<C#二维码生成与解码>的基础上增加了纠错级别和Logo图标加入,增加了二维码的功能.关于透明度在这里没有单独显现,因为在颜色里面就已经包含,颜色值由8位8进制构成,最前面的两位 ...

  7. Unity3D音频播放器 动态装载组件

    大多数在线Unity有关如何只教程Unity在播放音乐.之后如何通过拖动它们无法继续添加音频文件 但有时在游戏中的对象要玩几个声音.这时候我们就需要使用代码控制,拖动推教程AudioClip颂值的方法 ...

  8. 使用myeclipse创建带注解的model实体类

    1.先新建JPA项目: 如果没有就点击左下角的Show All Wizards. 点两次Next后,点击Finish即可,中间不用任何操作 (点第二次Next后会出现连接到所在数据库,先不管)     ...

  9. 【高德地图API】那些年我们一起开发的APP—即LBS应用模式分享

    原文:[高德地图API]那些年我们一起开发的APP—即LBS应用模式分享 摘要:利用地图API都能做些什么应用呢?应用商店里所有的分类,都可以结合上LBS来丰富应用.除了传统的生活服务应用,还有新潮的 ...

  10. 【百度地图API】如何判断点击的是地图还是覆盖物?

    原文:[百度地图API]如何判断点击的是地图还是覆盖物? 摘要:很多API爱好者问我,为什么我点击的是marker,而map也会响应该事件呢?怎样才能判断,我点击的是标注,还是地图呢?下面一起来看看. ...