最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++的頭文件和實(shí)現(xiàn)文件詳解

 更新時(shí)間:2015年01月19日 15:37:39   投稿:hebedich  
這篇文章主要介紹了C++的頭文件和實(shí)現(xiàn)文件詳解的相關(guān)資料,需要的朋友可以參考下

在C++編程過(guò)程中,隨著項(xiàng)目的越來(lái)越大,代碼也會(huì)越來(lái)越多,并且難以管理和分析。于是,在C++中就要分出了頭(.h)文件和實(shí)現(xiàn)(.cpp)文件,并且也有了Package的概念。

對(duì)于以C起步,C#作為“母語(yǔ)”的我剛開(kāi)始跟著導(dǎo)師學(xué)習(xí)C++對(duì)這方面還是感到很模糊。雖然我可以以C的知識(shí)面對(duì)C++的語(yǔ)法規(guī)范,用C#的思想領(lǐng)悟C++中類的使用。但是C#中定義和實(shí)現(xiàn)是都在一個(gè)文件中(其實(shí)都是在類里面),而使用C的時(shí)候也只是編程的剛剛起步,所寫(xiě)的程序也只要一個(gè)文件就夠了。因此對(duì)于C++的Package理解以及.h文件和.cpp文件的總是心存糾結(jié)。

幸好導(dǎo)師有詳細(xì)的PPT讓我了解,一次對(duì)于Package的認(rèn)識(shí)就明白多了。簡(jiǎn)單講,一個(gè)Package就是由同名的.h和.cpp文件組成。當(dāng)然可以少其中任意一個(gè)文件:只有.h文件的Package可以是接口或模板(template)的定義;只有.cpp文件的Package可以是一個(gè)程序的入口。

當(dāng)然更具體詳細(xì)的講解,歡迎下載導(dǎo)師的教學(xué)PPT-Package來(lái)了解更多。

不過(guò)我在這里想講的還是關(guān)于.h文件和.cpp文件

知道Package只是相對(duì)比較宏觀的理解:我們?cè)陧?xiàng)目中以Package為編輯對(duì)象來(lái)擴(kuò)展和修正我們的程序。編寫(xiě)代碼時(shí)具體到應(yīng)該把什么放到.h文件,又該什么放在.cpp文件中,我又迷惑了。

雖然Google給了我很多的鏈接,但是大部分的解釋都太籠統(tǒng)了:申明寫(xiě)在.h文件,定義實(shí)現(xiàn)寫(xiě)在.cpp文件。這個(gè)解釋沒(méi)有差錯(cuò),但是真正下手起來(lái),又會(huì)發(fā)現(xiàn)不知道該把代碼往哪里打。

于是我又把這個(gè)問(wèn)題拋給了導(dǎo)師,他很耐心地給我詳詳細(xì)細(xì)地表述了如何在C++中進(jìn)行代碼分離。很可惜,第一次我聽(tīng)下了,但是沒(méi)有聽(tīng)太懂,而且本來(lái)對(duì)C++就了解不深,所以也沒(méi)有深刻的印象。

經(jīng)過(guò)幾個(gè)項(xiàng)目的試煉和體驗(yàn)之后,我又拿出這個(gè)問(wèn)題問(wèn)導(dǎo)師,他又一次耐心地給我講解了一遍(我發(fā)誓他絕對(duì)不是忘記了我曾經(jīng)問(wèn)過(guò)同樣的問(wèn)題),這次我把它記錄了下來(lái)。

為了不再忘記,我將它們總結(jié)在這里。

概覽

  非模板類型(none-template) 模板類型(template)
頭文件(.h)
  • 全局變量申明(帶extern限定符)
  • 全局函數(shù)的申明
  • inline限定符的全局函數(shù)的定義
  • 類的定義
  • 類函數(shù)成員和數(shù)據(jù)成員的申明(在類內(nèi)部)
  • 類定義內(nèi)的函數(shù)定義(相當(dāng)于inline)
  • static const限定符的數(shù)據(jù)成員在類內(nèi)部的初始化
  • inline限定符的類定義外的函數(shù)定義
  • 模板類的定義
  • 模板類成員的申明和定義(定義可以放在類內(nèi)或者類外,類外不需要寫(xiě)inline)
實(shí)現(xiàn)文件(.cpp)
  • 全局變量的定義(及初始化)
  • 全局函數(shù)的定義
(無(wú))

*申明:declaration
*定義:definition

頭文件

頭文件的所有內(nèi)容,都必須包含在

#ifndef {Filename}
#define {Filename}

//{Content of head file}

#endif
這樣才能保證頭文件被多個(gè)其他文件引用(include)時(shí),內(nèi)部的數(shù)據(jù)不會(huì)被多次定義而造成錯(cuò)誤

inline限定符

