看过鸡啄米的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. 示例 - C#脚本代码采集搜狐NBA球员, 球队和比赛实况

    最近 @甜瓜 (QQ:1069629945) 开发了一套NBA数据采集脚本, 我觉得很赞. 经他允许发布出来和大家分享一些经验: 球员球队: http://data.sports.sohu.com/n ...

  2. Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。

    Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试. 它是一个典型的教科书式的mvc ...

  3. 图像处理之二维码生成-qr

    Javascript生成二维码(QR)   网络上已经有非常多的二维码编码和解码工具和代码,很多都是服务器端的,也就是说需要一台服务器才能提供二维码的生成.本着对服务器性能的考虑,这种小事情都让服务器 ...

  4. E-R图到数据库表

    数据库E-R图相关 日 17:39 E-R数据模型所採用的三个主要概念是:实体集.联系集和属性 实体集:具有同样类型及同样性质(或属性)的实体集合 属性:简单属性和符合属性:单值属性和多值属性:nul ...

  5. RAID的简单说明

    RAID,为 Redundant Arrays of Independent Disks 的简称,中文为廉价※冗余磁盘阵列 . 磁盘阵列 其实也分为软阵列 (Software Raid) 和硬阵列 ( ...

  6. odoo 在原有工作流中添加审批流

    odoo 在原有工作流中添加审批流 步骤: 1.加入所需的工作流节点以及相连的线(即所添加的审批流),代码如下: <?xml version="1.0" encoding=& ...

  7. hdu 4722(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 思路:简单的记忆化搜索,留意一下A==0时的情况就可以了. #include<iostre ...

  8. Ubuntu 16.04 LTS nodejs+pm2+nginx+git 基础安装及配置环境(未完,未整理)

    -.Ubuntu 安装nodejs 以下内容均在命令行,完成,首先你要去你电脑的home目录:cd ~. [sudo] apt-get update [sudo] apt-get upgrade ap ...

  9. js(jQuery)相关随笔

    //获取所有name='id'.被选择的的多选框var idArr = $("input[type='checkbox'][name='id']:checked");//将这些多选 ...

  10. 那个你经常用的abs函数(取绝对值)真的总是返回非负数吗?

    前几天在牛客网看到一道关于abs()函数返回值的题目,见下图,当时还没反应过来,第一反应是:自从我开始学C语言,就知道它是用来求int数的绝对值的,返回值当然是0或者正数啊,一看答案就是A. 后来思来 ...