C 程式設計的一些原則

2021-04-21 01:26:39 字數 2748 閱讀 9509

1. 不能在容器中使用auto_ptr,要用boost的share_ptr。具體原因可以查auto_ptr的特性。

2. 別用vector。

3. 如果將派生類直接賦值給基類,派生類獨有的資訊將丟失。因此這種情況,最好用指標,將派生類的指標賦值給基類的指標變數。

4. 生成std::map的時候,鍵值可以是任何類,只要這個類定義了比較大小的操作。

5. 賦值拷貝和構造賦值(copy constructor and assignment operator )如果沒有定義,設定成private。

6. 如果派生類需要定義析構函式,請將基類的析構函式設成虛函式。

7. 避免在標頭檔案中定義 "using namespace"

8. 在c++中總是用#include ,不要用 #include 。其他標頭檔案類似。

9. 複雜的物件,不要通過按值傳遞的方式傳遞,盡量用const reference的方式傳遞。

10 不要把很大的資料放在stack中 , must be <64kb

11.  避免使用non-const static 變數,如果要使用,也要設法加保護措施。

12 不要在assert 語句中進行表示式的計算。

13 編譯鏈結時候的任何warnning資訊,都應該清除。

14. 不要對multimap用操作符,它不支援。可以用map>代替multimap。

15. 對stl的容器進行了erase或者insert以後,如果不能確定,要假定已經有的引用和指標還有迭代器失效。各個容器的效果不一樣。可以查各個容器的介紹。

17. 以後補充

附錄:如何定義乙個完整的類

定義乙個類時必須搞清楚的幾個問題:

需要建構函式嗎?

如果答案為 no,那麼很可能你需要定義的只是乙個結構,而不是乙個類,因為建構函式的用途是用一種明確定義的狀態來設定物件。

資料成員是私有的嗎?

一般來說,如果資料成員為公有,你很難控制這些成員何時被訪問。

需要乙個無引數的建構函式嗎?

如果乙個類已經有了建構函式,而你想宣告該類的物件時不必顯示地初始化它們,則必須顯示地寫乙個無引數的建構函式。(特別是當你需要生成這個類的物件陣列時!

每個建構函式是否都對所有資料成員進行了初始化了?

物件的狀態由物件的資料成員反映,因此每個建構函式都有負責為所有的資料成員設定經過明確定義的值。如果某個建構函式沒有做到這一點,就很可能導致錯誤。(當然,這種說法未必總是正確的。因為有時,某些資料成員,只有在該物件存在了一定的時間後才有意義。)

需要析構函式嗎?

並不是所有的類都需要析構函式的。一般來說,如果乙個類分配了資源,並且這些資源不會被成員函式自動釋放,那麼這個類就需要乙個析構函式。

需要乙個虛析構函式嗎?

任何不作為基類的類是不需要虛析構函式的,虛析構函式只有在繼承的情況下才有用。當可能發生 delete 乙個型別為基類的指標,可實際上該指標代表的是乙個子類的物件,這個基類定義時需要乙個虛析構函式。

需要乙個複製建構函式嗎

如果用類預設的複製建構函式複製該類的物件時,如果能完整複製該類的資料成員和基類物件,就不需要複製建構函式,否則就需要。特別是,如果你的類在建構函式內分配了資源,或者在成員函式中分配了資源,則很可能需要乙個顯示的複製建構函式來管理資源。有析構函式(除了空的析構函式外)的類通常是用析構函式來釋放資源,這通常也說明需要乙個複製建構函式。

需要乙個賦值操作符嗎?

如果你的類需要複製建構函式,多半也需要乙個賦值操作符。當然,如果你不想使用者設定類中的物件,可以將賦值操作符宣告為私有的。

賦值操作符能正確地將物件賦給物件本身嗎?

自我賦值是常犯的錯誤!賦值總是用新值取代目標物件的舊值。如果原物件和目標物件是同乙個,而我們又奉行「先釋放舊值,再複製新值」的原則,那麼就可能在還沒有實施複製之前就把原物件銷毀了!

需要定義關係操作符嗎?

如果你的類需要放入 stl 的容器中,很可能需要定義關係操作符。把乙個新物件加入容器中,某些容器,需要把新物件與容器裡已有的物件進行比較,比如進行相等比較,進行大小比較。因此,如果類邏輯上支援相等操作,那麼提供 operator== 和 operator!= 就會很有好處。類似,如果類的值有某種排序關係,你就可以提供 operator< 或者 operator> 等關係操作符。只要這些容器需要建立你的類的有序集合,你就必須提供關係操作符。

刪除陣列時記住用 delete 了嗎?

在刪除任何型別的陣列時使用 delete 是一種很好的習慣。

在複製建構函式和賦值建構函式的引數型別中加上 const 了嗎?

這是某些 c++ 著作中也會犯的錯誤!

如果函式有引用引數,只有在函式想改變函式的輸入引數時,才應該不用 const 宣告該引用引數!通常這個會被改變的輸入引數也肩負著輸出引數的角色。

記得適當地宣告成員函式為 const 了嗎?

如果確信乙個成員函式不用修改它的物件,就可以宣告它為 const。

乙個需要上述所有特性類定義的例子

// 宣告	

class a;

// 實現

a::a()

a::~a()

a::a(const a& s)

a& a::operator=(const a& s)

return *this;

}bool a::operator==(const a& s) const

bool a::operator!=(const a& s) const

bool a::operator<(const a& s) const

CSS 一些原則

優化你的css 所謂高效的css就是讓瀏覽器在查詢style匹配的元素的時候盡量進行少的查詢,下面列出一些我們常見的寫css犯一些低效錯誤 1 不要在id選擇器前使用標籤名 一般寫法 div divbox 更好寫法 divbox 解釋 因為id選擇器是唯一的,加上div反而增加不必要的css匹配。2...

c 程式設計的一些技巧

第一點,使用全域性物件的建構函式在程式啟動前呼叫函式 有一些應用程式需要在主程式啟動前呼叫其它函式。如 轉態過程函式 登記 功能函式都是必須在實際程式執行前被呼叫的。最簡單的辦法是通過乙個全域性物件 的建構函式來呼叫這些函式。因為全域性物件都是在主程式開始前被構造,這些函式 都將會在main 之前返...

C 程式設計的一些思想

看完c primer後,了解了c 的語法,但我想往思想,設計方面深究,所以我選擇了看c 程式設計思想。以下是第一章中我記下的筆記。oop 物件導向的程式設計 重用乙個類最簡單的方法就是直接使用這個類的物件,並且還可以講這個類的物件放到乙個新類的裡面。可以用任何數量和型別的其他物件組成新類,通過組合得...