主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

C++ 面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

C++ 高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ 命名空间


上一章 下一章

一. 命名空间的定义

考虑一种情况,当同班级中有两个同名的学生Zara时,我们需要用额外的信息来区分她们,例如居住地区或父母的名字。同样的情况也可能出现在您的C++应用程序中,例如,当您编写一个名为xyz()的函数时,另一个库中也存在同名的函数xyz(),这时编译器无法确定您指的是哪个版本的xyz()函数。命名空间旨在解决这个问题,它用于通过提供附加信息来区分在不同库中存在的同名函数、类、变量等。命名空间定义了名称的上下文,本质上,命名空间定义了一个作用域。

二. 定义命名空间

命名空间的定义以关键字namespace开始,后跟命名空间的名称,如下所示:

namespace namespace_name {
   // 代码声明
}

要调用特定命名空间中的函数或变量,您需要在名称前加上 (::),如下所示:

name::code;  // code 可以是变量或函数。

让我们来看一个例子:

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space {
   void func() {
      cout << "Inside first_space" << endl;
   }
}

// 第二个命名空间
namespace second_space {
   void func() {
      cout << "Inside second_space" << endl;
   }
}

int main () {
   // 调用第一个命名空间中的函数。
   first_space::func();
   
   // 调用第二个命名空间中的函数。
   second_space::func(); 

   return 0;
}

如果我们编译并运行上述代码,结果将是:

Inside first_space
Inside second_space

三. using 指令

您还可以使用using namespace指令来避免在代码中每次都添加命名空间。该指令告诉编译器后续代码将使用指定命名空间中的名称。命名空间因此在后续代码中是隐含的:

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space {
   void func() {
      cout << "Inside first_space" << endl;
   }
}

// 第二个命名空间
namespace second_space {
   void func() {
      cout << "Inside second_space" << endl;
   }
}

using namespace first_space;
int main () {
   // 这将调用第一个命名空间中的函数。
   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指令中引入的名称遵循正常的作用域规则。名称从使用指令所在的位置到指令所在作用域的结束都是可见的。外层作用域中具有相同名称的实体会被隐藏。

四. 不连续命名空间

命名空间可以分多个部分定义,因此命名空间是由其单独定义的部分的总和组成。如果命名空间的一部分需要在另一个文件中定义的名称,该名称仍然必须声明。下面的命名空间定义要么定义一个新命名空间,要么向现有命名空间添加新元素:

namespace namespace_name {
   // 代码声明
}

五. 嵌套命名空间

命名空间可以嵌套,您可以在一个命名空间内定义另一个命名空间,如下所示:

namespace namespace_name1 {
   // 代码声明
   namespace namespace_name2 {
      // 代码声明
   }
}

您可以使用解析运算符访问嵌套命名空间的成员,如下所示:

// 访问 namespace_name2 的成员
using namespace namespace_name1::namespace_name2;

// 访问 namespace_name1 的成员
using namespace namespace_name1;

在上述语句中,如果您使用namespace_name1,那么namespace_name2中的元素将在作用域中可用,如下所示:

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space {
   void func() {
      cout << "Inside first_space" << endl;
   }
   
   // 第二个命名空间
   namespace second_space {
      void func() {
         cout << "Inside second_space" << endl;
      }
   }
}

using namespace first_space::second_space;
int main () {
   // 这将调用第二个命名空间中的函数。
   func();
   
   return 0;
}

如果我们编译并运行上述代码,结果将是:

Inside second_space
上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图