C++前置聲明及#include略解


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類同是如此。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM