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