参考:http://www.weixueyuan.net/view/6326.html

总结:

  C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace。

  命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的实体,同样也都能在命名空间内部进行声明或定义,例如变量的声明或定义、函数的声明或定义、typedef等都可以出现在命名空间中。

  指定所使用的变量时使用 域解析操作符 “::” 。也可用 using 声明。

科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地会出现变量或函数的命名冲突,当所有人的代码测试通过,没有问题时,将所有人的代码结合到一起,因为变量或函数重名而导致的问题将会造成一定的混乱,例如:

  1. int flag = 1; //小李声明的变量
  2. // …… //中间间隔若干行代码
  3. bool flag = true; //小韩声明的变量

注意:此例仅为解释命名空间所用,在公司的系统开发中并非如此中所述,完全仅靠命名空间来解决命名冲突的,具体编程规范可以参考林锐的《高质量程序设计指南》一书。

如上所示,因为个人习惯不同,小李喜欢声明int型变量用于逻辑判断,而小韩则更喜欢采用bool类型变量。但两个声明放到同一个函数中的时候,很明显编译器会提示出flag变量重新定义的错误。这种问题若不加以处理是无法编译通过的。

可以使用命名空间解决类似上面的命名冲突问题,例如:

  1. namespace Li{ //小李的变量声明
  2. int flag = 1;
  3. }
  4. namespace Han{ //小韩的变量声明
  5. bool flag = true;
  6. }

小李与小韩各自定义了以自己姓氏为名的命名空间,此时将小李与小韩的flag变量定义再置于同一个函数体中,则不会有任何问题,当然在使用这两个变量的时候需要指明所采用的是哪一个命名空间中的flag变量。

指定所使用的变量时需要用到“::”操作符,“::”操作符是域解析操作符。例如:

  1. Li::flag = 0; //使用小李定义的变量flag
  2. Han::flag = false; //使用小韩定义的变量flag

我们已经定义了两个命名空间 Li 和 Han,并在其中各自声明flag变量,使用的时候则需要分别用域解析操作符指明此时用的flag变量是谁定义出来的flag变量,是小韩还是小李定义的。

除了直接使用域解析操作符,还可以采用using声明(using declaration),例如:

  1. using Li::flag;
  2. flag = 0; //使用小李定义的变量flag
  3. Han::flag = false; //使用小韩定义的变量flag

在代码的开头用using声明了Li::flag,其含义是using声明以后的程序中如果出现未指明的flag时,则使用Li::flag,但是若要使用小韩定义的flag,则仍需要Han::flag。

using声明不仅仅可以针对命名空间中的一个变量,也可以用于声明整个命名空间,例如:

  1. using namespace Li;
  2. flag = 0; //使用小李定义的变量flag
  3. Han::flag = false; //使用小韩定义的变量flag

如果命名空间Li中还定义了其他的变量,则同样具有flag变量的效果,在using声明后,若出现未具体指定命名空间的命名冲突变量,则默认采用Li命名空间中的变量。

命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的实体,同样也都能在命名空间内部进行声明或定义,例如变量的声明或定义、函数的声明或定义、typedef等都可以出现在命名空间中。

下面我们来看一个简单的C++程序的示例:

  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4. cout<<"hello world!"<<endl;
  5. return 0;
  6. }

这是一个简单的C++程序hello world示例,在程序中采用了using声明命名空间std,using namespace std; 这一语句涵盖了std命名空间中的所有标识符,而该命名空间包含C++所有标准库。头文件iostream文件中定义的所有变量、函数等都位于std命名空间中,每次使用iostream中的变量或函数都需要在前面加上std::是非常麻烦的一件事,为此可直接用using声明将std中的所有变量或函数等都声明出来。

如果不用using namespace std;这一语句,则程序应该像下面这样:

  1. #include<iostream>
  2. int main(){
  3. std::cout<<"hello world!"<<std::endl;
  4. return 0;
  5. }

这样看起来是相当麻烦的,如果在某次使用iostream中变量或函数时漏掉std则会导致为定义标识符错误。

C++语言是以C语言为基础的,它继承了所有的C语言函数库,但C++对这些标准库都重新命名了。标准C头文件(如math.h)重命名为cmath,去掉头文件的.h,并在前面加上c。因此在C++中如需使用math.h头文件则可以按照如下方式使用。

  1. #include<cmath>
  2. using namespace std;

1.2 C++命名空间(namespace)的更多相关文章

  1. PHP 命名空间(namespace)

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  2. Atitit  深入理解命名空间namespace  java c# php js

    Atitit  深入理解命名空间namespace  java c# php js 1.1. Namespace还是package1 1.2. import同时解决了令人头疼的include1 1.3 ...

  3. PHP 使用命名空间(namespace),实现自动加载

    示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __co ...

  4. PHP命名空间(Namespace)的使用详解(转)

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  5. PHP命名空间(Namespace)的使用详解

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  6. include与__autoload与命名空间namespace与PSR4详解

    1. include, require, include_once, require_once include和require是PHP中引入源文件最基本的用法,其他例如__autoload, name ...

  7. PHP深入浅出之命名空间(Namespace)的使用详解

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

  8. 第十一节,命名空间namespace

    1,命名空间的定义 命名空间可以把不同的方法分散到不同的文件去实现,如果你会objective-C,他的作用和里面的类目有异曲同工之妙.当然了也有很多不同的地方,首先要明白的是,命名空间并不是一个类, ...

  9. C++笔记008:C++对C的扩展——命名空间 namespace基础

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 第一, 命名空间的意义 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突. 我认识两位叫“A”的朋友,一 ...

  10. PHP的命名空间namespace

    对于命名空间,官方文档已经说得很详细[查看],我在这里做了一下实践和总结. 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只 ...

随机推荐

  1. POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解

    题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做.A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h ...

  2. CodeCombat多人游戏Greed

    题目的意思在于,更高效的Collect Gold:然后合理的安排生产出来的士兵: // This code runs once per frame. Build units and command p ...

  3. 对某项目中Vuex用法的分析

    上周五刚发布一个线上版本,趁着新的需求和bug还没到来,决定分析一下正在维护的一个使用Vue 2.0 开发的后台管理系统中Vuex部分代码.这部分代码不是我写的,加上我一直在“使用”现成的而不是“搭建 ...

  4. js精度问题

    JavaScript数字精度丢失问题总结 现象 原因 计算机的二进制实现和位数限制有些数无法有限表示.就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等.JS 遵 ...

  5. IIS中添加ftp站点

    1.创建Windows账号 右击点击“我的电脑”,选择“管理”打开服务器管理的控制台.展开“服务器管理器”,一路展开“配置”.“本地用户和组”,点“用户”项.然后在右边空白处点右键,选择“新用户”将打 ...

  6. BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这 ...

  7. Java中的this

    首先this作为关键字其实是随着对象的创建而产生的,当我们调用对象的一个方法的时候: 例如: A a = new A(); a.f(1)  其实我们可以理解为a.f(a,1) 编译器默默的把所操作的对 ...

  8. Linux——用户管理简单学习笔记(四)

    主要讲两个用户管理的案例: 1: 限制用户su为root,只允许某个组的的用户su # groupadd sugroup 首先添加我们的用户组 # chmod 4550 /bin/su 改变命令的权限 ...

  9. hdu 1370 || poj 1006 简单的中国剩余定理或者暴力

    Biorhythms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Probl ...

  10. 02_DllZZ.def

    ZC: 在VC6里面,只要有这个文件就可以了.但是到了 VS2010,需要手动的指定使用这个文件才行:VS2010-->项目-->属性--> 来到窗口"??? 属性页&qu ...