亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++的頭文件和實現文件詳解

2020-01-26 15:10:41
字體:
來源:轉載
供稿:網友

在C++編程過程中,隨著項目的越來越大,代碼也會越來越多,并且難以管理和分析。于是,在C++中就要分出了頭(.h)文件和實現(.cpp)文件,并且也有了Package的概念。

對于以C起步,C#作為“母語”的我剛開始跟著導師學習C++對這方面還是感到很模糊。雖然我可以以C的知識面對C++的語法規范,用C#的思想領悟C++中類的使用。但是C#中定義和實現是都在一個文件中(其實都是在類里面),而使用C的時候也只是編程的剛剛起步,所寫的程序也只要一個文件就夠了。因此對于C++的Package理解以及.h文件和.cpp文件的總是心存糾結。

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

當然更具體詳細的講解,歡迎下載導師的教學PPT-Package來了解更多。

不過我在這里想講的還是關于.h文件和.cpp文件

知道Package只是相對比較宏觀的理解:我們在項目中以Package為編輯對象來擴展和修正我們的程序。編寫代碼時具體到應該把什么放到.h文件,又該什么放在.cpp文件中,我又迷惑了。

雖然Google給了我很多的鏈接,但是大部分的解釋都太籠統了:申明寫在.h文件,定義實現寫在.cpp文件。這個解釋沒有差錯,但是真正下手起來,又會發現不知道該把代碼往哪里打。

于是我又把這個問題拋給了導師,他很耐心地給我詳詳細細地表述了如何在C++中進行代碼分離。很可惜,第一次我聽下了,但是沒有聽太懂,而且本來對C++就了解不深,所以也沒有深刻的印象。

經過幾個項目的試煉和體驗之后,我又拿出這個問題問導師,他又一次耐心地給我講解了一遍(我發誓他絕對不是忘記了我曾經問過同樣的問題),這次我把它記錄了下來。

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

概覽

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

*申明:declaration
*定義:definition

頭文件

頭文件的所有內容,都必須包含在

#ifndef {Filename}
#define {Filename}

//{Content of head file}

#endif
這樣才能保證頭文件被多個其他文件引用(include)時,內部的數據不會被多次定義而造成錯誤

inline限定符

在頭文件中,可以對函數用inline限定符來告知編譯器,這段函數非常的簡單,可以直接嵌入到調用定義之處。

當然inline的函數并不一定會被編譯器作為inline來實現,如果函數過于復雜,編譯器也會拒絕inline。

因此簡單說來,代碼最好短到只有3-5行的才作為inline。有循環,分支,遞歸的函數都不要用做inline。

對于在類定義內定義實現的函數,編譯器自動當做有inline請求(也是不一定inline的)。因此在下邊,我把帶有inline限定符的函數成員和寫在類定義體內的函數成員統稱為“要inline的函數成員”

非模板類型

全局類型

就像前面籠統的話講的:申明寫在.h文件。

對于函數來講,沒有實現體的函數,就相當于是申明;而對于數據類型(包括基本類型和自定義類型)來說,其申明就需要用extern來修飾。

然后在.cpp文件里定義、實現或初始化這些全局函數和全局變量。

不過導師一直反復強調:不許使用全局函數和全局變量。用了之后造成的后果,目前就是交上去的作業項目會扣分。當然不能用自有不能用的理由以及解決方案,不過不在目前的討論范圍內。

自定義類型

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

函數成員

函數成員無論是否帶有static限定符,其申明都放在.h文件的類定義內部。

對于要inline的函數成員其定義放在.h文件;其他函數的實現都放在.cpp文件中。

數據成員

數據成員的申明與定義都是放在.h文件的類定義內部。對于數據類型,關鍵問題是其初始化要放在什么地方進行。

對于只含有static限定符的數據成員,它的初始化要放在.cpp文件中。因為它是所有類對象共有的,因此必須對它做合適的初始化。

對于只含有const限定符的數據成員,它的初始化只能在構造函數的初始化列表中完成。因為它是一經初始化就不能重新賦值,因此它也必須進行合適的初始化。

對于既含有static限定符,又含有const限定符的數據成員,它的初始化和定義同時進行。它也是必須進行合適的初始化

對于既沒有static限定符,又沒有const限定符的數據成員,它的值只針對本對象可以隨意修改,因此我們并不在意它的初始化什么時候進行。

模板類型

C++中,模板是一把開發利器,它與C#,Java的泛型很相似,卻又不盡相同。以前,我一直只覺得像泛型,模板這種東西我可能一輩子也不可能需要使用到。但是在導師的強制逼迫使用下,我才真正體會到模板的強大,也真正知道要如何去使用模板,更進一步是如何去設計模板。不過這不是三言兩語可以講完的,就不多說了。

對于模板,最重要的一點,就是在定義它的時候,編譯器并不會對它進行編譯,因為它沒有一個實體可用。

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

所以才定義模板的時候,會發現編譯器基本不會報錯(我當時還很開心的:我寫代碼盡然會沒有錯誤,一氣呵成),也做不出智能提示。但是當它被具體用在一個類上之后,錯誤就會大片大片的出現,卻往往無法準確定位。

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

因為模板的這種特殊性,它并沒有自己的準確定義,因此我們不能把它放在.cpp文件中,而要把他們全部放在.h文件中進行書寫。這也是為了在模板具體化的時候,能夠讓編譯器可以找到模板的所有定義在哪里,以便真正的定義方法。

至于模板類函數成員的定義放在哪里,導師的意見是放在類定義之外,因為這樣當你看類的時候,一目了然地知道有那些方法和數據;我在用Visual Studio的時候查看到其標準庫的實現,都是放在類內部的。

