實作檔案分離
1.頭檔案中不要使用using namespace,由于c++編譯的特性,由于初學還沒深入了解,不做具體編譯的解釋
2.由于沒有了命名空間,所以string定義要寫成std::string
3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h
main.cpp
#include <iostream>
#include <string>
#include <fstream>
#include "staff.cpp"
staff.cpp
#include <iostream>
#include <string>
#include <fstream>
#include "staff.h"
using namespace std;
這樣就可以通過編譯了
那么為什么呢?經過網上查閱資料找到了原因:
但是下面的解釋我感徑訓是有不對,下面的內容僅供參考,帶我對c++有了更深的了解之后,再寫一篇完整的博客來解釋檔案分離的實作,迫于課程設計的安排,不得不囫圇吞棗一下,嘻嘻嘻
還有一點就是在解決這,個問題的時候,又看到有說函式模板解決的,我現在大致明白了函式模板是干什么的,但在實作檔案分離這一塊還不是很明白,以后再補上,嘿嘿嘿!!~··
接下來介紹一篇我發現的一篇博客,底部有轉載處:
- namespace和class
命名空間和類,非常相似,比如:
std::cout 和A::f(), 都用到了作用域符,都可以防止重名函式,可以更好的支持多人編程,
但是有幾個不同:
-
namespace 可以寫在多個不同的檔案中,而class只能在一個檔案中,
-
如果想使用A類中的函式如A::f(), 需要建立一個類的實體(靜態函式等除外),而namespace則相當于本身就是一個建立好的實體,可以直接呼叫函式,
除此之外,可以將命名空間看做特殊的類,
需要注意的是千萬不要在h檔案中使用using namespace,否則整個檔案都會帶上,
- .h檔案和.cpp檔案
首先要知道的是兩種檔案的最大區別:
編譯器將所有.cpp檔案編譯為.obj檔案再串聯起來,如果.cpp中有#include X.h檔案,那么第一步預處理會把X.h代碼粘貼到.cpp中代替#include陳述句,
基于這個特性,顯然,如果我們include 同一工程下的.cpp檔案,那么會將該.cpp檔案重復兩次(一次是本身的編譯,一次是include的復制),因此,.cpp檔案不適合進行include,
而我們往往需要在一個.cpp檔案中include很多其他檔案的代碼,那么這時候就需要.h檔案,
一個比喻就是.h是目錄,.cpp是內容,
這里需要再說一下編譯的程序,關鍵是宣告和定義的區分,
如果是宣告的話,比如宣告了一個函式,在匯編語言中就會通過call陳述句等在全域中尋找這個函式,只需要這個函式在別的.cpp檔案中有定義就可以了,而不需要當時就定義,
對變數也是這樣,當想使用一個別處定義的變數時,首先要宣告,使得該名字為程式所知,
如果不加“extern”的宣告,如
int j;
則會自動將j定義為j=0,自動初始化,那么這時就會出現重復定義等錯誤問題,
因此,應該使用
extern int j;
這將告知程式 有這樣一個j存在,就可以使用了,而j的定義在其他.cpp中,整體編譯完后就可以獲得j的定義了,
函式則會自動默認為是extern的效果,
因此,在.h中進行宣告,在.cpp中進行定義,可以避免重復的編譯,也更便于管理,
注意,不能在函式體內初始化一個extern變數,因為函式體的作用域僅在函式內,
感謝這篇博客給的我啟發
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/77531.html
標籤:C++
上一篇:C++中set的使用
下一篇:攔截應用程式向動態庫傳遞的引數
