转载C++namespaces使用

原地址:http://blog.sina.com.cn/s/blog_986c99d601010hiv.html

命名空间(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;

}

更多相关文章
  • python中eval, exec, execfile,和compile [转载]eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果.同样地, exec语句将字符串str当成有效Python代码来执行.提供给exec的代码 ...
  • 转载MVCArea区域相关技术
    创建Area 右键工程选择 添加->区域,弹出如下填写Area的对话框: 点击添加后,工程目录结构如下: 和创建一个空MVC工程结构类似,Admin Area 有自己的 Controllers.Models 和 Views 文件夹,不一样的地方就是多了一个 AdminAreaRegistrat ...
  •  Log4j 基本使用方法 Log4j 由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式 .日志信息的优先级从高到低有 ERROR . WARN . INFO . DEBUG ,分别用来指定这条日志信息的重要程度:日志信息的输出目的地指定了日志将打印到控制台还是文件中 ...
  • IT建设的4化(转载)在一个公司准备建立IT系统的时候,应该要注意4个标准:流程化.标准化.简化.优化.我简单的称为建设IT系统的4化.详细内容见以下网址:[url]http://sagman.blog.51cto.com/40683/56990[/url]
  • (转载)JVM实现synchronized的底层机制
    目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理. 数据同步需要依赖锁,那锁的同步又依赖谁?synchronize ...
  • Linux系统下防DDOS攻击的方法[转载]Posted on:系统维护,2008年3月24日 Tag:| 2 Comments »[url]http://bbs.92bbs.net/read-tid-31313.html[/url][url]http://bbs.92bbs.net/read-ti ...
  • 转载:学习EntityFramework中的CodeFirst
    看完觉得不错,适合作为学习资料,就转载过来了 原文链接:http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html 这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家. 最近在对M ...
  •    本文转载自张宴的博客:http://blog.s135.com/post/288/ webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便.  1.适用系统:Linux  2.编译安装: 引用 wget http:/ ...
一周排行
  • XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证
    1.申请许可证Citrix XenApp_XenDesktop7.6和XenServer ...
  • SQL2005指定默认数据库的存放路径
    如何修改sql server 2005默认数据库路径,想指定数据库路径.sql2000可以 ...
  • iOS实现图像素描效果
    使用GPUImageSketchFilter对象实现图像素描效果 NSString *co ...
  •  在php中,我们可以通过date函数来获取系统当前时间,date函数的参数已经够丰富了,其中包括自定义时期显示格式和获取相应时区的功能.但是强大的功能没法自定时区来输出.举个例子,在locale = ZH_CN的操 ...
  • 说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装.卸载和删除的方法.一.Ubuntu中软件安 ...
  • 在 UNIX® 环境中,文件无处不在,这便产生了一句格言:"任何事物都是文件".通过文件不仅仅可以访问常规数据,通常还可以访问网络连接和硬件.在有些情况下,当您使用 ls 请求目录清单时,将出现相 ...
  • 1.数据库的创建.修改.删除创建:CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification]:例如:CREATE DATABAS ...
  • Windowsphone应用开发1-TextToSpeech
    最近几个月一直在专注Windows phone产品设计和项目开发.在其中团队磨合和产品定位 ...
  • 搞Asp.net的朋友,难免会有需要发送一些http请求,网页数据抓取的时候! 有一些安全性相对做得比较好点的站点,某些东西做得相对比较"安全"!! 对于做WINDOWS平台下开发的朋友来说,了解 ...
  • Description 如今请求你维护一个数列,要求提供下面两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法 ...