可能是我習慣了C#的風格,我比較喜歡把它們都寫在類內部,也因為在開發過程中,所使用的編輯器都有一個強大的功能:代碼折疊。

當然還有其他原因就是寫在類外部,對于每一個函數成員的實現都需要把模板類型作為限定符寫一遍,把類名限定符也要寫一遍。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久综合伊人77777蜜臀| 福利微拍一区二区| 久久久久日韩精品久久久男男| 91免费版网站入口| 亚洲国产一区二区三区四区| 久久亚洲精品成人| 日韩精品亚洲视频| 国产精品午夜国产小视频| 日韩亚洲欧美成人| 欧美福利视频在线| 亚洲免费人成在线视频观看| 久久久久久久久久久av| 日韩电影在线观看免费| 91亚洲精品久久久久久久久久久久| 羞羞色国产精品| 国产原创欧美精品| 中文字幕视频一区二区在线有码| 国产精品久久久久久久久久| 亚洲欧美中文字幕| 国产精品91久久| 日韩高清不卡av| 91亚洲精品一区二区| 欧美精品久久一区二区| 久久99热精品这里久久精品| 一区国产精品视频| 欧美精品在线观看91| 91沈先生在线观看| 欧美性精品220| 亚洲精品福利在线| 欧美丝袜第一区| 伊人一区二区三区久久精品| 亚洲一区二区三区乱码aⅴ| 欧美午夜精品久久久久久久| 91精品国产色综合久久不卡98| 亚洲无限乱码一二三四麻| 91在线直播亚洲| 欧美另类第一页| 青草热久免费精品视频| 久久综合久中文字幕青草| 久久久999国产精品| 欧美日韩成人精品| 成人激情视频在线| 日本精品久久中文字幕佐佐木| 亚洲色图偷窥自拍| 久久视频在线直播| 久久国产精品久久国产精品| 91免费视频国产| 精品视频在线观看日韩| 久久成人亚洲精品| 久久久人成影片一区二区三区| 国产精品va在线播放我和闺蜜| 日韩一区二区三区xxxx| 57pao国产成人免费| 亚洲图片欧美日产| 亚洲国产毛片完整版| 成人做爽爽免费视频| 欧美人交a欧美精品| 国产成人在线播放| 性色av一区二区咪爱| 日韩美女在线播放| 在线激情影院一区| 久久99热精品这里久久精品| 亚洲精品短视频| 久久综合久久八八| 成人福利在线视频| 欧美性色xo影院| 欧美日韩国产一区二区三区| 日韩av手机在线看| 午夜精品美女自拍福到在线| 亚洲乱码av中文一区二区| 7777精品久久久久久| 欧美激情久久久久久| 少妇高潮 亚洲精品| 日韩免费看的电影电视剧大全| 成人a视频在线观看| 欧美日韩国产精品一区二区不卡中文| 欧美高清视频在线| 97人洗澡人人免费公开视频碰碰碰| 日韩成人在线免费观看| 欧美日韩在线观看视频小说| 亚洲成人久久电影| 国产精品美女久久久免费| 久久婷婷国产麻豆91天堂| 日本aⅴ大伊香蕉精品视频| 国产亚洲精品va在线观看| 精品亚洲一区二区三区在线播放| 97av视频在线| 日韩电影免费观看中文字幕| 国产精品欧美激情在线播放| 亚洲性猛交xxxxwww| 91久久精品美女| 久久精品在线播放| 在线成人中文字幕| 国产福利精品视频| 日韩av综合网站| 欧美性xxxx极品hd满灌| 国产高清在线不卡| 国外日韩电影在线观看| 在线精品视频视频中文字幕| 国产亚洲精品日韩| 国产亚洲福利一区| 亚洲一区二区三区四区视频| 国产一区二区三区在线观看网站| 国产在线视频2019最新视频| 91在线|亚洲| 国产精品视频男人的天堂| 亚洲国产小视频| www欧美xxxx| 日韩欧美一区视频| 亚洲qvod图片区电影| 精品久久香蕉国产线看观看亚洲| 亚洲午夜性刺激影院| 亚洲欧美日韩直播| 欧美性xxxxx| 亚洲精品视频在线播放| 亚洲欧美日韩国产中文专区| 亚洲无av在线中文字幕| 日本高清不卡在线| 国模精品视频一区二区| 人体精品一二三区| 亚洲欧美日韩高清| 国产亚洲在线播放| 中文字幕在线亚洲| 精品香蕉在线观看视频一| 日韩在线观看电影| 亚洲精品一区二区在线| 伊人久久久久久久久久久| 北条麻妃一区二区在线观看| 久热精品在线视频| 91在线中文字幕| 日韩免费不卡av| 精品少妇一区二区30p| 日韩av手机在线观看| 国产一区二区三区视频| 欧美极品第一页| 国产在线精品成人一区二区三区| 国产精品福利久久久| 色综合久综合久久综合久鬼88| 中文字幕在线亚洲| 欧美国产日韩在线| 亚洲性无码av在线| 欧美日韩在线影院| 国产精品视频网站| 成人免费视频网| 亚洲免费中文字幕| 国产日产欧美精品| 自拍偷拍亚洲在线| 国产成人精品在线播放| 欧美综合一区第一页| 日韩视频免费在线观看| 午夜精品久久久久久久久久久久| 久久久亚洲国产天美传媒修理工| 久久影视电视剧免费网站| 亚洲精品国产品国语在线| 精品调教chinesegay| 亚洲人成网站777色婷婷| 日韩电影中文字幕在线| 亚洲大尺度美女在线| 亚洲日韩中文字幕| 精品网站999www| 欧美美女操人视频| 亚洲片av在线| 热re99久久精品国产66热| 国产精品色视频|