命名空间(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. 2.Books

    Books示例说明了Qt中SQL类如何被Model/View框架使用,使用数据库中存储的信息,创建丰富的用户界面. 首先介绍使用SQL我们需要了解的类: 1.QSqlDatabase: QSqlDat ...

  2. zigbee之MAC地址发送

    TI cc2530在出厂时候每一个芯片都固化了一个唯一的8个字节的地址,MAC或者IEEE地址. 协调器模块的MAC地址为:0x00124B000716550F(注意自己的是多少!!) 终端的MAC地 ...

  3. A. Xor-tree

    题目意思: 给一颗n个节点的树,每个节点有一个值要么是0要么是1,改变某个节点的值时,它的儿子不变,它儿子的儿子翻转,它儿子的儿子的儿子不变,如此类推.给定各个节点的目标值,求最少的翻转次数,使得达到 ...

  4. Android onKeyDown、onKeyUp、dispatchKeyEvent的区别

    1. onKeyDown.onKeyUp.dispatchKeyEvent的区别和使用场景 区别: 1.1 onKeyDown.onKeyUp是按键事件的回调接口(冒泡式调用),dispatchKey ...

  5. 数据库去重与join连表

    join连表删除的效率与检测存在之后删除的效率比,后者的效率低了很多

  6. 【学习】CodeUi

    关于这个,博客园里有很多初级的教程,我是看这篇: http://www.cnblogs.com/luminji/archive/2010/11/18/1880452.html 初学的可以跟着这个做一边 ...

  7. screen工具

    1.背景 系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份.ftp 传输等等.通常情况下我们都是为每一个这样的任务开一个远 ...

  8. Win7下:编译器错误信息: CS0016

    解决办法: 原因是由于系统目录下的Temp目录无相应的权限所致,具体操作如下: 来到C:/Windows目录,修改temp文件夹的属性. 在安全页设置IIS-IUSRS的权限,赋予修改.读取.写入等权 ...

  9. SqlServer给一个表增加多个字段语法

    添加字段语法 alter table table_name add column_name +字段类型+ 约束条件 给一个表增加多个字段: use NatureData go alter table ...

  10. kafka启动报错Cannot allocate memory;There is insufficient memory for the Java Runtime Environment to continue.

    kafka启动过程报错,配置没有问题,这就懵了!! Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000 ...