2013-03-01 34 views
1

必須誠實地說,我在頭文件中的函數(有時是數據成員)聲明中的關鍵字之間產生混淆,實施文件。關鍵字包含在頭文件vs源/實現文件中的C++「規則」

遵循什麼規則?例如

(每評論更新)

  • 頭文件不包含除如果函數聲明爲「內聯」
  • 數據成員不包含默認值,除非執行如果類型是靜態的,const,int/enum(除非C++ 11)
  • 公共/私有/受保護通常出現在頭文件中
  • 「靜態」通常出現在頭文件中,而不是實現文件。

我可以使用其他規則嗎?常量?

繼承問題呢?我認爲「虛擬」只能在頭文件中進行?如果我從A類繼承了虛擬函數到B類,B類的頭文件是否必須聲明它覆蓋的虛函數?如果我在類A中重寫純虛函數,那麼我必須將純虛函數定義包含在派生類的頭文件中?

+0

過分寬泛的這一個,你的第3和第4的規則是錯誤的。將其細分爲具體細節。 – 2013-03-01 13:12:05

+0

如果頭文件是一個模板函數,它還應該包含一個函數實現。 – 2013-03-01 13:12:29

+2

沒有*有*標記。 – juanchopanza 2013-03-01 13:12:53

回答

2

看起來你試圖制定一些正式的規則而不理解它是如何工作的。但是,當預處理器看到#include指令時,它只是用該文件的內容替換它(它就像命令複製整個文件並將其粘貼到此處),這非常簡單。因此,不要制定正式的規則,只要問自己一些問題:這個聲明是否應該出現在每個使用這個頭文件的.cpp文件中?他們還會編譯嗎?我是否真的需要它,或者它只能在一個.cpp文件中提供實現?如果答案是肯定的,那麼這個陳述應該去頭,如果沒有,那麼把它放到.cpp實現文件中。

1

C語言和C++語言中的#include語句要比您給出的語句簡單得多:它採用include'd文件的內容,並將其直接轉儲到包含文件中。這可以是任何事情(我在我的工作中看到很多新手開發人員,如果它是磁盤上的文件,在某些時候有人試圖使用include):甚至是.cpp文件。你可以,如果你想證明自己,複製&粘貼包含文件的內容代替include - 一切都應該像以前一樣工作。

爲了完整:一旦預處理器將所有包含的文件轉儲到所需的位置,編譯器就會分別編譯每個文件。這通常會給你留下一堆沒有實現的聲明和一大堆沒有聲明的實現:鏈接器將這些引用分類。所以,如果你遇到鏈接錯誤,那就意味着你的某個地方出現了錯誤的匹配:或許你聲明瞭兩次,或者從未實現過。

我們實際上擁有的是關於我們在頭文件中需要什麼以及我們在源文件中需要什麼的一系列最佳實踐。通常,我們喜歡在頭文件中聲明。 換句話說,頭文件應該告訴我(程序員)我期望在實現中找到什麼東西。通常,這些是聲明:因此,爲什麼通常只在頭中看到訪問修飾符(公共,私有,受保護)。一些程序員會做「奇怪」的東西,比如在頭文件中編寫構造函數:這是有效的,但通常不會被期望 - 您希望頭文件告訴我可以在代碼中使用哪些東西,而不是代碼如何工作。