在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。
-
命名空间吧与作用域
命名空间其实也是一种作用域,在C语言中我们接触了全局作用域和局部作用域。
- 命名空间的定义
相当于文件夹的意思,为了能够更好的找到和识别文件。
namespace,即名字空间,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
不定义名字空间的情况下,都属于全局名字空间,同一个名字空间可以定义多次,名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关字namespace,使用名字空间时用符号指定。
不指定名字空间的变量或函数都是当前名字空间下的变量或函数。
用别名指定名字空间名字空间可以一层层嵌套,指定时也得一层层地指定,这样很不方便,一般用别名代替就方便多了。
没有名字的名字空间名字空间的名字也可以省略,称之为无名名字空间,无名名字空间经常被使用,其作用是“内部可以引用,而外部不能引用。
1.普通命名空间
namespace N1
{
int a;
int Add(int left, int right)
{
return left + right;
}
}
2.命名空间可以嵌套
namespace N1
{
int a;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int a;
int Add(int left, int right)
{
return left + right;
}
}
}
3.同一个工程中允许多个相同名称的命名空间
namespace N1
{
int a;
int Add(int left, int right)
{
return left + right;
}
}
namespace N1
{
int a;
int Add(int left, int right)
{
return left + right;
}
}
- 命名空间的使用
1.加命名空间名称及作用域限定符
#include<stdio.h>
namespace N1
{
int a = 20;
int Add(int left, int right)
{
return left + right;
}
}
int a = 10;
int main()
{
printf("%d\n",a); //想打印出10
printf("%d\n",N1::a);//想打印出20
return 0;
}
2.使用关键字using将命名空间中成员引入
#include<stdio.h>
namespace N1
{
int a = 20;
int Add(int left, int right)
{
return left + right;
}
}
using N1::a;
int main()
{
printf("%d\n",a); //想打印出20
printf("%d\n",N1::a);//想打印出20
return 0;
}
3.使用using namespace 命名空间名称引入
#include<stdio.h>
namespace N1
{
int a = 20;
int Add(int left, int right)
{
return left + right;
}
}
using namespace N1;
int main()
{
printf("%d\n",a); //想打印出20
printf("%d\n",N1::a);//想打印出20
Add(1, 2);
return 0;
}