在C++中支持三种域:局部域、名字空间域和类域。
名字空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字:
namespace yyn
{
int g_max = 10;
float g_pi = 3.14;
void func()
{
...;
}
}
花括号括起来的部分称声明块。声明块中可以包括:类、变量(带有初始化)、函数(带有定义)等。最外层的名字空间域称为全局名字空间域,即文件域。
名字空间的引入,主要是为了解决全局名字空间污染问题,即防止程序中的全局实体名与其他程序中的全局实体名命名冲突。
示例:
#include<iostream>
//普通的命名空间
namespace yyn
{
int g_max = 10;
int g_min = 0;
int my_add(int a, int b) { return a + b; }
}
//命名空间域可以分层嵌套,同样有分层屏蔽作用
namespace Primer
{
double pi = 3.1415926535898;
double my_add(double a, double b) { return a + b; }
namespace Matrix
{
char my_max(char a,char b) { return a > b ? a : b; }
}
}
//同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成到一个命名空间中
namespace yyn
{
float pi = 3.14;
int my_sub(int a, int b)
{
g_min = a - b;
return g_min;
}
}
一个名字空间就定义了一个新的作用域,命名空间中所有内容都局限于该命名空间中。
名字空间的使用
1.加名字空间及作用域限定符
int main()
{
int a = yyn::my_add(12, 23);
printf("%d\n", a);
printf("%lf\n", Primer::pi);
printf("%f\n", yyn::pi);
char ch=Primer::Matrix::my_max('a', 'b');
printf("%c\n", ch);
return 0;
}
输出结果如下:
2.使用using将名字空间中成员引入
使用using声明可只写一次限定修饰名。using声明以关键字using开头,后面是被限定修饰的名字空间成员名:
using yyn::pi;
using Primer::Matrix::my_max;
//名字空间类成员Matrix的using声明
//以后在程序中使用Matrix时,就可以直接使用成员名,而不必使用限定修饰名
int main()
{
printf("%lf\n", Primer::pi);
printf("%f\n", pi);//yyn::pi
char ch = my_max('a', 'b');//Primer::Matrix::my_max
printf("%c\n", ch);
return 0;
}
输出结果为:
2.使用using namespace名字空间名称引入
使用using指示符可以一次性地使名字空间中所有成员都可以直接被使用,比using声明方便。using指示符是以关键字using开头,后面是关键字namespace,然后是名字空间名。
using namespace 名字空间名;
A.h如下:
#pragma once
namespace yyn
{
int my_add(int, int);
int my_sub(int, int);
}
A.cpp如下:
#include"A.h"
namespace yyn
{
int my_add(int a, int b)
{
return a + b;
}
int my_sub(int a, int b)
{
return a - b;
}
}
Maintest.cpp如下:
using namespace yyn;
int main()
{
printf("%d", my_add(12, 23));
return 0;
}
输出结果为:
使用using指示符:
标准C++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。在采用标准C++的平台上使用标准C++库中的所有组件,只要写一个using指示符:using namespace std;
就可以直接使用标准C++库中的所有成员。