2012-07-17 28 views
8

可能重複:
In C++ why have header files and cpp files?困惑的頭文件在C實際目的++

我不完全得到C++頭文件,有兩個相互矛盾的原因:

  1. 我認爲頭文件的目的通常是分離接口和實現。換句話說,客戶端使用頭文件來學習如何使用該類,但不必擔心該類如何在內部實際實現此功能。

  2. 那麼,爲什麼它的頭文件中指定的C++類的私有變量?

在我看來,在頭文件中有私有變量違反了接口和實現的分離。直覺上來說,我認爲將私有變量放在源文件中會更有意義,因爲這是不會暴露給外部世界的文件。

也許我只是誤解了頭文件的目的,1.以上是完全錯誤的?以什麼方式?

+0

你從哪裏得到1.從? – Robottinosino 2012-07-17 17:17:38

+0

除了'friend'函數,我敢打賭,這只是編譯器確定類的大小的技術限制。 – Mysticial 2012-07-17 17:17:50

+0

@DaveSwersky那個笨蛋沒有回答OP的第二個問題,「那麼爲什麼它的頭文件中指定的C++類的私有變量?」 – Mysticial 2012-07-17 17:18:40

回答

9

C++區分聲明和函數和類的定義。通常,C++頭文件包含一個類的聲明。由於不允許部分聲明,所以頭文件需要包含完整的類聲明,包括所有私有成員(變量和成員函數)。

如果您想隱藏公衆的完整實施,您可以使用pimpl idiom來實現此目的。

6

C++頭文件的主要功能目的是在C++語言中沒有模塊導入或其他語言中存在的任何類似的東西。編譯器從其他文件中瞭解類型,函數等的唯一方法是使用#include將代碼粘貼到當前源文件中。

理論上你可以把所有的源代碼放到頭文件中,只需要一個包含所有頭文件的源文件。這通常不會完成的原因是雙重的。首先,編譯需要更長的時間(對某些項目有重大關注),任何對任何文件的更改都會導致項目完全重新編譯。其次,將實現放入源文件實際上有助於將接口與實現分離,即使在頭文件中仍然指定了部分實現。

請注意,標題中的內聯方法還會向您的課程的公共/客戶端展示細化的實現細節。

如果你真的想將接口從實現中完全分離出來(具有明確的優點),C++的方法是利用pimpl的習慣用法。使用該成語,所有私人數據都隱藏在源文件中,只向公衆提供抽象接口。此外,使用非虛擬接口(NVI)模式可以進一步幫助客戶端與接口更改隔離。

0

在C/C++中,頭文件的一個目的是允許多個翻譯單元使用具有相同定義的類型,而不用在多個文件中重複定義。類的定義的一部分是它的私人成員。

3

頭文件的目的是爲編譯器提供它在編譯單元(.cpp源文件)之間共享定義所需的信息。這是一個機械的東西,而不是哲學的東西。

例如,需要聲明私有成員變量,因爲它們定義了對象的大小,編譯器在分配對象時需要知道大小。

+0

這不是在編譯單元之間「共享聲明」的正確術語嗎?它經常弄糊塗,聲明和定義的手段是什麼...... – 2012-07-17 17:55:56

+0

@ g-makulik,我在英文意義上使用「定義」,而不是正式的C++用法。當然,可以在頭文件中包含定義,例如模板幾乎是強制性的。 – 2012-07-17 18:06:19

+0

爲什麼只有私有成員變量? – zgulser 2016-11-27 18:17:45