`
congfeng02
  • 浏览: 195279 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

在名字空间中声明类和成员函数

F# 
阅读更多

在名字空间中声明类和成员函数
赵湘宁

虽然很多程序员都熟悉名字空间的概念,但他们常常都是被动地使用名字空间。也就是说他们使用的是第三方定义的成员(如标准库的类和函数),而不是在名字空间中声明自己的类和函数。本文拟讨论如何在名字空间中声明自己的类和函数,以及如何在程序中使用它们。

名字空间是一个范畴,它包含类声明,函数声明,常量声明和模板声明等名字空间成员。例如:

namespace proj_alpha
{
//下面是名字空间 proj_alpha 的成员
class Spy {/*..*/};
void encrypt (char *msg);
const int MAX_SPIES = 8;
}

在上面的例子中,类Spy在一个单独的文件中实现。通常,你是在一个专门的头文件中声明一个类并在不同的源文件中独立地定义其成员函数。那么如何将名字空间成员类分离成多个源文件呢?

下面是名为 Foo.hpp 的头文件,其中定义了一个名为NS的名字空间,它包含类Foo的声明:

//Foo.hpp
namespace NS
{
class Foo
{
public:
void f();
void g();
};
}//close NS

另外,在一个单独的源文件Foo.cpp中,首先包含头文件Foo.hpp以便实现类Foo的成员函数f()和g():

//Foo.cpp
#include "Foo.hpp"
void NS::Foo::f()
{ /*..*/ }

void NS::Foo::g()
{ /*..*/ }

为了使用名字空间成员,必须使用成员的全路径名,它由名字空间后跟::合成原名组成。因此,类Foo的全路径名是NS::Foo。这样编译器便可以知道NS是一个名字空间名,头文件Foo.hpp必须在引用NS之前被包含。

名字空间是可以扩展的。也就是说可以声明类,而且所声明的类在其它的.cpp文件中是相同的名字空间成员:

//Bar.hpp
namespace NS //扩展 NS
{
class Bar
{
public:
void a();
void b();
};
}

在Bar.cpp文件中:

#include "Bar.hpp"
void NS::Bar::a()
{/*..*/}

void NS::Bar::b()
{/*..*/}

可以看出,虽然Foo和Bar这两个类在不同的头文件中声明,但它们都是名字空间NS的成员。并且编译器和链接器将这两个类看成是同一名字空间的成员。那么,如何在应用程序中使用这些类呢?

在文件main.cpp中,必须要包含声明类Foo和Bar的头文件并加上相应的名字空间引用声明-using:

#include "Bar.hpp"
#include "Foo.hpp"
int main()
{
using NS::Bar; //使用名字空间
using NS::Foo; //同上
Bar b;
Foo f;
f.f();
//...
}

using声明由关键字using后跟名字空间成员的全路径。这样就使你在using声明范围内使用成员时不用再加路径。上面的例子中,可以直接使用Foo和Bar,因为在main()的开始使用了using声明。如果没有using声明就必须使用全路径成员名。

int main()
{
NS::Bar b; //全路径名
NS::Foo f; //同上
//?
}

另外,还有一种引用名字空间成员的方法是使用using指令:

#include "Bar.hpp"
#include "Foo.hpp"
int main()
{
using namespace NS; // using 指令
Bar b;
Foo f;
f.f();
//...
}

using指令由关键字“using namespace”后跟名字空间名构成。在访问名字空间成员时它是使用最少的一种方法,原因是这种方法将所有名字空间成员注入当前的范围,从而增加了潜在的名字冲突。
分享到:
评论

相关推荐

    在名字空间中声明类和成员函数定义.pdf

    在名字空间中声明类和成员函数定义.pdf

    C++ Primer第四版【中文高清扫描版】.pdf

    15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 500 15.6 纯虚函数 502 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    8.2.2 声明类类型 8.2.3 定义对象的方法 8.2.4 类和结构体类型的异同 8.3 类的成员函数 8.3.1 成员函数的性质 8.3.2 在类外定义成员函数 8.3.3 inline成员函数 8.3.4 成员函数的存储方式 8.4 对象成员的引用 8.4.1 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    6.11 在构造函数中使用默认参数 6.12 使用析构函数 6.13 何时调用构造函数与析构函数 6.14 使用数据成员和成员函数 6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过默认的成员复制进行赋值 6.17 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    8.2.2 声明类类型 8.2.3 定义对象的方法 8.2.4 类和结构体类型的异同 8.3 类的成员函数 8.3.1 成员函数的性质 8.3.2 在类外定义成员函数 8.3.3 inline成员函数 8.3.4 成员函数的存储方式 8.4 对象成员的引用 8.4.1 ...

    详解C++ 前置声明

    如果类包含在名字空间中,需在名字空间内做前置声明:namespace tlanyan {class Foo;};,而不能这样:class tlanyan::Foo;。 前置声明作用 根据其用途,前置声明的主要作用为: 避免重复定义变量; 避免引入函数...

    PHP 面向对象技术(全面讲解).txt

    去声明类,而且在你的项目里只用对象和类。这个概念我先不多说了,因为有很多朋友远离面向对 象编程的主要原因就是一接触面向对象概念的时候就理解不上去, 所以就不想去学下去了。等读 者看完整篇内容后再去把概念...

    google C++ 风格指南 - 中文版

    2.3. 非成员函数, 静态成员函数, 和全局函数 2.4. 局部变量 2.5. 静态和全局变量 译者 (YuleFox) 笔记 3. 类 3.1. 构造函数的职责 3.2. 默认构造函数 3.3. 显式构造函数 3.4. 拷贝构造函数 3.5. 结构体 VS. ...

    Effective.C++.中文第二版.50条款doc文档.chm

    条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同 条款14: 确定基类有虚析构函数 条款15: 让operator=返回*this的引用 条款16: 在operator=中对所有数据成员赋值 条款17: 在operator=中检查给自己赋值...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     13.6.3 右值引用和成员函数 481  小结 486  术语表 486  第14章 操作重载与类型转换 489  14.1 基本概念 490  14.2 输入和输出运算符 494  14.2.1 重载输出运算符  14.2.2 重载输入运算符>> 495  14.3 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     13.6.3 右值引用和成员函数 481  小结 486  术语表 486  第14章 操作重载与类型转换 489  14.1 基本概念 490  14.2 输入和输出运算符 494  14.2.1 重载输出运算符  14.2.2 重载输入运算符>> 495  14.3 ...

    -C++参考大全(第四版) (2010 年度畅销榜

    第23章 名字空间、转换函数和其他高级主题 23.1 名字空间 23.2 std名字空间 23.3 创建转换函数 23.4 const成员函数与mutable 23.5 volatile成员函数 23.6 explicit构造函数 23.7 成员初始化语法 23.8 利用关键字asm ...

    C++大学教程,一本适合初学者的入门教材(part2)

    6.11 在构造函数中使用默认参数 6.12 使用析构函数 6.13 何时调用构造函数与析构函数 6.14 使用数据成员和成员函数 6.15 微妙的陷阱:返回对Private数据成员的引用 6.16 通过默认的成员复制进行赋值 6.17 ...

    C++高级参考手册 完全自学 内容详细 讲解通俗易懂

    7.4.3 const对象和成员函数 7.4.4 只读存储能力 7.5 可变的(volatile) 7.6 小结 7.7 练习 第8章 内联函数 8.1 预处理器的缺陷 8.2 内联函数 8.2.1 类内部的内联函数 8.2.2 存取函数 8.3 内联函数和编译器 ...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    6.2.1 定义类和成员函数 163 6.2.2 封装 168 6.2.3 公有和私有成员 168 6.2.4 取值和赋值函数 171 6.2.5 结构和类 174 第7章 构造函数及其他工具 179 7.1 构造函数 179 7.1.1 构造函数的定义 179 7.1.2 ...

    Web程序设计复习题.doc

    在类中可以重载构造函数,C#会根据参数匹配原则来选择执行合适的构造函数 5. 下面关于构造函数和析构函数的说法,不正确的是( ) A.构造函数和析构函数都不能有返回值 B.可以定义静态的构造函数 C.一个类可以有...

    Effective C++

    条款13:初始化列表中成员列出顺序和它们在类中的声明顺序相同 条款14:确定基类有虚析构函数 条款15:让OPERATOR=返回*THIS的引用 条款16:在OPERATOR=中对所有数据成员赋值 条款17:在OPERATOR=中检查给自已赋值的情况 ...

    免费下载:c++编程思想(中文)

    7.4.3 const对象和成员函数 136 7.4.4 只读存储能力 139 7.5 可变的(volatile) 140 7.6 小结 141 7.7 练习 141 第8章 内联函数 142 8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 ...

    C++编程思想(中文)

    7.4.3 const对象和成员函数 136 7.4.4 只读存储能力 139 7.5 可变的(volatile) 140 7.6 小结 141 7.7 练习 141 第8章 内联函数 142 8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 ...

Global site tag (gtag.js) - Google Analytics