看过鸡啄米的C++编程入门系列教程的朋友,应该能注意到,在其中的很多实例中,都有这么一条语句:using namespace std;,即使用命名空间std,其作用就是规定该文件中使用的标准库函数都是在标准命名空间std中定义的。本文就详细讲解命名空间的意义和用法。

命名空间的意义

为什么需要将函数定义在命名空间中呢?这其实是为了避免变量或函数重命名的问题。试想,一个项目组内多个工程师进行开发,有可能会出现全局变量或函数重名的现象,而如果每个人都定义了自己的命名空间,就可以解决这个问题,即使重名,只要分属不同的命名空间就不会引起问题。

这样大家应该明白了,命名空间就是将多个变量和函数等包含在内,使其不会与命名空间外的任何变量和函数等发生重命名的冲突。

命名空间实例

下面鸡啄米给出一个使用命名空间的实例。实例中有两个命名空间JiZhuoMi和Software,他们中都有一个名为szUrl的字符串,我们试着访问并输出这两个字符串。

C++代码
  1. #include <iostream>
  2. using namespace std;
  3. // 命名空间JiZhuoMi
  4. namespace JiZhuoMi
  5. {
  6. char *szUrl = "www.jizhuomi.com";
  7. }
  8. // 命名空间Software
  9. namespace Software
  10. {
  11. char *szUrl = "www.jizhuomi.com/software/";
  12. }
  13. int _tmain(int argc, _TCHAR* argv[])
  14. {
  15. cout << JiZhuoMi::szUrl << endl;  // 输出命名空间JiZhuoMi中的字符串
  16. cout << Software::szUrl << endl;  // 输出命名空间Software中的字符串
  17. return 0;
  18. }

此实例运行结果如下图:

我们看到,使用“命名空间::标识符名称”的方式就可以访问命名空间中的变量或函数了,而且即使是重复命名也可以正确访问。

  using namespace *;的意义

在上面的实例中,我们访问命名空间JiZhuoMi和Software中的字符串变量时,都需要在前面加上“命名空间::”,但cout定义在命名空间std中,前面却不需要加“std::”,这是因为上面这样一条语句“using namespace std;”。

using namespace *;(这里的*表示可以是任何命名空间)的作用是释放命名空间*中的变量或函数等,使之在被访问时可以不必加“命名空间::”,访问方法与一般的变量或函数无异,就像上面的cout一样。

using namespace *;会给我们书写程序带来方便,但也要慎用,如果释放了多个命名空间中的东西后,它们又可能会引起命名冲突。鸡啄米给大家演示下同时释放JiZhuoMi和Software命名空间的情况。

C++代码
  1. #include <iostream>
  2. using namespace std;
  3. // 命名空间JiZhuoMi
  4. namespace JiZhuoMi
  5. {
  6. char *szUrl = "www.jizhuomi.com";
  7. }
  8. // 命名空间Software
  9. namespace Software
  10. {
  11. char *szUrl = "www.jizhuomi.com/software/";
  12. }
  13. // 释放命名空间JiZhuoMi和Software
  14. using namespace JiZhuoMi;
  15. using namespace Software;
  16. int _tmain(int argc, _TCHAR* argv[])
  17. {
  18. cout << szUrl << endl;    // 这里会提示编译错误
  19. return 0;
  20. }

上例中,编译器会提示编译错误,因为它不知道该访问哪个命名空间中的字符串变量szUrl。这时要想正确访问,还需在szUrl前面加上命名空间修饰。

而如果main函数中又定义了一个局部变量szUrl呢?

C++代码
  1. #include <iostream>
  2. using namespace std;
  3. // 命名空间JiZhuoMi
  4. namespace JiZhuoMi
  5. {
  6. char *szUrl = "www.jizhuomi.com";
  7. }
  8. // 命名空间Software
  9. namespace Software
  10. {
  11. char *szUrl = "www.jizhuomi.com/software/";
  12. }
  13. // 释放命名空间JiZhuoMi和Software
  14. using namespace JiZhuoMi;
  15. using namespace Software;
  16. int _tmain(int argc, _TCHAR* argv[])
  17. {
  18. char *szUrl = "url";
  19. cout << szUrl << endl;
  20. return 0;
  21. }

