一、前言
名称空间的作用:避免名称冲突,让其他部分可以使用该名称空间的东西。
名称空间是开放的,可以在程序的各个地方中途把东西加入与元素空间,因此我们难以直到名称空间到底有哪些东西。
二、名称空间
默认情况下,名称空间的链接性为向外(除非引用了常量)。用户自定义的名称空间和系统自带的“全局名称空间”的链接性都是向外。全局变量就位于全局名称空间中。全局名称空间的变量直接用,不用::。
使用名称空间中的东西有三种方法
1、using声明。使用单个变量。省去了在程序处用::
2、using编译指令。使用整个名称空间的东西。
3、使用::。这种方式可以避免名称冲突和隐藏,需要结合前面两点
注意:
1、using声明使用两个名称空间中的同名变量会报错。但是可以在程序处用::来指定。
//不允许
using student::name;
using teacher::name;
2、using编译指令使用两个名称空间中的同名变量不会报错,低作用域的变量会隐藏高作用域变量。
3、在一个函数里使用using声明或编译指令,对另一个函数不管用,即使这个函数调用了另一个函数。
三、例子
1、
namespace student
{
//student名称空间age
int age;
}
//全局名称空间age
int age;
int main()
{
using namespace student;
//函数自己的age
int age;
}
student里的age和全局age不会互相隐藏。但是它们都会被函数自己的age隐藏。
但是如果使用::则它们不会被隐藏,可以被分别使用,如下:
namespace student
{
//student名称空间age
int age;
char name[10];
}
//全局名称空间age
int age;
int main()
{
using namespace student;
int age;
//函数自己的age
age = 1;
//全局age
::age = 2;
//student的age
student::age = 3;
test();
}
test()
{
//main中的using在test中不管用
name[10] = "abc";//不允许
student::name[10] = "abc";//允许
}
四、名称空间和头文件的区别
名称空间有变量的定义,头文件中避免定义变量。
名称空间中的变量作用域确定,可以直接遵守相关作用域规则进行使用。头文件中的变量根本就没内存,需要在程序自己定义,作用域在定义这个变量之前是不确定的。
五、其他
名称空间的嵌套、未命名的名称空间。见C++ Primer Plus第六版270~271页