上善若水,厚德载物
大道无亲 大象无形 大音希声 大巧若拙 大智若愚 大器晚成
生命的隐喻:自我意识产生于躯体,躯体产生于食物,食物源于物质,物质源于太阳辐射能。
http://cyberzei.wordpress.com
C++博客
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
我的类设计复查表
需要构造器吗?
数据成员是private的吗?它可以是const的吗?
需要默认构造器吗?
是不是每个构造器初始化了所有成员?
需要析构器吗?它需要虚化吗?
需要拷贝构造器吗?
需要assigment operator吗?它能正确自赋值吗?
需要关系操作符吗?
在函数形参上使用了const吗?在成员函数之后呢?
删除数组成员时用delete []吗?
这个列表是在很久前自从看了《C++沉思录》后,一直稳定的沿用至今,是要求作出高度复用的类设计之保障。希望能对别人有个抛砖引玉的作用。
发表于 2007-04-16 19:51
Corner Zhang
阅读(944)
评论(1)
编辑
收藏
引用
所属分类:
乱七八糟
评论
#
re: 我的类设计复查表[未登录]
记得 Effective C++ 3rd Item 19 专门说了如何设计一个类,贴一下
Previous Section < Day Day Up > Next Section
Item 19: Treat class design as type design
设计 class 犹如设计 type
C++ 就像在其他 OOP(面向对象编程)语言一样,当你定义一个新的 class,也就定义了一个新 type。身为 C++ 程序员,你的许多时间主要用来扩张你的类型系统(type system)。这意味你并不只是 class 设计者,还是 type 设计者。重载(overloading)函数和操作符、控制内在的分配和归还、定义对象的初始化和终结……全都在你手上。因此你应该带着和“语言设计者当初设计语言内置类型里时”一样的谨慎来研讨 class 的设计。
设计优秀的 classes 是一项艰巨的工作,因为设计好的 types 是一项艰巨的工作。好的 types 有自然的语法,直观的语义,以及一或多个高效实现品。在 C++ 中,一个不良规划下的 class 定义恐怕无法达到上述任何一个目标。甚至 class 的成员函数的效率都有可能受到它们“如何被声明”的影响。
那么,如何设计高效的 classes 呢?首先你必须了解你面对的问题,几乎每一个 class 都要求你面对以下提问,而你的回答往往导致你的设计规范:
新 type 的对象应该如何被创建和销毁?? 这会影响到你的 class 的构造函数和析构函数以及内存分配函数和释放函数(operator new, operator new[], operator delete 和 operator delete[] 见 第八章)的设计,当然前提是如果你打算撰写它们。
对象的初始化和对象的赋值该有什么样的差别? 这个答案决定你的构造函数和赋值(assignment)操作符的行为,以及其间的差异。很重要的是别混淆了“初始化”和“赋值”,因为它们对应于不同的函数调用(见条款四)。
新 type 的对象如果被 passed by value(以值传递),意味着什么? 记住, copy 构造函数用来定义一个 type 的 pass-by-value 该如何实现。
什么是新 type 的“合法值”? 对 class 的成员变量而言,通常只有某些数值集是有效的。那些数值集决定了你的 class 必须维护的约束条件(invariants),也就决定了你的成员函数(特别是构造函数、赋值操作符和所谓“setter”函数)必须进行的错误检查工作。它也影响函数抛出异常、以及(极少被使用的)函数异常明细列(exception specifications)。
你的新 type 需要配合某个继承图系(inheritance graph)吗 ? 如果你继承自某些既有的 classes,你就受到那些 classes 的设计的束缚,特别是受到“它们的函数是 virtual 或 non-virtual”的影响(见条款三十四和条款三十六)如果你允许其他 classes 继承你的 class,那会影响你所声明的函数——尤其是析构函数——是否为 virtual(见 条款七)。
你的新 type 需要什么样的转换? 你的 type 生存于其他一海票 types 之前,因而彼此该有转换行为吗?如果你希望允许类型 T1 之物被隐式转换为类型 T2 之物,就必须在 class T1 内写一个类型转换函数(operator T2)或在 class T2 内写一个 non-explicit-one-argument(可被单一实参调用)的构造函数。如果你只允许 explicit 构造函数存在,就得写出专门负责执行转换的函数,且不得为类型转换操作符(type conversion operators) 或 non-explicit-one-argument 构造函数。(条款十五有隐式和显式转换函数的范例。)
什么样的操作符和函数对此新 type 而言是合理的? 这个问题的答案决定你将为你的 class 声明哪些函数。其中某些该是 member 函数,某些则否见(条款二十三,条款二十四,条款四十六)
什么样的标准函数应该驳回? 那些正是你必须声明为 private 者(见条款六)。
谁该取用新 type 的成员? 这个提问可以帮助你决定哪个成员函数为 public,哪个为 protected,哪个为 private。它也帮助你决定哪一个 classes 和/或 function 应该是 friends,以及将它们嵌套于另一个之内是否合理。
什么是新 type 的“未声明接口”(undeclared interface)? 它对效率、异常安全性(条款二十九)以及资源运用(例如多任务锁定和动态内存)提供何种保证?你在这些方面提供的保证将为你的 class 实现代码加上相应的约束条件。
你的新 type 有多么一般化? 或许你其实并非定义一个新 type,而是定义一整个 types 家族。果真如此你就不该定义一个新 class,而是应该定义一个新的 class template。
你真的需要一个新 type 吗? 如果只是定义新的 derived class 以便既有的 class 添加机能,那么说不定单纯定义一或多个 non-member 函数或 templates,更能够达到目标。
这些问题不容易回答,所以定义出高效的 classes 是一种挑战。然而如果能够设计出至少像 C++ 内置类型一样好的用户自定义(user-defined)classes,一切汗水便都值得。
请记住
Class 的设计就是 type 的设计。在定义一个新 type 之前,请确定你已经考虑过条款覆盖的所有讨论主题。
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
关于本人接触到的一些技术方案的感想
寒!用了n年的VC,今天才发现项目设置中加入另一种宏定义的样子!
发人深省 《攻壳机动队》经典对白
需要Google Wave邀请的留言
一个乞丐的故事 --!感兴趣的看看
【望管理员置顶】警告贴文 -- 最近我一好友遭遇msn上的网络诈骗,幸好被我等好人协助,得以揭穿,值得这里一帖
C代码中符合标准的方式输出中文
编程时经常使用到的标点符号列表!
Unreal Engine (虚幻) 开发的游戏列表
(分享) 什么是游戏引擎? What ... Game Engine
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
随笔:105 文章:16 评论:346 引用:0
<
2007年4月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(8)
给我留言
查看公开留言
查看私人留言
随笔分类
(80)
IdTech系列(7)
(rss)
InfiniteEngine(8)
(rss)
Qt Gui(4)
(rss)
乱七八糟(55)
(rss)
下载(download)(4)
(rss)
源码分析(2)
(rss)
随笔档案
(105)
2015年4月 (1)
2015年3月 (2)
2012年5月 (1)
2012年4月 (3)
2012年3月 (1)
2011年11月 (1)
2011年1月 (1)
2010年9月 (1)
2010年8月 (1)
2010年6月 (2)
2010年5月 (8)
2010年4月 (1)
2010年1月 (1)
2009年12月 (2)
2009年10月 (1)
2009年8月 (1)
2009年7月 (2)
2009年5月 (1)
2009年4月 (5)
2009年1月 (1)
2008年12月 (4)
2008年11月 (1)
2008年10月 (2)
2008年9月 (1)
2008年8月 (2)
2008年7月 (4)
2008年6月 (6)
2008年5月 (3)
2008年4月 (4)
2008年3月 (4)
2008年1月 (1)
2007年12月 (3)
2007年11月 (1)
2007年10月 (4)
2007年7月 (2)
2007年6月 (7)
2007年4月 (9)
2007年3月 (3)
2007年2月 (2)
2007年1月 (5)
文章分类
(11)
个人实现品
(rss)
思量(11)
(rss)
文章档案
(16)
2010年5月 (3)
2008年4月 (2)
2008年3月 (1)
2007年12月 (3)
2007年6月 (1)
2007年4月 (6)
相册
Diagram
Pica
Snapshots
关联
my blogspot
我生活中的所思所想
最新随笔
1. 搭建CentOS(Linux)学习环境_日志(01)
2. Python学习备忘
3. 关于本人接触到的一些技术方案的感想
4. 仿照Doom3里面的部分代码,给自己的引擎加入了screenshot功能,show一张图
5. DoomEd Snapshot
6. Doom3源代码 code review 01
7. Doom3 编辑器已经运行!!! ^^
8. iDTech4(Doom3)编译以通过
9. 今天开始 有空就看看Doom3.gpl
10. 今天搞数据持久化遇到的文件结尾符问题!
11. 【值得一看】恶心的平安保险,希望保持警惕!
12. 寒!用了n年的VC,今天才发现项目设置中加入另一种宏定义的样子!
13. 发人深省 《攻壳机动队》经典对白
14. 不知道如何用google code上传代码的看这里
15. 注意:有兴趣一起做开源游戏引擎的~看过来!
16. cryEngine3 技术演示 -- 难得的高清晰版,震撼的要得心脏病
17. 非实时视频交流方案 来自screencast.com的方案
18. 用msn live - skydrive (25GB) 作为学习文档存放
19. 为团队发布对外动态信息
20. 使用google code服务
21. 使用现有的免费网络服务管理开源项目 -- 工具篇howto-s
22. 需要Google Wave邀请的留言
23. 看了ETQW_SDK的仿函数机制,以及由此实现的Signal/Slot
24. 一个乞丐的故事 --!感兴趣的看看
25. 【望管理员置顶】警告贴文 -- 最近我一好友遭遇msn上的网络诈骗,幸好被我等好人协助,得以揭穿,值得这里一帖
26. 爱与被爱 (2009年就快过去,给剩的人!) ^^!
27. 更改VAX的索引数据目录 -- 很实用,可以减少系统盘的开销
28. 本人正在做的开源游戏引擎,找志同道合的朋友一起开发
29. C代码中符合标准的方式输出中文
30. 编程时经常使用到的标点符号列表!
31. 我的游戏引擎设计
32. Unreal Engine (虚幻) 开发的游戏列表
33. (分享) 什么是游戏引擎? What ... Game Engine
34. C++ 代码技巧 (续 02)
35. C++ 代码技巧 (续 01)
36. C++ 代码技巧
37. 有人在管制这个国家吗? [转]
38. 优良C++程序设计的法则
39. 不满意的这一年
40. [转载] NXN - AlienBrain Server 的安装
搜索
积分与排名
积分 - 209808
排名 - 120
最新评论
1. re: Python学习备忘
博主你这三年在干嘛
--Pf_D
2. re: 关于本人接触到的一些技术方案的感想
评论内容较长,点击标题查看
--何清龙
3. re: 关于本人接触到的一些技术方案的感想
Rust这个语言,Golang呢、
--老钟古
4. re: 关于本人接触到的一些技术方案的感想
评论内容较长,点击标题查看
--陈冠希
5. re: iDTech4(Doom3)编译以通过
我debug和release都编译过去了,但是我想学习它debug内存的的部分,但是这个对应的configuration没编译过去,请问你能编译过去吗?
--凃鸣
6. re: Doom3源代码 code review 01
@name
确实! 已改
--Corner Zhang
7. re: Doom3源代码 code review 01[未登录]
少了virtual吧。
这种全局变量其实很好啊,实用,简单。
--name
8. re: 关于c++中template特性的思考
这也是真知灼见了。我最近倒是很追求模板,反倒设计非常受限于oo。
--idreamer
9. re: iDTech4(Doom3)编译以通过
个人观点,学以致用
--571
10. re: 有人在管制这个国家吗? [转]
嘘!小心泄露国家机密
--571
阅读排行榜
1. 花了30'搞懂的svn checkout(14347)
2. 不知道如何用google code上传代码的看这里(13460)
3. 关于c++中template特性的思考(6040)
4. [转载] NXN - AlienBrain Server 的安装(4901)
5. compile alsa sound system on linux(arm)(4353)
评论排行榜
1. 需要Google Wave邀请的留言(21)
2. 本人正在做的开源游戏引擎,找志同道合的朋友一起开发(18)
3. 编程时经常使用到的标点符号列表!(12)
4. C++ 代码技巧 (续 02)(11)
5. 程序点滴--一种定义简单的状态管理策略(10)
迷时师度,悟了自度