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