读书笔记_Effective_C++_条款十九:设计class犹如设计type

 

这里初看到”class”和”type”,感觉他们是说的是同一样东西,但仔细读了一下,两者在文中还是有区别的。class侧重于自定义的类,而type侧重于系统预定义的类(像int、double、string、vector)。设计好的class,使之像设计type一样,就是说要使自己设计的类像系统预定义的类那样好用,这对设计思想提出了较高的要求。

要设计高效的class,需要回答以下的问题:

1. 对象如何去创建和销毁?

这是构造函数和析构函数的问题,当然如果想要有堆分配方式,还需要重载new、new[]、delete和delete[]运算符;

 

2. 对象初始化与对象的赋值应该有什么样的差别?

初始化是构造函数和拷贝构造函数的事(这时候对象还没有产生),但对象的赋值却不同,因为此时等号左边的对象已经存在了。

 

3. 新type如果被pass-by-value意味着什么?

会调用相应的拷贝构造函数,要注意是否需要一个深拷贝。

 

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

要对对象的合法值进行限定,通常在构造函数中就对成员变量的范围给出限定,警惕不安全的输入值!

 

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

就是判断自己设计的class是否需要继承或被继承,是基类还是派生类。如果是基类的话,要注意是否允许这个基类生成对象(是否需要利用纯虚函数设计成抽象类),以及要将析构函数前面加上virtual。

 

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

主要是针对隐式转换,operator OtherType() const,但通常情况下隐式转换也意味着隐患,所以设计时要谨慎。另外,构造函数中也要当心,如果不想让隐式构造发生,就要在前面加上explicit关键字。举个例子:

 1 class A
 2 
 3 {
 4 
 5 private:
 6 
 7          int a;
 8 
 9 public:
10 
11          A(int b):a(b){}
12 
13 };
14 
15 void fun(A obj);

若调用fun(3),则编译器也能接受,因为编译器自动作了fun(A(3))的处理,这就是隐式构造。而如果用户自己写fun(A(3)),这是显式构造。当A的构造函数前有explicit时,fun(3)的调用将通不过编译器。通常情况下,隐式转换是安全的。

 

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

就是设计什么样的成员函数,以及重载哪些运算符。

 

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

是说哪些函数对外公开,哪些函数对内使用,这就是private,public和protected的功能啦,protected只有在有继承关系的类中使用才能发挥它真正的力量,普通的类用private和public就足够了。

 

9. 谁该取用新type成员?

与上面一条类似,就是类的封装性问题,一些而言,成员变量都应该是private的,而在public函数里面提供对这些成员变量的访问get和set函数。如果需要的话,可以使用友元,但友元也要慎用,因为有些编译器对之支持的不是很好,另一方面,友元成为破坏封装性的特例,会带来安全的隐患。

 

10. 什么是新type的未声明接口?

这个不大明白意思,先放在这里……

 

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

这牵涉到泛型编程了,就是模板的概念,这是C++比C要方便的多的多的地方——它将需要的类型交给编译器自动生成。

 

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

其实我觉得应该把这个问题放在第一个,因为设计最初首先要问的就是这个问题,如果都没有必要设计了,还需要回答前十一个问题吗?

 

最后总结一下:

class的设计就是type的设计,在设计之前先要把上述12个问题过一遍,这样可以有把握设计一个成功的类。

转载于:https://www.cnblogs.com/jerry19880126/archive/2013/06/01/3111908.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TensorFlow学习笔记:神经网络优化(6讲)】

