命名空间(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. OpenCV2.3.0在VS中的配置

    本文为cherish总结,这里先收藏着了啦啦啦!!! vs中配置时尽量在全局配置中修改,否则每次新建项目都需要重新配置全局配置步骤如下:1.“视图”菜单 -> (其他窗口->)属性管理器 ...

  2. 关于在jeecms中css,图片,html,模板是如何组装成——part1

    先从HTML入手:index.html <!DOCTYPE HTML> <html> <meta name="viewport" content=&q ...

  3. java jeesite.properties配置文件属性提取

    package com.thinkgem.jeesite.common.config; import java.io.UnsupportedEncodingException; import java ...

  4. C#7.0连接MySQL8.0数据库的小笔记

    1.要连接MySql数据库必须首先下载MySql官方的连接.net的文件,文件下载地址为https://dev.mysql.com/downloads/connector/net/6.6.html#d ...

  5. Task ContinueWith

    前正无生意,且记Task.ContinueWith之用法. using System; using System.Collections.Generic; using System.Diagnosti ...

  6. HashMap数据结构的C++实现

    Hash表在计算机的应用编程中是一种很常用的数据结构,很多算法的实现都离不开它.虽然C++11标准模板库中的有hashmap类型的实现,但在工程实践中,若项目本身使用的是较低版本的C++,或是出于性能 ...

  7. NFS4 挂载同主机多个目录

    写在前面的话 事情是酱婶儿的,前两天实在是帮他们查日志查的心里交瘁了,而且有些时候下班了,也就不想再接到这样的需求,于是想基于 Nginx 做一个文件下载中心,在这个文件下载中心里面存有各个服务的日志 ...

  8. 《C#多线程编程实战》2.3 Mutex

    这个真的是大坑. 如果深入研究,像是同步域,上下文这类都会出现. 但是书上有没有讲. 完全不知道什么意思. 勉勉强强讲这个Mutex的用法搞明白了. 这个是原书代码: class Program { ...

  9. Logic Controller(逻辑控制器)

    逻辑控制器主要用来控制采样器的执行顺序,仅对其子节点的逻辑控制器和采样器其作用. 1.Simple Controller(简单控制器) 简单控制器主要用来组织其他逻辑控制器和采样器,提供了一个块的结构 ...

  10. Java面向对象之关键字this 入门实例

    一.基础概念 1.关键字this是指:哪个对象调用this所在的函数.this就指向当前这个对象. 2.用法: (1).this关键字可以解决:构造函数私有化问题. 注意:构造函数只能被构造函数调用, ...