1、內部鏈接,外部鏈接
內部鏈接:只在本編譯單元(.obj)能訪問和使用的,反之,其它obj文件能訪問到該變量或則該接口,那麼就是外部鏈接了
比如
a.cpp中
void Test(){}
在b.cpp中看似訪問不到Test,我們只需要在b.h中定義一個
void Test();
然後在b.cpp中就能夠訪問到了,鏈接的時候編譯器會鏈接到a.cpp的Test函數的
能夠申明爲內部鏈接是最好的了
內部鏈接有哪些呢:全局靜態變量,靜態函數(上面的Test如果加上static在b.cpp中就訪問不到了),枚舉,union,內聯函數
外部鏈接:類內部靜態變量,類成員函數,全局變量,全局函數
extern 一個變量就表示從其它地方引入一個外部鏈接的符號了
2、邏輯設計
弱包含:B的接口中使用A,但是A不屬於B的私有成員變量
強包含:B成員變量中包含了A。強包含又有hold和has。A的類型是指針,就是holds,是類型就是has了
3、設計的一些基本規則
3.1 類最小化,不要爲了滿足所有用戶的需求去設計類。要滿足大部分用戶的重要接口
3.2 保持數據成員私有,這個沒什麼好說的了
防止全局名字衝突(3.3~3.4)
3.3 避免在文件作用域內包含帶有外部鏈接的數據。包括全局變量,全局函數。
全局變量通過封裝在struct中,提供接口,單件去改變
全局函數通過將各個函數放在class中,static的方式去訪問
3.4 避免在h文件的文件作用域內使用枚舉,typedef和常量數據
通過將枚舉定義在struct或class內解決,常量數據通過定義在該struct的static變量解決
如果能定義在cpp中是更好了
3.5 頭文件中的宏定義衛哨。另外冗餘的包含衛哨可以減少頭文件打開次數
3.5 命名規範,需要區分如下類型即可
使用一個一致的方法突出類數據成員
使用一個一致的方法區分類型名字(class,struct)
使用一個一致的方法區分枚舉,常量和預處理器等不變的值