上善若水,厚德載物
大道無親 大象無形 大音希聲 大巧若拙 大智若愚 大器晚成
生命的隱喻:自我意識產生于軀體,軀體產生于食物,食物源于物質,物質源于太陽輻射能。
http://cyberzei.wordpress.com
C++博客
|
首頁
|
發新隨筆
|
發新文章
|
聯系
|
聚合
|
管理
我的類設計復查表
需要構造器嗎?
數據成員是private的嗎?它可以是const的嗎?
需要默認構造器嗎?
是不是每個構造器初始化了所有成員?
需要析構器嗎?它需要虛化嗎?
需要拷貝構造器嗎?
需要assigment operator嗎?它能正確自賦值嗎?
需要關系操作符嗎?
在函數形參上使用了const嗎?在成員函數之后呢?
刪除數組成員時用delete []嗎?
這個列表是在很久前自從看了《C++沉思錄》后,一直穩定的沿用至今,是要求作出高度復用的類設計之保障。希望能對別人有個拋磚引玉的作用。
發表于 2007-04-16 19:51
Corner Zhang
閱讀(947)
評論(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
<
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 的安裝
搜索
積分與排名
積分 - 211726
排名 - 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上傳代碼的看這里(13476)
3.?關于c++中template特性的思考(6065)
4.?[轉載] NXN - AlienBrain Server 的安裝(4957)
5.?compile alsa sound system on linux(arm)(4364)
評論排行榜
1.?需要Google Wave邀請的留言(21)
2.?本人正在做的開源游戲引擎,找志同道合的朋友一起開發(18)
3.?編程時經常使用到的標點符號列表!(12)
4.?C++ 代碼技巧 (續 02)(11)
5.?程序點滴--一種定義簡單的狀態管理策略(10)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 Corner Zhang
迷時師度,悟了自度
麻豆av久久av盛宴av
|
WWW婷婷AV久久久影片
|
久久免费线看线看
|
久久e热在这里只有国产中文精品99
|
久久精品国产久精国产思思
|
久久精品国产亚洲精品2020
|
国产69精品久久久久9999
|
国产激情久久久久影院老熟女
|
久久这里只精品99re66
|
久久99精品久久久久久hb无码
|
99久久精品免费国产大片
|
国产成人无码精品久久久性色
|
天天爽天天爽天天片a久久网
|
中文字幕精品久久
|
久久狠狠色狠狠色综合
|
久久久亚洲裙底偷窥综合
|
国产精品嫩草影院久久
|
久久精品aⅴ无码中文字字幕不卡
|
亚洲国产成人精品久久久国产成人一区二区三区综
|
国产精品成人精品久久久
|
精品久久久久久久中文字幕
|
久久WWW免费人成一看片
|
久久综合狠狠色综合伊人
|
精品久久久中文字幕人妻
|
久久国产一片免费观看
|
久久亚洲精品成人AV
|
99久久亚洲综合精品网站
|
人人妻久久人人澡人人爽人人精品
|
久久被窝电影亚洲爽爽爽
|
国内精品综合久久久40p
|
天天综合久久一二三区
|
久久国产精品视频
|
青青青青久久精品国产h
|
国内精品伊人久久久久AV影院
|
色青青草原桃花久久综合
|
yellow中文字幕久久网
|
久久亚洲AV成人无码国产
|
精品久久亚洲中文无码
|
久久国产亚洲精品
|
久久国产劲爆AV内射—百度
|
99精品国产免费久久久久久下载
|