一、命名空间的概念
在C++中,变量、函数和类都是大量存在的,它们都存在与全局命名空间中,会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字。
二、命名空间的定义
一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限于该命名空间中。没有名称的命名空间,它的成员只在声明该命名空间的文件中可以访问,访问时不需要加命名空间名称,对于其他文件该命名空间中内容不可见。
1、普通的命名空间
//(1)
namespace N1 //N1为命名空间的名称
{
//命名空间的内容既可以是变量,也可以定义函数
int a;
int Add(int left, int right)
{
return left + right;
}
}
//(2)同一工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}
2、嵌套的命名空间
namespace N2
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N3 //嵌套函数
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
3、没有名称的命名空间
namespace
{
int a;
int Div(int left, int right)
{
if (0 == right)
{
exit(0);
}
return left / right;
}
}
三、命名空间的使用
命名空间中成员该如何使用?
1、错误的使用
【例1】
#include<iostream>
using namespace std;
namespace N
{
int a = 10;
int b = 20;
int Add(int left, int right)
{
return left + right;
}
int Sub(int left, int right)
{
return left - right;
}
}
int main()
{
printf("%d\n", a);//该语句编译出错,无法识别“a”
return 0;
}
编译结果:
释:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中,想使用命名空间中的数据需要引用的方式。
2、命名空间使用的方式
(1)加命名空间名称及作用域限定符
int main()
{
printf("%d\n", N::a);
return 0;
}
(2)使用using将命名空间中成员引入
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
(3)使用using namespace命名空间名称引入
using namespace N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
cout << Add(10, 20) << endl;
return 0;
}
【例2】
#include<iostream>
using namespace std;
namespace N
{
int a = 10;
int b = 20;
int Add(int left, int right)
{
return left + right;
}
int Sub(int left, int right)
{
return left - right;
}
}
using N::b;//使用命名空间中变量“b”
using namespace N;//使用命名空间“N”
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
cout<<Add(10, 20)<<endl;
system("pause");
return 0;
}
运行结果:
释:
(1)标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。
(2)在采用标准C++的平台上使用标准C++库中的组件,都要写一个using指示符,即“using namespace std”就可以使用标准C++库中的所有成员,或者以std::成员的方式也可以使用C++库里的成员。
(3)“::”是作用域解析符。
【例3】
#include <iostream>
using namespace std;
namespace bit1
{
int n = 0;
}
namespace bit2
{
int n = 10;
}
int n = 100;
int main()
{
n = 1000;
cout << bit1::n << endl;
cout << bit2::n << endl;
cout << ::n << endl;
cout << n << endl << endl;
int k;
cout << "请输入数字:" << endl;
cin >> k;
cout << k << endl;
system("pause");
return 0;
}
运行结果:
释:
(1)cout是标准输出流对象(屏幕),<<是输出操作符;
(2)cin是标准输入流对象(键盘),>>是输入操作符;
(3)endl是换行操作符。
(4)当作用域解析符前不加任何限定符时,输出的是局部变量的值,就近原则。
(5)使用C++输入输出更方便,不需增加数据格式控制,比如:整型–%d,字符–%c。