1、什么是命名空间
namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。namespace就是一个名字的空间,是为了避免名字冲突而使用的。在不同的空间里可以使用同一个名字而不会引起名字冲突。它的声明就像声明一个类一样。例:
namespace A
{
int f(){……};
char g(){……};
}
#include <iostream>
#include <string>
using namespace std;
//using namespace编译指示,使在C++标准类库中定义的名字在本程序中可以使用
//否则,iostream,string 等c++标准类就不可见了,编译就会出错。
//两个在不同命名空间中定义的名字相同的变量
namespace myown1{
string user_name = "myown1";
}
namespace myown2{
string user_name = "myown2";
}
int main()
{
cout<< "\n"
<< "Hello, "
<< myown1::user_name //用命名空间限制符myown1访问变量user_name
<< "... and goodbye!\n";
cout<< "\n"
<< "Hello, "
<< myown2::user_name //用命名空间限制符myown2访问变量user_name
<< "... and goodbye!\n";
return 0;
}
当然,我们也可以使用程序开头的预编译指示来使用命名空间中的名字。使用预编译指示的好处在于在程序中不必显式地使用命名空间限制符来访问变量。以上主程序可修改为:
int main()
{
using namespace myown1;
cout<< "\n"
<< "Hello, "
<< user_name
<< "... and goodbye!\n";
// using namespace myown2;
cout<< "\n"
<< "Hello, "
<< myown2::user_name //用命名空间限制符myown2访问变量user_name
<< "... and goodbye!\n";
return 0;
}
2、命名空间的.h
在标准C++以前,都是用#include<iostream.h>这样的写法的,因为要包含进来的头文件名就是iostream.h。标准C++引入了名字空间的概念,并把iostream等标准库中的东东封装到了std名字空间中,同时为了不与原来的头文件混淆,规定标准C++使用一套新的头文件,这套头文件的文件名后不加.h扩展名,如iostream、string等等,并且把原来C标准库的头文件也重新命名,如原来的string.h就改成cstring(就是把.h去掉,前面加上字母c),所以头文件包含的写法也就变成了#include <iostream>。
因此,当使用<iostream.h>时,是早期实现,相当于在c中调用库函数,使用的是全局命名空间;
当使用< iostream>的时候,是标准库,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
3. using namespace std;
C++的标准库的所有标识符都被定义在了std命名空间里,这一句话就是相当于把std内定义的所有标识符都曝光,就好像这些标识符都被声明为全局变量一样。
4、命名空间的三种使用方法
(1)直接指定标识符。
例如std::ostream而不是ostream。完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
(2)使用using关键字。
using std::cout;
using std::endl;
以上程序可以写成
cout << std::hex << 3.4 << endl;
(3)最方便的就是使用using namespace std; 例如:
#include
#include
#include
using namespace std;
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
cout << hex << 3.4 << endl;
5、#include的<>与""
< >引用的是编译器的类库路径里面的头文件
" "引用的是你程序目录的相对路径中的头文件,在程序目录的相对路径中找不到该头文件时会继续在类库路径里搜寻该头文件。