上善若水,厚德載物
大道無親 大象無形 大音希聲 大巧若拙 大智若愚 大器晚成
生命的隱喻:自我意識產生于軀體,軀體產生于食物,食物源于物質,物質源于太陽輻射能。
http://cyberzei.wordpress.com
C++博客
|
首頁
|
發新隨筆
|
發新文章
|
聯系
|
聚合
|
管理
我的類設計復查表
需要構造器嗎?
數據成員是private的嗎?它可以是const的嗎?
需要默認構造器嗎?
是不是每個構造器初始化了所有成員?
需要析構器嗎?它需要虛化嗎?
需要拷貝構造器嗎?
需要assigment operator嗎?它能正確自賦值嗎?
需要關系操作符嗎?
在函數形參上使用了const嗎?在成員函數之后呢?
刪除數組成員時用delete []嗎?
這個列表是在很久前自從看了《C++沉思錄》后,一直穩定的沿用至今,是要求作出高度復用的類設計之保障。希望能對別人有個拋磚引玉的作用。
發表于 2007-04-16 19:51
Corner Zhang
閱讀(945)
評論(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 之前,請確定你已經考慮過條款覆蓋的所有討論主題。
cpper
評論于 2007-04-16 21:09
回復
更多評論
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
相關文章:
關于本人接觸到的一些技術方案的感想
寒!用了n年的VC,今天才發現項目設置中加入另一種宏定義的樣子!
發人深省 《攻殼機動隊》經典對白
需要Google Wave邀請的留言
一個乞丐的故事 --!感興趣的看看
【望管理員置頂】警告貼文 -- 最近我一好友遭遇msn上的網絡詐騙,幸好被我等好人協助,得以揭穿,值得這里一帖
C代碼中符合標準的方式輸出中文
編程時經常使用到的標點符號列表!
Unreal Engine (虛幻) 開發的游戲列表
(分享) 什么是游戲引擎? What ... Game Engine
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
隨筆:105 文章:16 評論:346 引用:0
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
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
31
1
2
3
4
5
6
7
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(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 的安裝
搜索
積分與排名
積分 - 211443
排名 - 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(14355)
2.?不知道如何用google code上傳代碼的看這里(13474)
3.?關于c++中template特性的思考(6063)
4.?[轉載] NXN - AlienBrain Server 的安裝(4954)
5.?compile alsa sound system on linux(arm)(4361)
評論排行榜
1.?需要Google Wave邀請的留言(21)
2.?本人正在做的開源游戲引擎,找志同道合的朋友一起開發(18)
3.?編程時經常使用到的標點符號列表!(12)
4.?C++ 代碼技巧 (續 02)(11)
5.?程序點滴--一種定義簡單的狀態管理策略(10)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 Corner Zhang
迷時師度,悟了自度
国产美女亚洲精品久久久综合
|
88久久精品无码一区二区毛片
|
久久国产免费直播
|
亚洲国产日韩综合久久精品
|
三级三级久久三级久久
|
狠狠色丁香久久婷婷综合_中
|
一本久久知道综合久久
|
婷婷久久久亚洲欧洲日产国码AV
|
久久人妻少妇嫩草AV无码专区
|
久久精品男人影院
|
精品久久久久久亚洲精品
|
精品久久久久香蕉网
|
一级做a爰片久久毛片16
|
久久国产视屏
|
狠狠综合久久综合88亚洲
|
久久精品无码专区免费青青
|
久久久久成人精品无码
|
国产精品久久久久久五月尺
|
99久久久精品
|
久久综合九色综合网站
|
久久99热精品
|
久久最新免费视频
|
久久精品国产福利国产琪琪
|
久久精品九九亚洲精品
|
精品久久人人爽天天玩人人妻
|
亚洲欧美伊人久久综合一区二区
|
久久精品国产亚洲Aⅴ香蕉
|
欧美大香线蕉线伊人久久
|
国产精品成人99久久久久
|
久久人人爽人人爽人人爽
|
精品久久8x国产免费观看
|
久久播电影网
|
激情伊人五月天久久综合
|
久久久人妻精品无码一区
|
99精品国产免费久久久久久下载
|
精品久久久久久无码中文野结衣
|
亚洲日本久久久午夜精品
|
精品久久久久久
|
精品一二三区久久aaa片
|
日日狠狠久久偷偷色综合0
|
久久精品人人做人人爽电影
|