- C++基础
- C++首页
- C++概述
- C++环境设置
- C++基本语法
- C++注释
- C++ Hello World
- C++省略命名空间
- C++常量/字面量
- C++关键字
- C++标识符
- C++数据类型
- C++数值数据类型
- C++字符数据类型
- C++布尔数据类型
- C++变量类型
- C++变量作用域
- C++多个变量
- C++基本输入/输出
- C++修饰符类型
- C++存储类
- C++运算符
- C++数字
- C++枚举
- C++引用
- C++日期和时间
- C++控制语句
- C++决策制定
- C++ if 语句
- C++ if else 语句
- C++嵌套 if 语句
- C++ switch 语句
- C++嵌套 switch 语句
- C++循环类型
- C++ while 循环
- C++ for 循环
- C++ do while 循环
- C++ foreach 循环
- C++嵌套循环
- C++ break 语句
- C++ continue 语句
- C++ goto 语句
- C++构造函数
- C++构造函数和析构函数
- C++复制构造函数
C++命名空间
考虑这样一种情况:同一个班级里有两个名字相同的人,都叫Zara。如果我们需要区分他们,肯定需要使用一些额外的信息来补充他们的名字,例如他们居住的地区(如果他们住在不同地区),或者他们母亲或父亲的名字等。
同样的情况也可能出现在你的C++应用程序中。例如,你可能正在编写一些代码,其中包含一个名为xyz()的函数,并且还有一个可用的库也包含相同的函数xyz()。现在编译器无法知道你的代码中指的是哪个版本的xyz()函数。
命名空间的设计就是为了克服这个难题,它被用作额外的信息来区分在不同库中具有相同名称的类似函数、类、变量等。使用命名空间,你可以定义名称被定义的上下文。本质上,命名空间定义了一个作用域。
定义命名空间
命名空间定义以关键字namespace开头,后跟命名空间名称,如下所示:
namespace namespace_name { // code declarations }
要调用函数或变量的启用命名空间的版本,请在前面加上命名空间名称 (::),如下所示:
name::code; // code could be variable or function.
让我们看看命名空间如何作用于包括变量和函数在内的实体:
#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } } // second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } int main () { // Calls function from first name space. first_space::func(); // Calls function from second name space. second_space::func(); return 0; }
如果我们编译并运行上面的代码,将会产生以下结果:
Inside first_space Inside second_space
using 指令
你还可以使用using namespace指令避免在命名空间前添加前缀。此指令告诉编译器后续代码正在使用指定命名空间中的名称。因此,命名空间将隐式地应用于后续代码:
#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } } // second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } using namespace first_space; int main () { // This calls function from first name space. func(); return 0; }
如果我们编译并运行上面的代码,将会产生以下结果:
Inside first_space
‘using’指令也可以用来引用命名空间中的特定项目。例如,如果你打算使用的std命名空间的唯一部分是cout,你可以如下引用它:
using std::cout;
后续代码可以引用cout而无需添加命名空间前缀,但std命名空间中的其他项目仍然需要显式指定,如下所示:
#include <iostream> using std::cout; int main () { cout << "std::endl is used with std!" << std::endl; return 0; }
如果我们编译并运行上面的代码,将会产生以下结果:
std::endl is used with std!
在using指令中引入的名称遵循正常的范围规则。该名称从using指令的位置可见,到包含该指令的作用域的末尾。在外层作用域中定义的同名实体将被隐藏。
不连续命名空间
命名空间可以分成几部分定义,因此命名空间是由其分别定义的部分的总和组成的。命名空间的不同部分可以分布在多个文件中。
因此,如果命名空间的一部分需要在另一个文件中定义的名称,则该名称仍然必须声明。编写以下命名空间定义,要么定义一个新的命名空间,要么向现有的命名空间添加新元素:
namespace namespace_name { // code declarations }
嵌套命名空间
命名空间可以嵌套,你可以在另一个命名空间内定义一个命名空间,如下所示:
namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }
你可以使用解析运算符访问嵌套命名空间的成员,如下所示:
// to access members of namespace_name2 using namespace namespace_name1::namespace_name2; // to access members of namespace:name1 using namespace namespace_name1;
在上面的语句中,如果你使用namespace_name1,那么它将使namespace_name2的元素在作用域中可用,如下所示:
#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } // second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main () { // This calls function from second name space. func(); return 0; }
如果我们编译并运行上面的代码,将会产生以下结果:
Inside second_space