C++为解决相同的函数名或变量名造成冲突使用了命名空间这一概念:
那什么是命名空间呢?命名空间又称为名字空间,是程序员命名的内存区域,程序员根据需要指定一些有名字的空间域,把一些全局实体分别存放到各个命名空间中,从而与其他全局实体分隔开。通俗的说就是,每一个名字空间都是一个独立的空间域,只要你不取使用这个空间域的话,程序是找不到这块空间内的内容的。我们把命名空间的内容叫做实体。
一个命名空间可以放哪些类型?
变量
常量
函数,可以是定义或声明
结构体
类
模板
命名空间,可以嵌套定义
一.命名空间的使用形式:
1.using编译指令
#include<iostream>
//其中std是标准命名空间
using namespace std;
int main()
{
cout << "hello,world" << endl;
return 0;
}
此方法可以一次性将标准命名空间std内的所有实体都暴露出来,如果对一个空间内的实体不熟悉,会造成名字冲突的问题。
2.作用域限定符的形式
#include<iostream>
int main()
{
std::cout << "hello,world" << std::endl;
return 0;
}
通过作用域限定符::指出是哪个命名空间的哪个实体,优点是即使自定义的实体与命名空间的实体冲突了也没有关系;缺点是使用起来太复杂。
3.using声明机制
#include<iostream>
using std::cout;
using std::endl;
int main()
{
cout << "hello,world" << endl;
return 0;
}
通过using使用哪个实体就引出哪个实体,不会造成命名冲突。
二.命名空间的扩展
#include<iostream>
using std::cout;
using std::endl;
namespace myspace {
int number = 100;
void print_1()
{
cout << "hello" << endl;
}
}
namespace myspace {
void print_2()
{
cout << "world" << endl;
}
}
int main()
{
myspace::print_1();
myspace::print_2();
return 0;
}
重复定义命名空间相当于对命名空间进行一次扩展。
三.匿名空间
#include<iostream>
using std::cout;
using std::endl;
int number = 10;
namespace myspace {
int number = 100;
void print(int number)
{
cout << "函数参数number=" << number << endl;
cout << "myspace命名空间的number=" << myspace::number << endl;
cout << "匿名空间的number=" << ::number << endl;
}
}
int main()
{
myspace::print(50);
return 0;
}
即使你不定义任何一个空间,所写函数和变量等实体默认也是在一个匿名空间中,由于没有名字,该空间中的实体,其它文件无法引用,它只能在本文件的作用域内有效,它的作用域是从匿名命名空间声明开始到本文件结束。