命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个任务中的所有类声明放在同一个命名空间中。标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构、类和函数等)都被定义在命名空 间std(standard标准)中了。

定义命名空间

有两种形式的命名空间——有名的和无名的。

命名空间的定义格式为:(取自C++标准文档)

named-namespace-definition:

namespace identifier { namespace-body }

unnamed-namespace-definition:

namespace { namespace-body }

namespace-body:

declaration-seqopt
--------------------------------------------------

有名的命名空间:

namespace 命名空间名 {

声明序列可选

}

无名的命名空间:

namespace {

声明序列可选

}

-------------------------------------------------

命名空间的成员,是在命名空间定义中的花括号内声明了名称。可以在命名空间的定义内,定义命名空间
的成员(内部定义)。也可以只在命名空间的定义内声明成员,而在命名空间的定义之外,定义命名空间的成员(外部定义)。

命名空间成员的外部定义的格式为:

命名空间名::成员名 ……

例如:

// out.h

namespace Outer { //
命名空间Outer的定义

int i; // 命名空间Outer的成员i的内部定义

namespace Inner { // 子命名空间Inner的内部定义

void f() { i++; } // 命名空间Inner的成员f()的内部定义,其中的i为Outer::i

int i;

void g() { i++; } // 命名空间Inner的成员g()的内部定义,其中的i为Inner::i

void h(); // 命名空间Inner的成员h()的声明

}

void f(); // 命名空间Outer的成员f()的声明

// namespace Inner2; // 错误,不能声明子命名空间

}

void Outer::f() {i--;} //
命名空间Outer的成员f()的外部定义

void Outer::Inner::h() {i--;} //
命名空间Inner的成员h()的外部定义

// namespace Outer::Inner2 {} //
错误,不能在外部定义子命名空间

注意:

不能在命名空间的定义中声明(另一个嵌套的)子命名空间,只能在命名空间的定义中定义子命名空间。

也不能直接使用“命名空间名::成员名
……”定义方式,为命名空间添加新成员,而必须先在命名空间的定义中添加新成员的声明。另外,命名空间是开放的,即可以随时把新的成员名称加入到已有的命
名空间之中去。方法是,多次声明和 定义同一命名空间,每次添加自己的新成员和名称。例如:

namespace A {

int i;

void f();

} // 现在A有成员i和f()

namespace A {

int j;

void g();

} // 现在A有成员i、f()、j和g()

还可以用多种方法,来组合现有的命名空间,让它们为我所用。例如:

namespace My_lib {

using namespace His_string;

using namespace Her_vector;

using Your_list::List;

void my_f(String &, List
&);

}

……

using namespace My_lib;

……

Vector<String>
vs[5];

List<int>
li[10];

my_f(vs[2], li[5]);

使用命名空间

作用域解析运算符(::)

对命名空间中成员的引用,需要使用命名空间的作用域解析运算符::。例如:

// out1.cpp

#include "out.h"

#include
<iostream>

int main ( ) {

Outer::i = 0;

Outer::f(); // Outer::i = -1;

Outer::Inner::f(); // Outer::i = 0;

Outer::Inner::i = 0;

Outer::Inner::g(); // Inner::i = 1;

Outer::Inner::h(); // Inner::i = 0;

std::cout << "Hello, World!"
<< std::endl;

std::cout << "Outer::i = "
<< Outer::i
<< ", Inner::i = "
<< Outer::Inner::i
<< std::endl;

}using指令(using namespace)

为了省去每次调用Inner成员和标准库的函数和对象时,都要添加Outer::Inner::和
sta::的麻烦,可以使用标准C++的using编译指令来简化对命名空间中的名称的使用。格式为:

using namespace
命名空间名[::命名空间名……];

在这条语句之后,就可以直接使用该命名空间中的标识符,而不必写前面的命名空间定位部分。因为
using指令,使所指定的整个命名空间中的所有成员都直接可用。例如:

// out2.cpp

#include "out.h"

#include
<iostream>

// using namespace Outer; //
编译错误,因为变量i和函数f()有名称冲突

using namespace Outer::Inner;

using namespace std;

int main ( ) {

Outer::i = 0;

Outer::f(); // Outer::i = -1;

f(); // Inner::f(),Outer::i = 0;

i = 0; // Inner::i

g(); // Inner::g(),Inner::i = 1;

h(); // Inner::h(),Inner::i = 0;

cout << "Hello, World!"
<< endl;

cout << "Outer::i = "
<< Outer::i
<< ", Inner::i = "
<< i <<
endl;

}

