C++頭文件的若干說明和const對象定義

轉載至:http://blog.csdn.net/yipiantiandi/article/details/5822564

在使用C++進行程序開發的時候,有個常識我們很熟悉,就是把類的定義寫在.h文件中,把類的具體實現寫在.cpp文件中。這毫無疑問是對的。但我們很少去思考爲什麼要這樣做,本文結合自己的學習體會,對頭文件及const對象的定義進行一些說明。

 

1。爲什麼要使用頭文件

使用頭文件就是爲了在希望使用一些共同函數或數據的時候,只需包含這個文件就能實現,無需多次重複編寫相同的代碼,提高了效率。

 

2。什麼東西可以寫在頭文件中

在頭文件中,我們的編程經驗是,函數的聲明,類的定義等等應該寫在頭文件裏面。但具體哪些可以寫,哪些不可以,並不十分清楚。

在C++程序中,我們可以知道對於變量或函數的定義是唯一的,如果在同一個作用域內有重複的定義,就會產生編譯錯誤。而頭文件是要被多個文件包含的,如果在頭文件中存放變量或函數的定義,則會導致編譯提示重定義這樣的錯誤,而聲明則是可以多處編寫的,所以,通過程序的基本知識,頭文件中應該寫聲明,而不能寫定義。

 

3。例外的情況

但我們確實在實踐中有定義放在頭文件中,而且並不引發編譯錯誤,難道定義可以放在頭文件中嗎,C++允許部分重定義嗎?

C++中允許在頭文件中定義的有三中情況:

   (1)類定義

   (2)內聯函數定義(inline函數。在頭文件中有函數實現的,默認爲內聯函數)

   (3)const 對象定義

 

其實以上三種情況的原因可以理解爲是相同的。以const對象作爲例子,說明如下:

 

對於一般的對象 如 int a=9;;

我們知道它的作用域是整個程序的,在1.cpp和2.cpp中包含同一個定義了int a=9;的頭文件,因爲int a=9;作用域是整個程序,所以會產生錯誤。那爲什麼const int a=9;不會產生錯誤呢。原因就是const int a=9;的默認作用範圍是文件作用域的。即,儘管在1.cpp和2.cpp中包含同一個定義了const int a=9;的頭文件,但由於const int a=9;是文件作用域的,包含了頭文件的1.cpp和2.cpp儘管都包含了const int a=9;但他們是各自文件內的const對象,兩者互不相干,就像不同函數中定義了相同的變量名一樣。

 

所以,通過在頭文件中定義const對象,可以實現多個文件使用相同的常量值,這在實際的程序中很常見。

說到這裏,有一點疑問需要解決:如果想在別的文件中訪問本文件中的const對象該怎麼辦,如果都是單是在別的文件中使用extern const int a = 9;的話,不會起任何作用,因爲已經提示const int a = 9;是文件作用域的。所以應該在需要被其他文件使用的const對象定義成這樣:extern const int a = 9;而在別的需要使用這個const對象的地方使用:extern const int a;前者是定義,後者是聲明。這樣就可以使用了。

 

通過對const對象的說明,我們知道由於是文件作用域的原因,可以把const對象的定義寫在頭文件中。對於另外兩種情況,從實踐上來看,我覺得也可以認爲他們具有文件作用域。

比如在同一個文件中,編寫兩個完全相同的類的定義,編譯會提示重定義錯誤,但在兩個不同的文件中,編寫完全相同的類的定義,不會導致編譯錯誤,這說明類的作用域也是文件作用域,在包含了同一個頭文件的不同文件中,雖然都包含了同一個類的定義,但程序理解爲是兩個不同的類的定義(儘管結構完全相同),但這在實現上沒有問題。當然,關於inline函數也可以這樣理解,具體原因可能需要查看編譯器的相關資料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章