在頭文件中,可以對(duì)函數(shù)用inline限定符來(lái)告知編譯器,這段函數(shù)非常的簡(jiǎn)單,可以直接嵌入到調(diào)用定義之處。

當(dāng)然inline的函數(shù)并不一定會(huì)被編譯器作為inline來(lái)實(shí)現(xiàn),如果函數(shù)過(guò)于復(fù)雜,編譯器也會(huì)拒絕inline。

因此簡(jiǎn)單說(shuō)來(lái),代碼最好短到只有3-5行的才作為inline。有循環(huán),分支,遞歸的函數(shù)都不要用做inline。

對(duì)于在類定義內(nèi)定義實(shí)現(xiàn)的函數(shù),編譯器自動(dòng)當(dāng)做有inline請(qǐng)求(也是不一定inline的)。因此在下邊,我把帶有inline限定符的函數(shù)成員和寫(xiě)在類定義體內(nèi)的函數(shù)成員統(tǒng)稱為“要inline的函數(shù)成員”

非模板類型

全局類型

就像前面籠統(tǒng)的話講的:申明寫(xiě)在.h文件。

對(duì)于函數(shù)來(lái)講,沒(méi)有實(shí)現(xiàn)體的函數(shù),就相當(dāng)于是申明;而對(duì)于數(shù)據(jù)類型(包括基本類型和自定義類型)來(lái)說(shuō),其申明就需要用extern來(lái)修飾。

然后在.cpp文件里定義、實(shí)現(xiàn)或初始化這些全局函數(shù)和全局變量。

不過(guò)導(dǎo)師一直反復(fù)強(qiáng)調(diào):不許使用全局函數(shù)和全局變量。用了之后造成的后果,目前就是交上去的作業(yè)項(xiàng)目會(huì)扣分。當(dāng)然不能用自有不能用的理由以及解決方案,不過(guò)不在目前的討論范圍內(nèi)。

自定義類型

對(duì)于自定義類型,包括類(class)和結(jié)構(gòu)體(struct),它們的定義都是放在.h文件中。其成員的申明和定義就比較復(fù)雜了,不過(guò)看上邊的表格,還是比較清晰的。

函數(shù)成員

函數(shù)成員無(wú)論是否帶有static限定符,其申明都放在.h文件的類定義內(nèi)部。

對(duì)于要inline的函數(shù)成員其定義放在.h文件;其他函數(shù)的實(shí)現(xiàn)都放在.cpp文件中。

數(shù)據(jù)成員

數(shù)據(jù)成員的申明與定義都是放在.h文件的類定義內(nèi)部。對(duì)于數(shù)據(jù)類型,關(guān)鍵問(wèn)題是其初始化要放在什么地方進(jìn)行。

對(duì)于只含有static限定符的數(shù)據(jù)成員,它的初始化要放在.cpp文件中。因?yàn)樗撬蓄悓?duì)象共有的,因此必須對(duì)它做合適的初始化。

對(duì)于只含有const限定符的數(shù)據(jù)成員,它的初始化只能在構(gòu)造函數(shù)的初始化列表中完成。因?yàn)樗且唤?jīng)初始化就不能重新賦值,因此它也必須進(jìn)行合適的初始化。

對(duì)于既含有static限定符,又含有const限定符的數(shù)據(jù)成員,它的初始化和定義同時(shí)進(jìn)行。它也是必須進(jìn)行合適的初始化

對(duì)于既沒(méi)有static限定符,又沒(méi)有const限定符的數(shù)據(jù)成員,它的值只針對(duì)本對(duì)象可以隨意修改,因此我們并不在意它的初始化什么時(shí)候進(jìn)行。

模板類型

C++中,模板是一把開(kāi)發(fā)利器,它與C#,Java的泛型很相似,卻又不盡相同。以前,我一直只覺(jué)得像泛型,模板這種東西我可能一輩子也不可能需要使用到。但是在導(dǎo)師的強(qiáng)制逼迫使用下,我才真正體會(huì)到模板的強(qiáng)大,也真正知道要如何去使用模板,更進(jìn)一步是如何去設(shè)計(jì)模板。不過(guò)這不是三言兩語(yǔ)可以講完的,就不多說(shuō)了。

對(duì)于模板,最重要的一點(diǎn),就是在定義它的時(shí)候,編譯器并不會(huì)對(duì)它進(jìn)行編譯,因?yàn)樗鼪](méi)有一個(gè)實(shí)體可用。

只有模板被具體化(specialization)之后(用在特定的類型上),編譯器才會(huì)根據(jù)具體的類型對(duì)模板進(jìn)行編譯。

所以才定義模板的時(shí)候,會(huì)發(fā)現(xiàn)編譯器基本不會(huì)報(bào)錯(cuò)(我當(dāng)時(shí)還很開(kāi)心的:我寫(xiě)代碼盡然會(huì)沒(méi)有錯(cuò)誤,一氣呵成),也做不出智能提示。但是當(dāng)它被具體用在一個(gè)類上之后,錯(cuò)誤就會(huì)大片大片的出現(xiàn),卻往往無(wú)法準(zhǔn)確定位。

