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