C++中namespace的使用的更多相关文章

  1. django2中namespace和name的使用

    django2中namespace和name的使用   一.在Django <= 1.11 我们通过关键词namespace参数定义名称空间 1.projects/urls.py   from ...

  2. unity3d中namespace的使用注意问题

    最近在重构游戏中的老一套逻辑,同时要加入新的功能逻辑,因为各种命名问题,就使用namespace进行控制.但是namespace在unity3d引擎中的使用与一般不同,需要注意一点:要作为Compon ...

  3. 关于js中namespace命名空间模式

    命名空间有助于减少程序中所需要的全局变量的数量,并且同时有助于避免命名冲突或过长的名字前缀. 关于命名空间的例子: /** * 创建全局对象MYAPP * @module MYAPP * @title ...

  4. PHP中namespace和use使用详解

    来源于:http://www.jb51.net/article/36389.htm 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种 ...

  5. Linux内核中namespace之PID namespace

    前面看了LInux PCI设备初始化,看得有点晕,就转手整理下之前写的笔记,同时休息一下!!~(@^_^@)~ 这片文章是之前写的,其中参考了某些大牛们的博客!! PID框架的设计 一个框架的设计会考 ...

  6. web.config中namespace的配置(针对页面中引用)

    1,在页面中使用强类型时: @model GZUAboutModel @using Nop.Admin.Models//命名空间(注意以下) 2,可以将命名空间提到web.config配置文件中去,此 ...

  7. 46. Ext中namespace的作用(转)

    转自:https://www.cnblogs.com/givemeanorange/p/5569954.html Ext中在每一个页面中添加一个namespace呢,就像下面的代码: // creat ...

  8. django 中namespace的问题

    在早期的django版本中 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^polls/', include('polls.urls' ...

  9. php5.3中namespace的说明,帮助初次接触namespace的phper快速理解

    命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀,但是方法名变的很长 ...

随机推荐

  1. javascript nonono

    javascript实现的点击元素实现当前轮换展现效果 javascript实现的点击元素实现当前轮换展现效果:本章节分享一段代码实例,它实现了点击元素实现当前展现效果,并且具有比较人性化的变换效果. ...

  2. 复习HTTP状态码+301和302

    一,HTTP状态码: 1xx:(信息状态码),接受的请求正在处理.2xx:(成功状态码),请求正常处理完毕.3xx:(重定向状态码),需要进行附加操作以完成请求.4xx:(客户端错误状态码),服务器无 ...

  3. 树形DP-HDU1561 The more, The Better

    很好的树形DP入门题,看着和选课那道题如出一辙. Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻 ...

  4. Arduino I2C + 数字式环境光传感器BH1750FVI

    BH1750FVI是日本罗姆(ROHM)半导体生产的数字式环境光传感IC.其主要特性有: I2C数字接口,支持速率最大400Kbps 输出量为光照度(Illuminance) 测量范围1~65535 ...

  5. 【转】快速开发移动医疗App!开源框架mHealthDroid

    原文地址:http://www.csdn.net/article/2014-12-12/2823096-mHealhDroid mHealthDroid是一款开源的移动框架,主要用于帮助开发者快速而又 ...

  6. 仓储(Repository)和工作单元模式(UnitOfWork)

    仓储和工作单元模式 仓储模式 为什么要用仓储模式 通常不建议在业务逻辑层直接访问数据库.因为这样可能会导致如下结果: 重复的代码 编程错误的可能性更高 业务数据的弱类型 更难集中处理数据,比如缓存 无 ...

  7. 一、认识Node.js

    1.什么是Note.js? 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个 Javascript 运行环境(runtime).它让 JavaScript 可 ...

  8. 微信H5或PC支付常见问题汇总

    1.H5端调起支付,直接提示[支付失败],打印具体的信息,“<当前URL不存在>” 原因: ①.[支付授权目录不对]---查看微信商户平台的支付授权目录的地址,如果MVC结构的,则只需填写 ...

  9. F题(水题)

    给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少.   例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数为7. ...

  10. 【转】winform回车变为tab

    源地址:http://www.cnblogs.com/wohexiaocai/p/4302200.html