C++命名空间定义和使用
Posted Linux编程学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++命名空间定义和使用相关的知识,希望对你有一定的参考价值。
1 引出命名空间的需求
在一个test.cpp源文件中,假设有如下一份代码:
编译结果如下:
可以看到,编译异常。因为,无法在同一个文件中,定义一个完全相同的函数。函数的名称,返回值类型,和参数列表都相同。
但是,如果我们把这些函数,分别定义在不同的类中,是否允许?测试代码如下:
程序运行结果如下:
可以看到,定义了testA类和testB类,在类中定义了相同的成员函数。最终,通过定义类对象,可以调用相同的函数名。
那么,我们可以看到,是“类名”隔离保护了同名的func()函数。
如果我们在开发一个大型的软件项目,有多个程序员同时开发。那么,如果两个程序员定义了两个同名的函数,而且,集成测试的时候,主程序包含了这两个相同的同名函数,就会导致代码异常。
例如,在不同的文件中定义同名的func()函数,当包含了定义同名函数的文件,是否有一种机制,也可以对同名的func()函数进行“隔离保护”?
答案是可以的,C++引入了命名空间的机制。对代码起到“隔离保护”的作用。
命名空间是ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。通过C++提供的命名空间机制,就可以对程序员自己定义的代码进行隔离保护。
2 命名空间的定义
ANSI C++增加了命名空间(namespace)机制,所谓命名空间,实际上就是一个由程序开发者命名的区域空间。程序开发者可以把自己设计的代码放在该区域空间内。
那么,当其它人员想使用该程序开发者开发的代码,就需要引入该命名空间,才可以使用命名空间内设计的代码。所以,通过命名空间,就可以把程序开发者设计的代码,与其它人员开发的代码分离开,起到隔离保护的作用。
定义命名空间,使用namespace关键字来定义,格式如下:
namespace 命名空间名称
那么,就可以在命名空间名称后面的大括号内,添加代码。例如:
namespace wkf_sn
void func(void)
cout << "wkf_sn func " << endl;
所以,就定义了一个命名空间,命名空间的名称是wkf_sn,在该命名空间内定义了func()函数。
namespace 是定义命名空间所必须写的关键字,wkf_sn是用户自己指定的命名空间的名字(可以用任意合法标识符,这里用 wkf_sn是因为 ns 是 namespace 的缩写,含义清楚),中花括号内是声明块,在其中声明的实体称为命名空间成员(namespace member)。例如,我们定义两个不同的命名空间,如下:
namespace snA //定义命名空间
int val = 16886;
void func(void)
cout << "snA func " << endl;
namespace snB //定义命名空间
int val = 16889;
void func(void)
cout << "snB func " << endl;
那么,要怎么样引用这些命名空间内定义的代码?有如下方式:
(1) 通过域作用符“::”,可以指定用哪个域内的代码;
(2) 通过using关键字,引入该命名空间,就可以使用该命名空间内的代码。
C++中命名空间的作用类似于操作系统中的目录和文件的关系,由于文件很多,不便管理,而且容易重名,于是,人们设立若干子目录,把文件分别放到不同的子目录中,不同子目录中的文件可以同名。调用文件时应指出文件路径。当我们学习JAVA的时候,发现JAVA的“包”就是文件目录,它的作用域C++的命名空间一样。
可以根据需要设置许多个命名空间,每个命名空间名代表一个不同的命名空间域,不同的命名空间不能同名。这样,可以把不同的库中的实体放到不同的命名空间中,或者说,用不同的命名空间把不同的实体隐藏起来。
命名空间的声明方法和使用方法与类差不多。但它们之间有一点差别:在声明类时在右花括号的后面有一分号,而在定义名空间时,花括号的后面没有分开。
3 命名空间的使用
使用命名空间时,提供了如下的方式:
(1) 通过域作用符“::”,可以指定用哪个域内的代码;
(2) 通过using关键字,引入该命名空间,就可以使用该命名空间内的代码。
在引用命名空间成员时,要用命名空间名和域作用符对命名空间成员进行访问,以区别不同的命名空间中的同名标识符。如下:
命名空间名::命名空间成员名
这种方法是有效的,能够保证所引用的实体有唯一的名字。但是,如果命名空间名名字比较长,尤其在有命名空间嵌套的情况下,为引用一个实体,需要写很长的名字。在一个程序中可能要多次引用命名空间成员,就会感到很不方便。
为此,C++提供了一些机制,能够简化使用命名空间成员的手续。
1 使用命名空间别名
可以为命名空间起一个别名(namespace alias),用来代替较长的名句空间名。如:
namespace AudioVideo //声明命名空间,名为AudioVideo
...
可以用一个较短而易记的别名代替它。如:
namespace AV = AudioVideo; //别名AV 与原名AudioVideo等价
也可以说,别名AV指向原名 AudioVideo,在原来出现AudioVideo的位置都可以无条件地用AV来代替。
2 使用using 命名空间成员名
using后面的命名空间成员必须是由命名空间限定的名字。格式如下:
using namespace 命名空间名;
例如:
using namespace AudioVideo; //引用AudioVideo命名空间
以上语句声明:在本作用域(using语句所在的作用域)中会用到命名空间AudioVideo中的代码,在本作用域中如果使用该命名空间成员时,不必再用命名空间限定。
以上是关于C++命名空间定义和使用的主要内容,如果未能解决你的问题,请参考以下文章