[Effective C++ --019]设计class犹如设计type
前言
我们在编写程序的时候,无论哪一种语言,总是会告诉你这种语言应该有的类型。我们将它们直接拿来使用,可是从来没有考虑过这些类到底是怎么设计出来的!
所幸的是:在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的更多相关文章
- Effective C++(19) 设计class犹如设计type
问题聚焦: 这一节不涉及代码,但是我们需要明确的一点是,思想比代码要重要得多. 设计优秀的classes是一项艰巨的工作,就像设计好的types一样. 我们应该带着和“语言设计 ...
- Effective C++ -----条款19:设计class犹如设计type
Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...
- 条款19:设计class犹如设计TYPE(Treat class design as type design)
NOTE: 1.Class 的设计就是type的设计.在定义一个新type之前,请确认自己已经考虑过本条款所有主题(具体参考effective c++).
- EC笔记:第4部分:19、设计class犹如设计type
设计一个class,应该考虑以下问题: 新type的对象应该怎样创建和销毁? 构造函数 析构函数 内存分配 内存释放 对象的初始化和对象的赋值应该有什么样的差别? 拷贝构造函数 赋值运算符 新对象如果 ...
- 【19】设计class犹如设计type
设计class 的时候,需要好好考虑下面的问题: 1.新type的对象应该如何被创建和销毁? 2.对象的初始化和对象的赋值该有什么样的差别? 3.新type的对象如果pass by value,意味着 ...
- 条款19:设计class犹如设计type
1,新的type对象应该如何被创建和销毁? 这会影响class的构造函数ctor和析构函数dtor,以及内存分配函数和释放函数 //operator new //operator new[] // ...
- 《Effective C++》第4章 设计与声明(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- Effective C++笔记(四):设计与声明
参考:http://www.cnblogs.com/ronny/p/3747186.html 条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接 ...
- 《Effective C++》第4章 设计与声明(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
随机推荐
- Mysql slave 状态之Seconds_Behind_Master
在MySQL的主从环境中,我们可以通过在slave上执行show slave status来查看slave的一些状态信息,其中有一个比较重要的参数Seconds_Behind_Master.那么你是否 ...
- JDBC基础教程
本文实例讲述了JDBC基础知识与技巧.分享给大家供大家参考.具体分析如下: 1.什么是JDBC? 通俗来讲JDBC技术就是通过java程序来发送SQL语句到数据库,数据库收到SQL语句后执行,把结果返 ...
- 在Linux运行期间升级Linux系统(Uboot+kernel+Rootfs)
版本:v1.2 Crifan Li 摘要 本文主要介绍了如何在嵌入式Linux系统运行的时候,进行升级整个Linux系统,包括uboot,kernel和rootfs.以及简介Linux中的已有的通 ...
- Struts2 教程
一.Struts2是什么 Struts2是在WebWork2基础发展而来的.和Struts1一样, Struts2也是基于MVC的web层框架. 那么既然有了Struts1,为何还要Struts2? ...
- 【Jenkins】Linux搭建Jenkins平台
为了配合上一篇的ant+jenkins做持续集成,需要在linux环境下搭建一个jenkins平台.网上有很多安装的例子,我主要记录一下自己遇到的问题,真真的是特别惆怅的,每次我遇到的问题都格外多. ...
- HDU 1011-Starship Troopers(树形背包)
题意: 有n个洞,连接像一棵树,每个包含一定数量的怪和价值,给你m个士兵,每个士兵能打20个怪,杀完一个洞的怪可得该洞的价值才可继续打相连的下面的洞(每个士兵只能打一个洞),求获得的最大价值. 分析: ...
- HDU 2602 Find a way BFS搜索
题意:找到总时间最少的KFC 分析:两遍BFS 找KFC比较一下 注:有些地方的KFC可能到达不了,wa了一次 #include <iostream> #include <cstdi ...
- NOIP算法总结
前言 离NOIP还有一个星期,匆忙的把寒假整理的算法补充完善,看着当时的整理觉得那时还年少.第二页贴了几张从贴吧里找来的图片,看着就很热血的.旁边的同学都劝我不要再放PASCAL啊什么的了,毕竟我们的 ...
- 浏览器的CSS Hacks
LZ注:此文原作者是:Paul Irish(Google的前端开发工程师),本文是原文的部分译文. 我不再使用CSS Hacks了,相反的是,我将使用IE的条件判断将类应用到body标签. 但是, ...
- 8.3 MPI
MPI 模型 如图MPI的各个运算节点是分布式的.每一个节点可以视为是一个“Thread”,但这里的不同之处在于这些节点没有所谓的共享内存,或者说Global Memory.所以,在后面也会看到,一般 ...