博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++在命名空间中声明类和成员函数
阅读量:5050 次
发布时间:2019-06-12

本文共 1787 字,大约阅读时间需要 5 分钟。

来源:网络 作者:未知
虽然很多程序员都熟悉名字空间的概念,但他们常常都是被动地使用名字空间。也就是说他们使用的是第三方定义的成员(如标准库的类和函数),而不是在名字空间中声明自己的类和函数。本文拟讨论如何在名字空间中声明自己的类和函数,以及如何在程序中使用它们。
名字空间是一个范畴,它包含类声明,函数声明,常量声明和模板声明等名字空间成员。例如:
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”
后跟名字空间名构成。在访问名字空间成员时它是使用最少的一种方法,原因是这种方法将所有名字空间成员注入当前的范围,从而增加了潜在的名字冲突。
 <
 

转载于:https://www.cnblogs.com/qq84435/p/3664821.html

你可能感兴趣的文章
代码实现导航栏分割线
查看>>
Windows Phone开发(7):当好总舵主 转:http://blog.csdn.net/tcjiaan/article/details/7281421...
查看>>
VS 2010打开设计器出现错误
查看>>
SQLServer 镜像功能完全实现
查看>>
Vue-详解设置路由导航的两种方法
查看>>
一个mysql主从复制的配置案例
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
dvwa网络渗透测试环境的搭建
查看>>
Win8 安装VS2012 和 Sql Server失败问题
查看>>
过点(2,4)作一直线在第一象限与两轴围成三角形,问三角形面积的最小值?...
查看>>
java aes CBC的填充方式发现
查看>>
使用ionic cordova build android --release --prod命令打包报有如下错误及解决方法
查看>>
BZOJ 2338 HNOI2011 数矩形 计算几何
查看>>
关于页面<!DOCTYPE>声明
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
C++标准库vector使用(更新中...)
查看>>
cocos2d-x 2.2.6 之 .xml文件数据读取
查看>>
枚举的使用
查看>>
BZOJ 1531 二进制优化多重背包
查看>>
BZOJ 2324 (有上下界的)费用流
查看>>