"
目
錄
第1章 重用性介紹 1
1.1 什麼是重用性 1
1.1.1 提取代碼來作為重用 2
1.1.2 可重用代碼的基本特性 2
1.2 重用的神話 3
1.3 重用的障礙 4
1.3.1 非技術障礙 4
1.3.2 技術障礙 5
1.4 希望是否尚存 6
1.5 這本書能給我們帶來什麼 7
l.6 練習 8
1.7 參考文獻和相關資料 9
第2章 類的設計 11
2.1 抽象性 11
2.2 正規函數 12
2.3 Nice類 14
2.4 存在最小標準接口嗎 15
2.4.1 缺省構造函數 16
2.4.2 賦值運算符 17
2.4.3 拷貝構造函數 18
2.4.4 相等運算符 18
2.4.5 析構函數 18
2.5 淺拷貝和深拷貝 19
2.6 接口一緻性 22
2.7 轉型 25
2.7.1 多重所有權(Multiple Ownership) 26
2.7.2 敏感轉型 26
2.7.3 不敏感轉型 28
2.7.4 轉型數目(Fanout) 28
2.8 const關鍵字的使用 29
2.8.1 抽象const對比位元const 29
2.8.2 最大限度地使用const 31
2.8.3 對const不安全的解釋 32
2.9 總結 33
2.10 練習 34
2.11 參考文獻和相關資料 37
第3章 擴展性 39
3.1 擴展性的權衡 39
3.2 擴展性和繼承 40
3.2.1 隻繼承基類的接口 41
3.2.2 隻繼承基類的實現 42
3.2.3 同時繼承基類的接口和實現 43
3.3 繼承語義(Semantie) 43
3.4 繼承的障礙 45
3.4.1 非虛成員函數 45
3.4.2 過度保護 47
3.4.3 模塊化不足 48
3.4.4 friend關鍵字的使用 51
3.4.5 成員變量過多 52
3.4.6 非虛(Nonvirtual)派生 52
3.4.7 妨礙繼承的成員函數 53
3.5 派生賦值問題 55
3.6 允許入侵(用戶修改源代碼)繼承 57
3.7 總結 58
3.8 練習 58
3.9 參考文獻和相關資料 60
第4章 效率 61
4.1 效率和重用性 61
4.2 程序創建時間 62
4.2.1 編譯時間 62
4.2.2 實例化時間 64
4.3 代碼大小 69
4.3.1 源文件分割 69
4.3.2 外聯的(outlined)inline 71
4.3.3 模闆特化大小 71
4.4 運行時間 72
4.4.1 內聯(inlning) 72
4.4.2 虛函數 74
4.4.3 返迴引用 76
4.5 空閑存儲空間(free-store)和堆棧空間(stack space) 78
4.5.1 使用高效的算法 79
4.5.2 盡可能快地釋放空閑資源 80
4.5.3 靜態對象 81
4.5.4 龐大的對象 82
4.6 效率的權衡 83
4.6.1 實現更加睏難 84
4.6.2 使用更加睏難 86
4.7 總結 86
4.8 練習 87
4.9 參考文獻和相關資料 89
第5章 錯誤 91
5.1 可重用代碼中的錯誤 91
5.2 錯誤檢測 92
5.2.1 函數前提條件 93
5.2.2 錶示不變性 93
5.3 處理錯誤 95
5.3.1 程序庫變量 95
5.3.2 解決問題 95
5.3.3 程序退齣或者程序終止(Exit or Abort) 96
5.3.4 拋齣異常 96
5.3.5 返迴錯誤值 97
5.3.6 創建Nil值 98
5.3.7 把無效的數據解釋為有效的數據 99
5.3.8 允許不確定的行為 99
5.4 資源限製(Resource-Limit)錯誤 100
5.4.1 堆棧溢齣 100
5.4.2 用完空閑存儲空間 101
5.4.3 文件係統限製 102
5.5 異常安全性 103
5.5.1 不一緻的狀態 104
5.5.2 資源泄漏 105
5.6 總結 106
5.7 練習 107
5.8 參考文獻和相關資料 110
第6章 衝突 111
6.1 全局名稱 111
6.1.1 翻譯單元 112
6.1.2 類的定義 112
6.1.3 函數和數據的定義 114
6.1.4 程序庫的蘊涵意義 114
6.1.5 命名約定 115
6.1.6 namespace(名字空間)結構 117
6.2 宏名稱 118
6.2.1 宏名稱衝突 118
6.2.2 去掉宏 119
6.2.3 宏的命名約定 121
6.3 環境名稱 121
6.4 Unclean程序庫 122
6.5 Good-Citizen程序庫 123
6.6 總結 123
6.7 練習 124
6.8 參考文獻和相關資料 125
第7章 兼容性 127
7.1 嚮後和嚮前兼容性 127
7.2 兼容性的形式 128
7.3 理論源代碼兼容性 129
7.4 實際源代碼兼容性 130
7.5 鏈接兼容牲 131
7.6 運行兼容牲 133
7.7 進程兼容性 134
7.8 文檔化不兼容性 135
7.9 非文檔化特性 135
7.10 總結 136
7.11 練習 137
7.12 參考文獻和相關資料 142
第8章 繼承體係 143
8.1 根數目、深度和扇齣數 143
8.2 體係類型 146
8.2.1 直接體係 146
8.2.2 接口體係 147
8.2.3 對象工廠(Object Factory) 149
8.2.4 句柄體係 151
8.3 模闆還是繼承 154
8.3.1 指針操縱 155
8.3.2 派生要求 156
8.3.3 實現不需要的函數 157
8.4 總結 158
8.5 練習 159
8.6 參考文獻和相關資料 161
第9章 移植性 163
9.1 有編寫可移植代碼的必要嗎 163
9.1.1 可移植性的優缺點 163
9.1.2 目標代碼和創建過程的可移植性 164
9.2 不斷發展的語言定義 165
9.2.1 衝突 165
9.2.2 實現的完整性 166
9.3 不確定的行為 166
9.3.1 排列方式和補全(padding) 167
9.3.2 地址操縱 168
9.4 閤法但不可移植的代碼 169
9.4.1 實現性定義的行為 169
9.4.2 未經指定的行為 170
9.5 實現依賴性 171
9.6 可移植的數據文件 172
9.7 模闆實例化 173
9.7.1 自動的實例化器 173
9.7.2 人工實例化 177
9.8 運行期程序庫 179
9.9 其他移植性問題 180
9.10 總結 181
9.11 練習 182
9.12 參考文獻和相關資料 184
第10章 使用其他程序庫 185
10.1 為何要重用其他程序庫 185
10.2 使用其他程序庫的缺點 186
10.2.1 獲得可重用程序庫 186
10.2.2 效率 187
10.2.3 衝突 187
10.2.4 版本同步 188
10.3 自含式(Self-Contained)程序庫 190
10.3.1 實現睏難 190
10.3.2 使用睏難 191
10.3.3 效率 192
10.3.4 隔離 192
10.4 總結 193
10.5 練習 193
第11章 文檔編製 195
11.1 文檔編製和重用性 195
11.2 設計文檔 196
11.3 使用指南 196
11.3.1 對讀者的背景知識瞭如指掌 197
11.3.2 用抽象的觀點來編寫 197
11.3.3 先解釋普通用法 198
11.3.4 一次隻解釋一個事物 198
11.3.5 解釋用法,不解釋設計思路 199
11.3.6 簡單清楚地編寫 199
11.3.7 準確地使用語言 199
11.3.8 使用普遍接受的術語 200
11.3.9 深刻理解重載的術語 200
11.3.10 給齣閤法的、無錯誤的代碼 201
11.3.11 保持簡短的代碼段 201
11.3.12 避免使用太大的函數 201
11.3.13 提供在綫實例 202
11.4 參考手冊 203
11.4.1 抽象化 203
11.4.2 語法接口 203
11.4.3 函數語義 205
11.4.4 模闆參數約束 206
11.5 總結 207
11.6 練習 207
11.7 參考文獻和相關資料 208
第12章 其他話題 209
12.1 靜態初始化問題 209
12.1.1 構造和析構的時刻 210
12.1.2 程序庫的蘊含意義 211
12.1.3 初始化函數 213
12.1.4 初始化檢查 214
12.1.5 初始化對象 216
12.1.6 雙構造 217
12.2 局部化開銷原則 218
12.2.1 局部化開銷和C++ 219
12.2.2 局部化開銷和程序庫 219
12.3 內生類和外生類 220
12.4 迭代器 222
12.5 類耦閤 224
12.6 推遲決定 226
12.7 總結 229
12.8 練習 229
12.9 參考文獻和相關資料 232
中英文術語對照錶 233
參考文獻 261
"
· · · · · · (
收起)