实例讲解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 指令引入的名称遵循正常的范围规则。名称从使用 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

以上就是实例讲解C++ 命名空间的详细内容,更多关于C++ 命名空间的资料请关注我们其它相关文章!

(0)

相关推荐

  • C++命名空间5种常见用法实例解析

    相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述. 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名空间定义了新的作用域.它们提供了一种避免名称冲突的方法. c++ 中的命名空间通常用于避免命名冲突.尽管命名空间在最近的 c++ 代码中广泛使用,但大多数较旧代码都不使用此工具. 基于对众多C++项目源码的探索与研究,总结出了在这些项目中使用命名空间的一些常见原因. 1-避免名称冲突 如前所述,这是在C++

  • C++命名空间实例解析

    命名空间是C++非常重要的概念,本文就以实例形式对其进行深入分析,具体内容如下: 通常来说,在C++中,命名空间(namespace)的目的是为了防止名字冲突.每个命名空间是一个作用域,在所有命名空间之外,还存在一个全局命名空间(global namespace),全局命名空间以隐式的方式声明,它并没有名字.在命名空间机制中,原来的全局变量,就是位于全局命名空间中(可以用::member的形式表示). 一.定义命名空间 1.每个命名空间都是一个作用域 和其他作用域类似,在命名空间中的每个名字必须

  • 实例讲解C++ 命名空间

    假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等. 同样的情况也出现在 C++ 应用程序中.例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz().这样,编译器就无法判断您所使用的是哪一个 xyz() 函数. 因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数.类.变量等.使用了命名空间即定

  • 使用SVG基本操作API的实例讲解

    前面的话 本文将详细介绍SVG基本操作API,并使用这些API制作实例效果 基础API 在javascript中,可以使用一些基本的API来对SVG进行操作 [NS地址] 因为SVG定义在其自身的命令空间下,而不是HTML的命名空间下,可以作为单独的XML文件存在.所以需要使用自身的NS地址 有两个常用的NS地址 var SVG_NS = "http://www.w3.org/2000/svg"; var XLINK_NS = http://www.w3.org/1999/xlink;

  • laravel5.4生成验证码的实例讲解

    总结:本篇文章介绍使用gregwar/captcha实现验证码的具体操作步骤,以及可能遇到的问题和解决办法. 操作步骤: 1, 在laravel5.4项目根目录下找到 composer.json 这个文件, 添加 "gregwar/captcha": "1.*" 到composer.json这个文件中,如下图所示. 2. 然后打开命令行,找到项目的根目录,运行composer update, 可以看到这个扩展库已经下载好了, 3.接下来,就可以正常使用验证码了,先测

  • 实例讲解避免javascript冲突的方法

    本文实例讲解了如何避免javascript中冲突的方法,需要的朋友可以了解一下 [1]工程师甲编写功能A var a = 1; var b = 2; alert(a+b);//3 [2]工程师乙添加新功能B var a = 2; var b = 1; alert(a-b);//1 [3]上一步中,工程师乙在不知情的情况下,定义了同名变量a,产生冲突.于是使用匿名函数将脚本包起来,让变量作用域控制在匿名函数之内. //功能A (function(){ var a = 1; var b = 2; a

  • C# WebService创建、发布、调用的实例讲解

    Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web service是一种可以接收从Internet或者Internet上的其它系统中传递过来的请求,轻量级的独立的通讯技术. webservice说明: 假设A是Client端,B是webservice服务端,用户通过http协议向服务器发送soap请求,webservice返回客户端XML格式的数据.

  • Spring编程式和声明式事务实例讲解小结

    Spring事务管理 Spring支持两种方式的事务管理: 编程式事务管理: 通过Transaction Template手动管理事务,实际应用中很少使用, 使用XML配置声明式事务: 推荐使用(代码侵入性最小),实际是通过AOP实现 实现声明式事务的四种方式: 基于 TransactionInterceptor 的声明式事务: Spring 声明式事务的基础,通常也不建议使用这种方式,但是与前面一样,了解这种方式对理解 Spring 声明式事务有很大作用. 基于 TransactionProx

  • 实例讲解C# 泛型(Generic)

    泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候.换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法. 您可以通过数据类型的替代参数编写类或方法的规范.当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型.下面这个简单的实例将有助于您理解这个概念: using System; using System.Collections.Generic; namespace GenericApplication {

  • Java调用R语言实例讲解

    R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R. Rserve作为一个package发布在CRAN上,可以直接使用install.packages("Rserve")进行安装.需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供

  • python ChainMap管理用法实例讲解

    说明 1.ChainMap的主要用例是提供一种有效的方法来管理多个范围或上下文,并处理重复键的访问优先级. 2.当有多个存储重复键的字典访问它们的顺序时,这个功能非常有用. 在ChainMap文档中找到一个经典的例子,它模拟Python如何分析不同命名空间中的变量名称. 当Python搜索名称时,它会依次搜索当地.全局和内置的功能域,直到找到目标名称.Python作用域是将名称映射到对象的字典. 为了模拟Python的内部搜索链,可以使用链映射. 实例 >>> import builti

  • django定期执行任务(实例讲解)

    要在django项目中定期执行任务,比如每天一定的时间点抓取数据,刷新数据库等,可以参考stackoverflow的方法,先编写一个manage.py命令,然后使用crontab来定时执行这个命令. 定制manage.py命令 app可以使用manage.py注册自己的命令,比如要在polls这个app中定制一个closepoll命令,要先向polls文件夹中添加一个management/commands的目录: polls/ __init__.py models.py management/

随机推荐