因此設(shè)計(jì)模板就有設(shè)計(jì)模板的一套思路和方式,但是這跟本文的主題也有偏。

因?yàn)槟0宓倪@種特殊性,它并沒(méi)有自己的準(zhǔn)確定義,因此我們不能把它放在.cpp文件中,而要把他們?nèi)糠旁?h文件中進(jìn)行書(shū)寫(xiě)。這也是為了在模板具體化的時(shí)候,能夠讓編譯器可以找到模板的所有定義在哪里,以便真正的定義方法。

至于模板類函數(shù)成員的定義放在哪里,導(dǎo)師的意見(jiàn)是放在類定義之外,因?yàn)檫@樣當(dāng)你看類的時(shí)候,一目了然地知道有那些方法和數(shù)據(jù);我在用Visual Studio的時(shí)候查看到其標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn),都是放在類內(nèi)部的。

可能是我習(xí)慣了C#的風(fēng)格,我比較喜歡把它們都寫(xiě)在類內(nèi)部,也因?yàn)樵陂_(kāi)發(fā)過(guò)程中,所使用的編輯器都有一個(gè)強(qiáng)大的功能:代碼折疊。

當(dāng)然還有其他原因就是寫(xiě)在類外部,對(duì)于每一個(gè)函數(shù)成員的實(shí)現(xiàn)都需要把模板類型作為限定符寫(xiě)一遍,把類名限定符也要寫(xiě)一遍。

相關(guān)文章

  • C語(yǔ)言安全編碼數(shù)組記法的一致性

    C語(yǔ)言安全編碼數(shù)組記法的一致性

    這篇文章主要介紹了C語(yǔ)言安全編碼數(shù)組記法的一致性,需要的朋友可以參考下
    2014-07-07
  • 基于C++制作一個(gè)簡(jiǎn)單的跑酷游戲

    基于C++制作一個(gè)簡(jiǎn)單的跑酷游戲

    這篇文章主要為大家詳細(xì)介紹了如何利用C++制作一個(gè)簡(jiǎn)單的跑酷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-06-06
  • VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法

    VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法

    這篇文章主要介紹了VC實(shí)現(xiàn)讓關(guān)閉按鈕成灰色不可用的方法,比較實(shí)用的一個(gè)特殊功能,需要的朋友可以參考下
    2014-08-08
  • 利用C語(yǔ)言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換

    利用C語(yǔ)言實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了2個(gè)函數(shù),分別是sprintf和sscanf,可以用來(lái)實(shí)現(xiàn)將格式化數(shù)據(jù)和字符串相互轉(zhuǎn)換,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • C++紅黑樹(shù)的底層實(shí)現(xiàn)機(jī)制詳解

    C++紅黑樹(shù)的底層實(shí)現(xiàn)機(jī)制詳解

    紅黑樹(shù)與AVL樹(shù)一樣,也是一種自平衡的二叉搜索樹(shù),它在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色,可以是Red或Black,通過(guò)對(duì)任何一條從根到葉子的路徑上各個(gè)結(jié)點(diǎn)著色方式的限制,本文介紹了C++紅黑樹(shù)的底層實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下
    2024-08-08
  • C語(yǔ)言使用鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    C語(yǔ)言使用鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言使用鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Matlab實(shí)現(xiàn)貪吃蛇小游戲的示例代碼

    Matlab實(shí)現(xiàn)貪吃蛇小游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì)

    C語(yǔ)言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)英文文本詞頻統(tǒng)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 利用C語(yǔ)言實(shí)現(xiàn)n字棋游戲

    利用C語(yǔ)言實(shí)現(xiàn)n字棋游戲

    本文將利用C語(yǔ)言編寫(xiě)一個(gè)n字棋游戲,和井字棋一樣,不過(guò)這個(gè)游戲你可以自定義棋盤的大小。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-05-05
  • Clion下vcpkg的使用詳解

    Clion下vcpkg的使用詳解

    這篇文章主要介紹了Clion下vcpkg的使用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

丹江口市| 蒙自县| 抚宁县| 临西县| 绵竹市| 锦屏县| 正定县| 宣恩县| 新田县| 林芝县| 思南县| 洪江市| 图们市| 万安县| 宁阳县| 上高县| 阿克苏市| 同仁县| 青铜峡市| 保山市| 建始县| 康保县| 永昌县| 安丘市| 乡宁县| 饶平县| 高安市| 丹棱县| 舟曲县| 宁陵县| 西乌珠穆沁旗| 镇坪县| 监利县| 思茅市| 虞城县| 修文县| 巨鹿县| 宿迁市| 沙雅县| 贺兰县| 武夷山市|