关闭

C++进阶——关于namespace

标签: C++namespace编程
119人阅读 评论(0) 收藏 举报
分类:

  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/

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1432次
    • 积分:52
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档