C++进阶——关于namespace

原创 2016年05月30日 22:38:28

  namespace一般理解为命名空间或者名字空间,在C++程序中,一个作用域里同一个变量只允许有一个定义,但是随着程序规模的扩大,变量越来越多,尤其在不同程序员的代码组合或者相互调用时很容易出现非局部变量的命名冲突,导致变量重定义错误。
  引入命名空间namespace,将全局作用域进行逻辑上的细化,将变量、函数等聚集到一个名字空间这样一个逻辑作用域下,很好地解决了命名冲突的问题。  
声明命名空间的语法如下:

namespace identifier
{
  named_entities
}

其中identifier是任何有效的标识符,named_entities是一组包含在命名空间中的变量,类型和函数。 例如:

namespace myNamespace
{
  int a, b;
}

在这个例子中,a和b是声明在命名空间myNameSpace下的两个变量。
命名空间内的变量在内部可直接访问,但在命名空间外部访问时则需要使用到操作符::,如上述例子中变量a、b在外部的访问方式为:

myNamespace::a
myNamespace::b

命名空间可以很好的解决命名冲突的问题,例如下面这段代码:

// namespaces
#include <iostream>
using namespace std;

namespace foo
{
  int value() { return 5; }
}

namespace bar
{
  const double pi = 3.1416;
  double value() { return 2*pi; }
}

int main () {
  cout << foo::value() << '\n';
  cout << bar::value() << '\n';
  cout << bar::pi << '\n';
  return 0;
}

运行结果为:
5
6.2832
3.1416
代码中声明了两个命名空间foo和bar,其中在另个命名空间下都定义了一个同名的函数value(),但是由于在不同的命名空间下,并没有发生冲突,通过foo::value() 和 bar::value()调用返回各自的结果,同时通过bar::pi在命名空间外部访问了内部变量的值。

命名空间是可以拆分的,这使得项目中可以在不同的文件或代码段中对同一个namespace的内容进行添加,如下面这段代码:

namespace foo { 
    int a; 
    int c;
}

namespace bar { int b; }

也可以写成:

namespace foo { int a; }
namespace bar { int b; }
namespace foo { int c; }

  在上面的示例代码中以及我们平时写C++代码时都用到了这样一句代码:

using namespace std;

std是一个标准库名字空间,它包含了C++所有的基本变量,类型,常量和功能等,但是我们平时写C++代码时并有用std::cin等类似的来写,这是因为我们通过using关键字将std引入到了当前作用域,这样我们在写代码时可以直接访问而不再需要通过操作符::,如果我们平时写代码是没有加入using namespace std,则也需要使用std::cin,std::cout这样的格式,否则会提示错误cin、cout未定义,相信很多人初学C++的时候就遇到过。
下面这段代码比较全面的展示了using namespace的效果:

// using
#include <iostream>
using namespace std;

namespace first
{
  int x = 5;
  int y = 10;
}

namespace second
{
  double x = 3.1416;
  double y = 2.7183;
}

int main () {
  using first::x;
  using second::y;
  cout << x << '\n';
  cout << y << '\n';
  cout << first::y << '\n';
  cout << second::x << '\n';
  return 0;
}

运行结果是:
5
2.7183
10
3.1416
具体分析不再赘述。
虽然通过using关键字的引入,可以简化代码中::操作访问,但是这样当引入多个名字空间时,就可能出现不同名字空间内命名冲突的问题,所以,实际编码过程中要谨慎使用using关键字引入不同的命名空间。

更多内容及本文参考:
http://www.cplusplus.com/doc/tutorial/namespaces/

版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

C++进阶学习——单向链表的实现

示例代码如下:#include using namespace std; class Node //节点类 { public: //普通构造函数:无参数,带1个参数,带2个参数 Node(){...

C++进阶学习——单例模式的实现

单例模式也称为单件模式、单子模式,是使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。单例模式通过类本身来管理其唯一实例,这种特性提供了...

C++进阶——初始化列表

这段时间在研究老师上课讲授的Linux程序设计代码,在老师提供的库函数中出现了初始化列表,忘记了先前学习的C++课程知识,所以决定重新学习C++厨师化列表。 C++初始化列表是用来对成员变量进行初始化...

C++进阶学习——线程基类的设计(Linux)

此示例是在Linux环境下(使用Linux系统编程线程相关函数)测试,文件说明如下:ThreadBase.cpp, ThreadBase.h为线程基类ThreadDerive.cpp, ThreadD...

必须要注意的 C++ 动态内存资源管理(四)——智能指针进阶

十一.智能指针的扩展         在前面一节,我们简单介绍了标准库给我们提供的三种智能指针的使用方法。然而在实际使用过程中有的资源的创建和释放并不是简单的new 和 delete。        ...

C++数组进阶——一维数组的应用及起泡法思路

C++复习——数组 一、         相关概念 1、  具有相同属性有内在联系的一批数据看作一个有机的整体,称为数组。 2、  数组中用序号或下表来区分各个数据,用来表示该数据在数中的序号,...

C++-命名空间namespace

  • 2012年02月23日 15:55
  • 61KB
  • 下载

C++中的名空间(namespace)探讨

  • 2010年12月13日 22:55
  • 17KB
  • 下载

别再让C++头文件中出现“using namespace xxx;”

在这里,我毫不回避地说了这句话:  引用 我再也不想在任何头文件中看到“using namespace xxx;”了 作为一个开发者/团队领导者,我经常会去招聘新的项目成员,有时候也...
  • dj0379
  • dj0379
  • 2013年09月11日 15:12
  • 11582
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++进阶——关于namespace
举报原因:
原因补充:

(最多只允许输入30个字)