[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,更能达到目标。

时间: 2024-10-14 02:57:42

[019]设计class犹如设计type的相关文章

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

Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新type的对象如果被passed by value(以值传递),意味着什么? 什么是新type的“合法值”? 你的新type需要配合某个继承图系(inheritance graph)吗? 你的新type需要什么样的转换? 什么样的操作符和函数对此新type而言是合理的? 什么样的标准函数应该驳回? 谁该取

<<Effective c++>>读书笔记---条款19:设计class犹如设计type

想要设计出高效的classes首先你必须了解你面对的问题.几乎每一个class都要求你面对一下提问,而你的回答往往导致你的设计规范: 新type的对象应该如何被创建和销毁? 构造函数.析构函数应该怎么写 对象的初始化和对象的赋值该有什么样的差别? 对象的赋值要注意资源的拷贝,初始化直接调用构造函数,而赋值会调用拷贝构造函数或赋值操作符= 新type的对象如果被passed by value(以值传递),意味着什么? 调用了拷贝构造函数,注意深拷贝和浅拷贝 什么是type的"合法值"?

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

1,新的type对象应该如何被创建和销毁? 这会影响class的构造函数ctor和析构函数dtor,以及内存分配函数和释放函数   //operator new //operator new[] //operator delete //operator delete[] 2,对象的初始化和对象的赋值该有什么什么区别? 初始化在于构造函数ctor 对象的赋值在于assigment操作符//operator = 3,新type的对象如果被passed by value意味着什么? 意味着产生一个co

响应式设计与自适应设计

响应式设计与自适应设计 相信从事前端页面设计的人都知道,页面呈现的效果及用户体验是非常重要的.当今社会移动设备的使用已超过了pc端,面对不同分辨率的设备,怎样做到页面体验的效果一样呢?这就成了最头疼的事情. 下面我们来看看响应式设计与自适应设计两者用法: 响应式Web设计(Responsive Web Design) :主要利用CSS3的媒介查询(Media Query)和Viewport来解决问题.通过媒介查询的设置,根据屏幕宽度.屏幕方向等各个属性来加载不同场景下不同的CSS文件来渲染页面的

WPF换肤之四:界面设计和代码设计分离

原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美工和程序分开进行,而不是糅合在一块,这样做的好处当然也是显而易见的:提高了开发效率. 原先的设计方式 在我们之前设计的代码中,每当添加一个新的窗体的时候,我总是会在这个新的窗体的XAML文件中加入如下的代码,以便使样式能够应用上去: <Window x:Class="WpfApplicatio

个人网站架构设计(三) - 从设计到前端到后台

在五月份,写过两篇博客,提到了要给自己做个网站,当时人在实习,没太多的时间,只是把大概的思路捋了一番,顺道也买了个云主机(配置比较低,内存才500M).接着返校处理毕业事宜,于是六月也随着同学之间挥泪告别的声音渐渐远去.七月,家里呆着,中旬回公司.想必这也是我近几年最长的一次假期了=. = 一.先说设计 1. 阮一峰的博客 目前我的博客设计是 fork 了 BeiYuu 的主题,然后七改八改,除了主页 BeiYuu 还认得出是他的之外,其他页面已经动了很大的手术,而这些手术灵感都是源自阮一峰阮大

框架源码系列一:设计模式(设计思想、设计原则、各种设计模式介绍、设计模式总结)

要分析常用框架spring.mybatis.springboot.springcloud等的源码,首先要了解各种设计模式,因为框架里面应用了各种设计模式 一.设计思想 学习设计模式最重要的是掌握设计思想和设计原则,理解了设计思想和设计原则并运用到平时的编码中是最重要的!!! 1. 我们先来看下面的问题: 天天加班编程,编程到底都做的是什么? 撸代码,加班撸代码,写接口.写类.写方法 用设计模式或做设计的作用是什么? 指导.规定该如何撸代码,如何来写接口.写类.写方法 为什么要做设计.用设计模式?

互联网网页设计与ui设计在未来发展的趋势

对于互联网来说,网页设计师这个职位还是挺热门的,毕竟,互联网已经越来越人性化啦,用的人越来越多,目前数据显示中国已经超过了6亿的用户数量UI设计公司,这表明:互联网是现实生活不可缺少的一部分.但是互联网的构成还得依靠网页才能体现在人们的眼前界面设计公司,大家说是吗?笔者相信只要懂互联网的都会毫不犹豫的说,是的!界面设计公司 网页是组成网站的基本,互联网又是由网站构成,但是网页必须由网页设计师来设计才行的,所以网页设计师职位的重要性相信大家都知道了吧,特别做了很多年以上的资历高深设计师,待遇和福利

WisDom.Net 框架设计(五) 权限设计

WisDom.Net --权限设计 1.需求分析     基本在所有的管理系统中都离不开权限管理.可以这么说,权限管理是管理系统的核心所在. 权限管理说白一些就是每个人能够做什么,不能够做什么.可以说是一套规则.下面就说一下,在wisdom.net中的权限     1. 控制用户修改和删除数据.即 用户编辑和删除自己创建的数据,但是只能编辑和删除比自己权限小的人创建的数据     2. 模块的控制. 用户只能访问自己被授权访问的模块,不能访问其他模块     3. 用户被赋予不同的角色,各个角色