日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++的头文件和实现文件分别写什么

發(fā)布時間:2023/11/30 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++的头文件和实现文件分别写什么 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在C++編程過程中,隨著項目的越來越大,代碼也會越來越多,并且難以管理和分析。于是,在C++中就要分出了頭(.h)文件和實現(xiàn)(.cpp)文件,并且也有了Package的概念。對于以C起步,C#作為“母語”的我剛開始跟著導(dǎo)師學(xué)習(xí)C++對這方面還是感到很模糊。雖然我可以以C的知識面對C++的語法規(guī)范,用C#的思想領(lǐng)悟C++中類的使用。但是C#中定義和實現(xiàn)是都在一個文件中(其實都是在類里面),而使用C的時候也只是編程的剛剛起步,所寫的程序也只要一個文件就夠了。因此對于C++的Package理解以及.h文件和.cpp文件的總是心存糾結(jié)。幸好導(dǎo)師有詳細的PPT讓我了解,一次對于Package的認(rèn)識就明白多了。簡單講,一個Package就是由同名的.h和.cpp文件組成。當(dāng)然可以少其中任意一個文件:只有.h文件的Package可以是接口或模板(template)的定義;只有.cpp文件的Package可以是一個程序的入口。當(dāng)然更具體詳細的講解,歡迎下載導(dǎo)師的教學(xué)PPT-Package來了解更多。不過我在這里想講的還是關(guān)于.h文件和.cpp文件知道Package只是相對比較宏觀的理解:我們在項目中以Package為編輯對象來擴展和修正我們的程序。編寫代碼時具體到應(yīng)該把什么放到.h文件,又該什么放在.cpp文件中,我又迷惑了。雖然Google給了我很多的鏈接,但是大部分的解釋都太籠統(tǒng)了:申明寫在.h文件,定義實現(xiàn)寫在.cpp文件。這個解釋沒有差錯,但是真正下手起來,又會發(fā)現(xiàn)不知道該把代碼往哪里打。于是我又把這個問題拋給了導(dǎo)師,他很耐心地給我詳詳細細地表述了如何在C++中進行代碼分離。很可惜,第一次我聽下了,但是沒有聽太懂,而且本來對C++就了解不深,所以也沒有深刻的印象。經(jīng)過幾個項目的試煉和體驗之后,我又拿出這個問題問導(dǎo)師,他又一次耐心地給我講解了一遍(我發(fā)誓他絕對不是忘記了我曾經(jīng)問過同樣的問題),這次我把它記錄了下來。為了不再忘記,我將它們總結(jié)在這里。概覽非模板類型(none-template) 模板類型(template)頭文件(.h)?全局變量申明(帶extern限定符)全局函數(shù)的申明帶inline限定符的全局函數(shù)的定義帶inline限定符的全局模板函數(shù)的申明和定義類的定義類函數(shù)成員和數(shù)據(jù)成員的申明(在類內(nèi)部)類定義內(nèi)的函數(shù)定義(相當(dāng)于inline)帶static const限定符的數(shù)據(jù)成員在類內(nèi)部的初始化帶inline限定符的類定義外的函數(shù)定義模板類的定義模板類成員的申明和定義(定義可以放在類內(nèi)或者類外,類外不需要寫inline)實現(xiàn)文件(.cpp)?全局變量的定義(及初始化)全局函數(shù)的定義(無)類函數(shù)成員的定義類帶static限定符的數(shù)據(jù)成員的初始化*申明:declaration*定義:definition頭文件頭文件的所有內(nèi)容,都必須包含在#ifndef {Filename}?#define {Filename}?
//{Content of head file}?
#endif這樣才能保證頭文件被多個其他文件引用(include)時,內(nèi)部的數(shù)據(jù)不會被多次定義而造成錯誤inline限定符在頭文件中,可以對函數(shù)用inline限定符來告知編譯器,這段函數(shù)非常的簡單,可以直接嵌入到調(diào)用定義之處。當(dāng)然inline的函數(shù)并不一定會被編譯器作為inline來實現(xiàn),如果函數(shù)過于復(fù)雜,編譯器也會拒絕inline。因此簡單說來,代碼最好短到只有3-5行的才作為inline。有循環(huán),分支,遞歸的函數(shù)都不要用做inline。對于在類定義內(nèi)定義實現(xiàn)的函數(shù),編譯器自動當(dāng)做有inline請求(也是不一定inline的)。因此在下邊,我把帶有inline限定符的函數(shù)成員和寫在類定義體內(nèi)的函數(shù)成員統(tǒng)稱為“要inline的函數(shù)成員”非模板類型全局類型就像前面籠統(tǒng)的話講的:申明寫在.h文件。對于函數(shù)來講,沒有實現(xiàn)體的函數(shù),就相當(dāng)于是申明;而對于數(shù)據(jù)類型(包括基本類型和自定義類型)來說,其申明就需要用extern來修飾。然后在.cpp文件里定義、實現(xiàn)或初始化這些全局函數(shù)和全局變量。不過導(dǎo)師一直反復(fù)強調(diào):不許使用全局函數(shù)和全局變量。用了之后造成的后果,目前就是交上去的作業(yè)項目會扣分。當(dāng)然不能用自有不能用的理由以及解決方案,不過不在目前的討論范圍內(nèi)。自定義類型對于自定義類型,包括類(class)和結(jié)構(gòu)體(struct),它們的定義都是放在.h文件中。其成員的申明和定義就比較復(fù)雜了,不過看上邊的表格,還是比較清晰的。函數(shù)成員函數(shù)成員無論是否帶有static限定符,其申明都放在.h文件的類定義內(nèi)部。對于要inline的函數(shù)成員其定義放在.h文件;其他函數(shù)的實現(xiàn)都放在.cpp文件中。數(shù)據(jù)成員數(shù)據(jù)成員的申明與定義都是放在.h文件的類定義內(nèi)部。對于數(shù)據(jù)類型,關(guān)鍵問題是其初始化要放在什么地方進行。對于只含有static限定符的數(shù)據(jù)成員,它的初始化要放在.cpp文件中。因為它是所有類對象共有的,因此必須對它做合適的初始化。對于只含有const限定符的數(shù)據(jù)成員,它的初始化只能在構(gòu)造函數(shù)的初始化列表中完成。因為它是一經(jīng)初始化就不能重新賦值,因此它也必須進行合適的初始化。對于既含有static限定符,又含有const限定符的數(shù)據(jù)成員,它的初始化和定義同時進行。它也是必須進行合適的初始化對于既沒有static限定符,又沒有const限定符的數(shù)據(jù)成員,它的值只針對本對象可以隨意修改,因此我們并不在意它的初始化什么時候進行。模板類型C++中,模板是一把開發(fā)利器,它與C#,Java的泛型很相似,卻又不盡相同。以前,我一直只覺得像泛型,模板這種東西我可能一輩子也不可能需要使用到。但是在導(dǎo)師的強制逼迫使用下,我才真正體會到模板的強大,也真正知道要如何去使用模板,更進一步是如何去設(shè)計模板。不過這不是三言兩語可以講完的,就不多說了。對于模板,最重要的一點,就是在定義它的時候,編譯器并不會對它進行編譯,因為它沒有一個實體可用。只有模板被具體化(specialization)之后(用在特定的類型上),編譯器才會根據(jù)具體的類型對模板進行編譯。所以才定義模板的時候,會發(fā)現(xiàn)編譯器基本不會報錯(我當(dāng)時還很開心的:我寫代碼盡然會沒有錯誤,一氣呵成),也做不出智能提示。但是當(dāng)它被具體用在一個類上之后,錯誤就會大片大片的出現(xiàn),卻往往無法準(zhǔn)確定位。因此設(shè)計模板就有設(shè)計模板的一套思路和方式,但是這跟本文的主題也有偏。因為模板的這種特殊性,它并沒有自己的準(zhǔn)確定義,因此我們不能把它放在.cpp文件中,而要把他們?nèi)糠旁?h文件中進行書寫。這也是為了在模板具體化的時候,能夠讓編譯器可以找到模板的所有定義在哪里,以便真正的定義方法。至于模板類函數(shù)成員的定義放在哪里,導(dǎo)師的意見是放在類定義之外,因為這樣當(dāng)你看類的時候,一目了然地知道有那些方法和數(shù)據(jù);我在用Visual Studio的時候查看到其標(biāo)準(zhǔn)庫的實現(xiàn),都是放在類內(nèi)部的??赡苁俏伊?xí)慣了C#的風(fēng)格,我比較喜歡把它們都寫在類內(nèi)部,也因為在開發(fā)過程中,所使用的編輯器都有一個強大的功能:代碼折疊。當(dāng)然還有其他原因就是寫在類外部,對于每一個函數(shù)成員的實現(xiàn)都需要把模板類型作為限定符寫一遍,把類名限定符也要寫一遍。

總結(jié)

以上是生活随笔為你收集整理的C++的头文件和实现文件分别写什么的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。