課程
/后端開發
/C++
/C++遠征之封裝篇(上)
好像demo.cpp和Teacher.cpp沒有關系,為什么運行demo.cpp可以用Teacher.cpp里的定義
2017-09-17
源自:C++遠征之封裝篇(上) 6-2
正在回答
從語法上說:函數只要聲明了就可以使用(調用它),所以 cpp 文件只要 include 相應的函數頭文件(頭文件中就是函數聲明)就可以使用這個函數,并不需要知道函數的實現。
那么你是好奇“為什么代碼中沒有實現也可調用呢”? 這需要你明白什么是“編譯”和“鏈接”:
函數還是需要實現的,不過那是實現在其他 cpp 文件中的。
像這樣由多個 cpp 構成的程序,其中每個 cpp 文件都是被編譯器單獨編譯的。每一個 cpp 文件被稱為一個“編譯單元”。 注意編譯器無需得知函數實現即可編譯函數調用,它只要知道函數聲明(需要聲明只是為了進行類型檢查)。
你可以想象的到,單個 cpp 文件并不能單獨編譯成可執行程序。這些 cpp 源碼文件的編譯結果需要“整合”起來,這就是鏈接。
進行鏈接是鏈接器的工作,它會找到不同編譯單元間引用的變量和函數,處理好它們之間的訪問和調用(這些具體是如何處理的你現在不用知道),然后綜合這些結果生成最終的可執行程序。
所以就每個 cpp 來說,它確實不用管它用的函數是在哪里實現的,因為后續鏈接器會處理好這一切的。
假如某個使用的函數真的沒有被任何一個 cpp 代碼實現,那么最后鏈接器會發現它找不到這一函數的實現,就會報“未定義引用”這樣的鏈接錯誤。
其實在一開始學習時寫的那種很小的單文件程序中,你也使用了實現在其他地方的函數啊! 那些 printf 之類的庫函數就是! ? 現在你回過頭想一下:你只是 include 了相應的庫頭文件,就調用了 printf,你也沒有實現 printf,但你同樣成功調用了它! ?實際上是你的編譯環境提供了庫函數的實現代碼,最后鏈接器會負責找到標準庫的實現并整合進你的程序中。
瀟瀟_暮雨 提問者
onemoo 回復 瀟瀟_暮雨 提問者
源文件之間調用 ?extern 調用函數 ?,如果調用的是自己編寫的頭文件就用 ?include "調用文件";
那是因為你在demo.cpp中加入了Teacher.cpp的頭文件(Teacher.h)
舉報
封裝--面向對象的基石,本教程力求幫助小伙伴們即學即會
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2017-09-21
從語法上說:函數只要聲明了就可以使用(調用它),所以 cpp 文件只要 include 相應的函數頭文件(頭文件中就是函數聲明)就可以使用這個函數,并不需要知道函數的實現。
那么你是好奇“為什么代碼中沒有實現也可調用呢”? 這需要你明白什么是“編譯”和“鏈接”:
函數還是需要實現的,不過那是實現在其他 cpp 文件中的。
像這樣由多個 cpp 構成的程序,其中每個 cpp 文件都是被編譯器單獨編譯的。每一個 cpp 文件被稱為一個“編譯單元”。 注意編譯器無需得知函數實現即可編譯函數調用,它只要知道函數聲明(需要聲明只是為了進行類型檢查)。
你可以想象的到,單個 cpp 文件并不能單獨編譯成可執行程序。這些 cpp 源碼文件的編譯結果需要“整合”起來,這就是鏈接。
進行鏈接是鏈接器的工作,它會找到不同編譯單元間引用的變量和函數,處理好它們之間的訪問和調用(這些具體是如何處理的你現在不用知道),然后綜合這些結果生成最終的可執行程序。
所以就每個 cpp 來說,它確實不用管它用的函數是在哪里實現的,因為后續鏈接器會處理好這一切的。
假如某個使用的函數真的沒有被任何一個 cpp 代碼實現,那么最后鏈接器會發現它找不到這一函數的實現,就會報“未定義引用”這樣的鏈接錯誤。
其實在一開始學習時寫的那種很小的單文件程序中,你也使用了實現在其他地方的函數啊! 那些 printf 之類的庫函數就是! ? 現在你回過頭想一下:你只是 include 了相應的庫頭文件,就調用了 printf,你也沒有實現 printf,但你同樣成功調用了它! ?實際上是你的編譯環境提供了庫函數的實現代碼,最后鏈接器會負責找到標準庫的實現并整合進你的程序中。
2017-09-17
源文件之間調用 ?extern 調用函數 ?,如果調用的是自己編寫的頭文件就用 ?include "調用文件";
2017-09-17
那是因為你在demo.cpp中加入了Teacher.cpp的頭文件(Teacher.h)