C++ 命名空间
C++ 命名空间
命名空间std
C++ 标准中引入命名空间的概念,是为了解决不同模块或者函数库中相同标识符冲突的问题。有了命名空间的概念,标识符就被限制在特定的范围呢,不会引起命名冲突。最典型的例子就是std 命名空间,C++ 标准库中所有标识符都包含在std命名空间中。
不同模块或者函数库中相同标识符冲突的问题示例:
x.h
1 namespace MyNameSpace01{
2 class MyClass{
3 public:
4 int f();
5 private:
6 int m;
7 };
8 int MyClass::f(){
9 return 100;
10 }
11 }
y.h
1 namespace MyNameSpace02{
2 class MyClass{
3 public:
4 int f();
5 private:
6 int m;
7 };
8 int MyClass::f(){
9 return 200;
10 }
11 }
z.cpp
1 #include<iostream>
2 #include "x.h"
3 #include "y.h"
4 using namespace std;
5
6 void main(){
7 //声明一个文件x.h中类MyClass的实例x
8 MyNameSpace01::MyClass x;
9 //声明一个文件x.h中类MyClass的实例x
10 MyNameSpace02::MyClass y;
11 //调用文件x.h中的函数f
12 cout<<x.f()<<endl;//100
13 //调用文件y.h中的函数f
14 cout<<y.f()<<endl;//200
15 }
如果确信在程序中引用某个或者某些程序库不会引起命名冲突,那么可以通过using操作符来简化对程序库中标识符(通常时函数)的使用,例如: using namespace std; 那么就可以不用在标识符在前缀std:: 来使用C++ 标准库库中的函数了。
所谓namespace,是标识符的可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
std::hex是用来进行十六进制流的输出,例如:255的十六进制数是ff。
1 #include<iostream>
2
3 void main(){
4 std::cout << std::hex <<255<< std::endl;//ff
5 }
2、使用using关键字。
1 #include<iostream>
2 using std::cout;
3 using std::endl;
4
5 void main(){
6 cout<<std::hex<<255<<endl;//ff
7 }
3、最方便的就是使用using namespace std;
1 #include<iostream>
2 using namespace std;
3 void main(){
4 cout<<hex<<255<<endl;//ff
5 }
因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准 库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了<iostream.h>和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"