因为自学C++,第一次使用“using namespace std;”时完全是照着书抄的,关于它的意思也是一知半解,现在,我就要学习它了。
在C++中,名称可以是变量、函数、结构、枚举、类以及类和结构的成员。那么随着项目的增大,名称相互冲突的可能性也将增大。使用多个厂商的类库时,可能导致名称冲突。例如,两个库可能都定义了名为List、Tree和Node的类,但定义的方式不兼容。用户可能希望使用一个库的List类,而使用另一个库的Tree类。这种冲突被称为名称空间问题。
C++标准提供了名称空间工具,以便更好地控制名称的作用域。后来,编译器普遍开始支持名称空间。
首先,我们要熟悉名称空间的概念。
- 声明区域:声明区域是可以在其中进行声明的区域。例如,可以在函数外面声明全局变量,对于这种变量,其声明区域为其所在的文件。对于在函数中声明的变量,其声明区域为其声明所在的代码块。
- 潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明作用域小,这是由22222222222222222于变量必须定义后才能使用。
然而,变量并非在其潜在作用域内的任何位置都是可见的。例如,它可能被另一个在嵌套声明区域中声明的同名变量隐藏。例如,在函数中声明的局部变量(对于这种变量,声明区域为整个函数)将隐藏在同一个文件中声明的全局变量(对于这种变量,声明区域为整个文件)。变量对程序而言可见的范围被称为作用域,前面正是以这种方式使用该术语的。下图对术语声明区域、潜在作用域和作用域进行了说明。
C++关于全局变量和局部变量的规则定义了一种名称空间层次。每个声明区域都可以声明名称,这些名称独立于在其他区域中声明的名称。在一个函数中声明的局部变量不会与在另一个函数中声明的局部变量发生冲突。
上面一段内容是传统的C++名称空间,接下来我们将学习新的名称空间特性。
C++新增了这样一种功能——通过定义一种新的声明区域来创建命名的名称空间,这样做的目的是提供一个声明名称的区域。一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。
例如,下面的代码使用新的关键字namespace创建了两个名称空间:Jack 和 jill 。
namespace Jack{ double pail; //定义变量 void fetch(); //函数原型 int pal; //定义变量 struct Well { ... }; //定义结构体 } namespace Jill{ double bucket(double n) { ... } //定义函数 double fetch; //定义变量 int pal; //定义变量 struct Hill { ... }; //定义结构体 }