在名字空间中声明类和成员函数
2005-11-14 12:27
274 查看
在名字空间中声明类和成员函数 |
出自:赵湘宁 2002年11月16日 11:55 |
虽然很多程序员都熟悉名字空间的概念,但他们常常都是被动地使用名字空间。也就是说他们使用的是第三方定义的成员(如标准库的类和函数),而不是在名字空间中声明自己的类和函数。本文拟讨论如何在名字空间中声明自己的类和函数,以及如何在程序中使用它们。 名字空间是一个范畴,它包含类声明,函数声明,常量声明和模板声明等名字空间成员。例如: 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”后跟名字空间名构成。在访问名字空间成员时它是使用最少的一种方法,原因是这种方法将所有名字空间成员注入当前的范围,从而增加了潜在的名字冲突。 |
相关文章推荐
- 在名字空间中声明类和成员函数
- 在名字空间中声明类和成员函数(1)
- C++在命名空间中声明类和成员函数
- C++在命名空间中声明类和成员函数
- C++在命名空间中声明类和成员函数
- c++ 静态类成员函数(static member function) vs 名字空间 (namespace)
- 在名字空间中声明类和成员函数
- 名字空间示例
- Dom4j解析含前缀与名字空间的XML
- Jabberd/XMPP 学习之五:常用名字空间
- Qt中Ui名字空间以及setupUi函数的原理和实现
- 用结构体来构造封闭的名字空间
- c++名字空间指令与名字空间声明
- iOS: 学习笔记, Swift名字空间
- C++程序设计语言读书笔记-C8 - 名字空间和异常
- c++基础知识---名字空间
- 【转】Qt中Ui名字空间以及setupUi函数的原理和实现
- Atlas之旅:快速入门之名字空间
- Windows外壳名字空间的浏览
- 名字空间在XML中的应用(原创)