前言

我们在编写程序的时候,无论哪一种语言,总是会告诉你这种语言应该有的类型。我们将它们直接拿来使用,可是从来没有考虑过这些类到底是怎么设计出来的!

所幸的是:在OOP中,每当我们定义一个新的class,也就相当于定义了一个新type。

那么,一个好的type是怎样设计出来的呢?我们需要考虑哪些事情呢?

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

包括构造和析构函数,内存分配和释放函数(operator new, operator delete,operator new[], operator delete[])等。

2,对象的初始化和对象的赋值有什么样的区别?

构造函数和赋值操作符的行为以及其间的差异。

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

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

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

对class的成员变量而言,通常只有某些值是有效的。决定了你的成员函数(特别是构造函数、赋值操作符和所谓的setter函数)必须进行错误检查工作。

它也影响函数抛出的异常以及函数异常明细列(exception specifications)

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

如果继承某些既有的class,你就受那些class的设计的束缚,特别是它们的函数是virtual或non-virtual的影响。如果你允许其他class继承你的class,那会影响你所声明的函数(尤其是析构函数)是否为virtual。

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

如果希望允许类型T1被隐式转换为类型T2, 就必须在class T1内写一个类型转换函数(operator T2)或在class T2中写一个non-explicit-one-argument(可被单一实参调用)的构造函数。或者一个专门执行显示转化的函数。

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

class该声明哪些函数。

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

那些正是你应该声明为private的。如不希望拷贝构造函数

9,谁该取用新type的成员?

决定哪个成员为public, protected, private,决定哪些classes和/或functions应该是friends。

10,什么是新type的“未声明接口”?

对效率、异常安全性、以及资源运用提供何种保证?这些保证将为你的代码加上相应的约束条件。

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

是不是一整个types家族,决定是不是要定义一个class template而非class。

12,你真需要一个type吗?

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

[Effective C++ --019]设计class犹如设计type的更多相关文章

  1. Effective C++(19) 设计class犹如设计type

    问题聚焦:     这一节不涉及代码,但是我们需要明确的一点是,思想比代码要重要得多.     设计优秀的classes是一项艰巨的工作,就像设计好的types一样.     我们应该带着和“语言设计 ...

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

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

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

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

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

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

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

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

  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. 使用ServiceStackRedis链接Redis简介

    注:关于如何在windows,linux下配置redis,详见这篇文章:) 目前网上有一些链接Redis的C#客户端工具,这里介绍其中也是目前我们企业版产品中所使用的ServiceStackRedis ...

  2. [转] Android SDK manager 无法获取更新版本列表

      打开这个网址(LINK)就可以看到adt的详细信息. 或者直接在你的eclipse的Help > Install New Software里面add,地址直接输入 https://dl-ss ...

  3. 第一章 Lambda表达式

    1.1 Why Lambdas? 当你操作多线程的时候,你会像下面这样将要处理的代码放到run()函数中: class Worker implements Runnable { public void ...

  4. <转>SpringMVC与Struts2 比较总结

    原链接:http://blog.csdn.net/chenleixing/article/details/44570681 个人整理: 1.级别不同:SpringMVC :方法  Struts是 类级 ...

  5. wuzhicms 无规律推荐位标签的嵌套使用

    这种布局的页面,要做推荐位的话,往往需要做3个推荐位.但这样就得维护3个推荐位内容. 其实可以通过简单粗暴的方式 一个推荐位即可搞定. 如下代码:  {wz:content action=" ...

  6. HW5.30

    public class Solution { public static void main(String[] args) { for(int i = 3; i <= 1000; i++) i ...

  7. intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

    ActivityA到ActivityBintent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);//ActivityB不加入后退栈android:noHisto ...

  8. SaltStack管理从这里开始

    Modules 1:查看所有module列表: salt 'jcfx-4' sys.list_modules jcfx-4: - acl - aliases - alternatives - apac ...

  9. nyoj 218 Dinner

    Dinner 时间限制:100 ms  |  内存限制:65535 KB 难度:1   描述 Little A is one member of ACM team. He had just won t ...

  10. iphone练习之手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognizer

    首先新建一个基于Sigle view Application的项目,名为GestureTest;我的项目结构如下: 往viewController.xib文件里拖动一个imageView,并使覆盖整个 ...