目录【1】NN复杂度【2】指数衰减学习率【3】激活函数优秀激活函数所具有的特点常见的激活函数对于初学者的建议【4】损失函数【5】缓解过拟合——正则化【6】参数优化器【1】SGD【2】SGDM(SGD基础上增加了一阶动量)【3】Adagrade(SGD基础上增加了二阶动量)【4】RMSProp(SGD基础…

kotlin 构造函数_Kotlin程序| 主要构造函数示例

kotlin 构造函数主要建设者 (Primary Constructor) A Kotlin class have Primary constructor and one or more Secondary constructor. Kotlin类具有Primary构造函数和一个或多个Secondary构造函数。 In Kotlin, Primary Constructor is the Part of Class Header. 在Kotlin中…

把SQL Server 错误日志导出为EXCEL 并发送到指定的ftp 或者 共享盘

把SQL Server 错误日志导出为EXCEL 并发送到指定的ftp 或者 共享盘 /* 2005版本 和2000 版本 sql server 错误日志结果不同。 下面是 适用于 SQL2000的 其中加入了 自己编写的一个ftp小程序 用来上传 相关日志状况*/IF object_id(tempdb..#error_log) IS NOT NULLD…

c语言软件幻化,python字符串处理

字符串字符串:不可变有序序列,在python可使用 "abc" , """abc""" ,abc 的形式表示,属于一种字面常量,python3中字符均属于Unicode编码。字符串可以被迭代,遍历,切…

第十章 开箱即用

第十章 开箱即用 “开箱即用”(batteries included)最初是由Frank Stajano提出的,指的是Python丰富的标准库。 模块 使用import将函数从外部模块导入到程序中。 import math math.sin(0)#结果为:0.0模块就是程序 在文件夹中创…

博客换肤

一直以来觉得博客园里的主题不是特别好,很多模版多多少少都有些美中不足,于是今天抽了点时间把主题改改,哈。幸亏博客园支持自定义样式。 时间有限就先改到这里,今后有时间在进一步完美,呵呵。转载于:https://www.cnbl…

duration java_Java Duration类| 带示例的get()方法

duration java持续时间类get()方法 (Duration Class get() method) get() method is available in java.time package. get()方法在java.time包中可用。 get() method is used to return the value for the given unit. get()方法用于返回给定单位的值。 get() method is a non…

Openmv通过串口接收数据、发送数据与stm32通信

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录 参考接线星瞳教程openmv传送数据STM32解码程序参考 接线 星瞳教程

c语言尹宝林答案,c程序设计导引 尹宝林

《C程序设计导引》特别适合作为计算机和非计算机专业学生学习高级语言程序设计的教材,也可供计算机等级考试者和其他各类学习者使用参考。17.40定价:44.75(3.89折)/2013-05-01《大学计算机优秀教材系列:C程序设计导引》是一本讲解C程序设计的…

从程序员到项目经理(15):项目管理三大目标

项目管理的三大目标即时间、成本和质量,实际是告诉项目经理应重点关注什么因素,项目控制应该做什么工作。三大目标虽然简单,但如果能将其真正贯彻到自己的行动中,那么对项目计划制定、过程控制等工作,均能起到引导作用…

第十一章 文件

第十一章 文件 打开文件 当前目录中有一个名为beyond.txt的文本文件,打开该文件 调用open时,原本可以不指定模式,因为其默认值就是’r’。 import io f open(beyond.txt)文件模式 值描述‘r’读取模式(默认值)‘w…

iterator与iterable

用Iterator模式实现遍历集合Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。例如,如果没有使用Iterator,遍历一个数组的方法是使用索引: for(i…

Android中的Touch事件处理流程

1、当触摸屏幕时,最先执行的是Activity中的 publicbooleandispatchTouchEvent (MotionEvent ev) {if(ev.getAction() MotionEvent. ACTION_DOWN) {onUserInteraction();}if(getWindow().superDispatchTouchEvent(ev)) {returntrue;}returnonTouchEvent(ev);}如果某…

【TensorFlow学习笔记:神经网络八股】(实现MNIST数据集手写数字识别分类以及FASHION数据集衣裤识别分类)

课程来源:人工智能实践:Tensorflow笔记2 文章目录前言一、搭建网络八股sequential1.函数介绍2.6步法实现鸢尾花分类二、搭建网络八股class1.创建自己的神经网络模板:2.调用自己创建的model对象三、MNIST数据集1.用sequential搭建网络实现手写数字识别2.用…

c语言 在执行区域没有空格,C语言上机操作指导之TurboC.doc

C语言上机操作指导之 -------- Turbo C程序设计是实践性很强的过程,任何程序都必须在计算机上运行,以检验程序的正确与否。因此在学习程序设计中,一定要重视上机实践环节,通过上机可以加深理解 C语言的有关概念,以巩固…

java 根据类名示例化类_Java即时类| from()方法与示例

java 根据类名示例化类即时类from()方法 (Instant Class from() method) from() method is available in java.time package. from()方法在java.time包中可用。 from() method is used to return a copy of the Instant from the given TemporalAccessor object. from()方法用于…

第十二章 图形用户界面

第十二章 图形用户界面 GUI就是包含按钮、文本框等控件的窗口 Tkinter是事实上的Python标准GUI工具包 创建GUI示例应用程序 初探 导入tkinter import tkinter as tk也可导入这个模块的所有内容 from tkinter import *要创建GUI,可创建一个将充当主窗口的顶级组…

Sqlserver 2005 配置 数据库镜像:数据库镜像期间可能出现的故障:镜像超时机制

数据库镜像期间可能出现的故障 SQL Server 2005其他版本更新日期: 2006 年 7 月 17 日 物理故障、操作系统故障或 SQL Server 故障都可能导致数据库镜像会话失败。数据库镜像不会定期检查 Sqlservr.exe 所依赖的组件来验证组件是在正常运行还是已出现故障。但对于某…

江西理工大学期末试卷c语言,2016年江西理工大学信息工程学院计算机应用技术(加试)之C语言程序设计复试笔试最后押题五套卷...

一、选择题1. 设有函数定义:( )。A. B. C. D. 答:A则以下对函数sub 的调用语句中,正确的是【解析】函数的参数有两个,第一个是整型,第二个是字符类型,在调用函数时,实参必须一个是整型&#xff…

第十三章 数据库支持

第十三章 数据库支持 本章讨论Python数据库API(一种连接到SQL数据库的标准化方式),并演示如何使用这个API来执行一些基本的SQL。最后,本章将讨论其他一些数据库技术。 关Python支持的数据库清单 Python数据库API 标准数据库API…