命名空间
在C/C++中,变量、函数和后面要了解的类应用及其广泛,这些变量, 函数和类的名称都将存在于全局作用域当中,可能会导致很多冲突。使用命名空间的目的就是为了对标识符的名称进行本地化,以避免命名冲突
在这里 namespace关键字的出现就是为了针对这种问题的。
关于命名空间的定义
定义命名空间,需要用到的就是namespace关键字,后面跟命名空间的名字,然后加上{}即可,在{}中的的即为命名空间的成员。
接下来我们来看具体的例子
首先来看一个普通的命名空间
namespace n1 //n1即为命名空间的名称
{
//在命名空间中,我们既可以定义变量,也可以定义函数
int a;
int Add(int left, int right)
{
return left + right;
}
}
为了更好地理解命名空间,我们对命名空间的常用功能进行归纳,并进行示例
1.命名空间可以解决函数, 全局变量名重复的问题,包在不同的命名空间中的重复函数实际上就是两个完全无关的函数
比如:
namespace n1
{
int a;
int Add(int a, int b)
{
std::cout << "1" << endl;
return a + b;
}
}
namespace n2
{
int Add(int a, int b)
{
std::cout << "2" << endl;
return a + b;
}
}
在C语言当中这样两个相同的函数是不可能存在的,但在C++当中命名空间的出现解决了这样的问题
在调用的时候,就要在函数前加上相对应的域;
这样我们就可以分别调用这两个相同的函数Add
int main()
{
std::cout << n1::Add(3, 5) << endl;
std::cout << n2::Add(2, 4) << endl;
system("pause");
return 0;
}
2.命名空间允许嵌套,嵌套内部和外部没有任何关系
看例子
namespace test
{
namespace n1
{
int Add(int a, int b)
{
std::cout << "1" << endl;
return a + b;
}
}
namespace n2
{
int Add(int a, int b)
{
std::cout << "2" << endl;
return a + b;
}
}
}
int main()
{
std::cout << test::n1::Add(1, 2) << endl;
std::cout << test::n2::Add(3, 4) << endl;
system("pause");
return 0;
}
3.命名空间允许重名, 重名的命名空间会被合并
namespace n1{
int sub(int a, int b){
std::cout << "3\n";
return a - b;
}
}
namespace n1{
int add(int a, int b){
std::cout << "2\n";
return a + b;
}
}
命名空间是用来定义作用域的,它解决了C语言当中只能用文件划分作用域的缺陷.
使用using关键字,可以引用一个名字空间,使得这个名字空间内的所有内容对自己可见。
举个简单例子
namespace test1
{
int a = 5;
}
int main()
{
std::cout << a; //这样会报错,a是未声明的标识符
system("pause");
return 0;
}
对其进行修改
namespace test1
{
int a = 5;
}
using namespace test1;
int main()
{
std::cout << a;
system("pause");
return 0;
}
最后,
如果两个名字空间里分别有相同的两个函数,那么即使我同时用using引用了两个名字空间,那么也不会报错,除非我使用了这个函数(因为使用函数会产生歧义,也就是不知道该调哪个)。
也就是说
namespace n1
{
int add(int a, int b)
{
return a + b;
}
}
namespace n2
{
int add(int a, int b)
{
return a + b;
}
}
using namespace n1;
using namespace n2;
int main()
{
system("pause");
return 0;
}
这个时候不会出现问题,但是当我们要调用这个相同的函数时就会出现问题,因为编译器不知道该调哪个,即
namespace n1
{
int add(int a, int b)
{
return a + b;
}
}
namespace n2
{
int add(int a, int b)
{
return a + b;
}
}
using namespace n1;
using namespace n2;
int main()
{
std::cout << add(3, 4);
system("pause");
return 0;
}
这个时候我们调用了add函数就会报错