1.在c++中,經常會使用#include<>或者#include" "來包含某些頭文件,這樣做減少了代碼的重復冗雜,是非常方便的,但是,不了解其中的奧秘的話,也是非常容易出錯的。所以我們就需要了解兩者不同調用的相同點和區別了。
相同:這種使用方法是在編譯前將頭文件包含到.cpp文件里面,
區別: #include<file> : 編譯程序會先到標准函數庫中找文件,即先到缺省路徑下尋找,再到當前目錄下尋找。
#include"file" : 編譯程序會先在當前目錄下尋找該文件,若未找到,則在標准庫中尋找。
2.在c++中,經常會使用using namespace std,這句話有什么用呢?沒用不會寫上面的,這是指的使用標准命名空間,std是空間名。C語言中,<iostream.h>調用了標准庫函數,是使用了全局的命名空間,所以不需要定義,也就是早期的c++,但是現在c++中使用<iostream>的時候,頭文件中沒有定義全局命名空間所以要使用自己定義的命名空間,而namespace std 就是微軟幫你定義好的一個命名空間,直接using就可以了。使用該命名空間時,也就可以調用空間中的庫函數,下面是一個小例子來解釋它:
//聲明
#include"iostream" using namespace std; namespace //定義一個名為test的空間 test { void Display() //其中包含庫函數Display() { cout<<"Hello World!!!"<<endl; } } //調用 #include"stdafx.h" //頭文件預編譯 #include"Display.h" //調用頭文件 using namespace test; //使用新定義的命名空間 int main(int argc, _TCHAR* argv[]) { Display(); //主函數中調用庫函數 return 0; }
3.當進行兩個類的強耦合是,#include"file"容易出錯,這時候就需前置聲明。就像下面的例子一樣:
// A.h
#include "B.h" class A { B b; public: A(void); virtual ~A(void); };
//A.cpp
#include "A.h" A::A(void) { } A::~A(void) { }
// B.h
#include "A.h" class B { A a; public: B(void); ~B(void); };
// B.cpp
#include "B.h" B::B(void) { } B::~B(void) { }
當在編譯A.cpp時,系統會先去找到A.h,一起包含道文件中,再進行編譯,但是在編譯A.h的時候,又需要先去編譯B.h,編譯B.h的時候,又需要去編譯A.h,顯然程序陷入了死循環,編譯自然不能通過。當我們進行前置聲明時,代碼就變成下面這樣了:
// A.h
class B; class A { B* b; public: A(void); virtual ~A(void); };
//A.cpp
#include "B.h" #include "A.h" A::A(void) { b = new B; } A::~A(void) { }
// B.h
class A; class B { A a; public: B(void); ~B(void); };
// B.cpp
#include "A.h" #include "B.h" B::B(void) { a = New A; } B::~B(void) { }
前置聲明,就是在聲明定義一個A類的時候,需要使用另一個B類,我們就可以先聲明一個B類,而不去具體定義它,只用編譯前讓編譯器知道有這么一個類,等到實現A類的時候,再用指針使用B類,實例化對象,調用A類方法。B類同是如此。