运行后我们发现,szUrl访问正确,可见,这种情况下,编译器优先访问局部变量。

详解C++中命名空间的意义和用法的更多相关文章

  1. 详解Python中的循环语句的用法

    一.简介 Python的条件和循环语句,决定了程序的控制流程,体现结构的多样性.须重要理解,if.while.for以及与它们相搭配的 else. elif.break.continue和pass语句 ...

  2. 详解Python中的join()函数的用法

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下:     join():    连接字符串数组.将字符串.元组.列表中的元素以指定的 ...

  3. 详解Django中Request对象的相关用法

    原文链接:http://www.jb51.net/article/69624.htm 1.从Request对象中获取数据 我们在第三章讲述View的函数时已经介绍过HttpRequest对象了,但当时 ...

  4. 【转】详解C#中的反射

    原帖链接点这里:详解C#中的反射   反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...

  5. 深入详解SQL中的Null

    深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...

  6. 详解Java中的clone方法

    详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...

  7. 详解JavaScript中的原型

    前言 原型.原型链应该是被大多数前端er说烂的词,但是应该还有很多人不能完整的解释这两个内容,当然也包括我自己. 最早一篇原型链文章写于2019年07月,那个时候也是费了老大劲才理解到了七八成,到现在 ...

  8. 详解C++中的多态和虚函数

    一.将子类赋值给父类 在C++中经常会出现数据类型的转换,比如 int-float等,这种转换的前提是编译器知道如何对数据进行取舍.类其实也是一种数据类型,也可以发生数据转换,但是这种转换只有在 子类 ...

  9. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

随机推荐

  1. sama5d3 环境检测 gpio--yx测试

    说明: yx0--pioA0 yx1--pioA2  yx2--pioA4  yx3--pioA10  yx4--pioA14  yx5--pioA16 yx6--pioA12 yx7--pioA20 ...

  2. 翻译:Laravel-4-Generators 使用自己定义代码生成工具高速进行Laravel开发

    使用自己定义代码生成工具高速进行Laravel开发 这个Laravle包提供了一种代码生成器,使得你能够加速你的开发进程.这些生成器包含: generate:model – 模型生成器 generat ...

  3. selenuim爬虫实战(日lofter.com)

    LOFTER是网易公司2011年8月下旬推出的一款轻博客产品. LOFTER专注于为用户提供简约.易用.有品质.重原创的博客工具.原创社区,以及有品质的手机博客应用. LOFTER首次采用独立域名,口 ...

  4. ASP.NET MVC4 异常拦截

    ASP.NET MVC4 程序发生异常时,通过拦截Action的异常,重写ActionFilterAttribute 的方法OnActionExecuted实现. 具体实现代码如下: /// < ...

  5. Servlet中Request的getAttribute getParameter 区别

    1.从更深的层次考虑,request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据. request.getParameter()方法返回Str ...

  6. 如果可能的话,使用 PC-Lint、LogiScope 等工具进行代码审查

    如果可能的话,使用 PC-Lint.LogiScope 等工具进行代码审查. #include <iostream> #include <algorithm> #include ...

  7. Unity四元数和旋转

    四元数介绍 旋转,应该是三种坐标变换——缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和欧拉旋转. ...

  8. [ACM] FZU 2086 餐厅点餐 (枚举)

    roblem Description Jack近期喜欢到学校餐厅吃饭.好吃干净还廉价. 在学校餐厅.有a种汤,b种饭.c种面条,d种荤菜,e种素菜. 为了保证膳食搭配,Jack每顿饭都会点1~2样荤菜 ...

  9. Nucleus PLUS的启动、执行线程和中断处理

    nucleus系统是实时嵌入式操作系统,具有实时.任务抢先.多任务内核,当中95%的代码由C语言写成,极易移植.开放的源代码使得配置和裁剪方便,再加上体积小(所有二进制映像可仅20K).响应高速等特性 ...

  10. MySQL单列索引和组合索引的选择效率与explain分析

    一.先阐述下单列索引和组合索引的概念: 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引. 组合索引:即一个索包含多个列. 如果我们的查询where条件只有一个,我们完全可 ...