C++中命名空间使用

原创 2004年11月01日 17:13:00

C++中命名空间使用

 

随着程序规模的扩大,命名冲突的问题越来越严重,在同一个程序甚至是一个程序的一个模块都会出现同名的情况,特别是那些多人开发的程序中这种情况更严重,为了解决这个问题,各种语言都有相应的措施比如:java中使用了的概念,而C++使用了命名空间,由于这儿讨论的对象只是针对C++的标准模板库,故只讨论命名空间,而java中的包的概念与命名空间类似,如果有兴趣可以参考java的书籍。标准库中的所有对象都在名为std的空间内,如果你要使用的话必须引入该空间,通过一下语句即可引入:

using namespace std;

以后的代码即可随意使用该空间的函数,算法等,就好像在程序中自定义的函数一样,很多介绍使用C++标准模板库的书籍的例子程序大都使用这种方式,的确我承认这种方式很简单,但却有问题存在,请思考下面的情况:

一个稍微大点的程序往往会包含许多函数,这些函数的命名和参数类型很可能与标准库中的函数同名,如果出现这种情况的话,你程序中的函数就会屏蔽标准函数库中的函数,但你却认为是在使用标准库中的函数,于是忘了使用std::作用域分辨符,这样的话你程序会编译通过,但会出现了潜在的错误。

举个例子如下:

假设标准库中有一个函数原型为bool isOk(int x)的函数,它的作用是判断x是否为素数,如果是则返回真否则返回假,而你程序中也定义了一个这样原型的函数,但它的作用却是判断该数的范围是否在[0~100],如果是就返回真,否则返回假。现在在你的程序的很多地方都需要要使用标准库中的isOk函数来判断是否为素数,但你可能会由于我已经使用using namespace std语句引入了std空间的想法而直接使用了isOk函数,你本来的意图是要判断是否为素数,但现在却成了判断数的范围是否为[0~100],这样就与你的意图不符合而造成了潜在的错误,遗憾的是该程序会通过编译而使你的程序出现这样潜在的错误。

 

如何来解决这种潜在的错误了,我认为有两种:

第一种:使用using namespace std语句而直接使用标准库中的函数,但将你程序中自定义的函数都放在一个空间内,然后通过::作用域分辨符来使用自定义函数。

#include using namespace std;//引入std命名空间

namespace zqSpace //定义自己的命名空间

{

 bool isOk(int x)

 {

 if (x<0||x>100)

 {

return true;

             }

 return false;

}

}

//---------------------------------------------------------------------------

 int main(int argc, char* argv[])

{

 int tempNum=133;

if (zqSpace::isOk(tempNum)) //使用作用域分辨符使用自己定义的函数

{

cout<<tempNum<<"[0~100]的范围中!"<<endl;

}

else

{

              cout<<tempNum<<"不在[0~100]的范围中!"<<endl;

}

}

 

第二种:使用using namespace zqSapce语句而直接使用自己命名空间中的函数,如果要是用标准库中的函数则使用::作用域分辨符,如下语句就是使用标准模板库中的sort算法对学生成绩进行排序。

       //利用标准模板库中的sort算法

std::sort(finalGrade.begin(),finalGrade.end(),gradeCompare());

 

Note:比较成绩的函数(gradeCompare())对象以及表示学生成绩的向量的定义请参考函数对象的使用这一节.

 

为什么要用C++之:命名空间

1.1.1. 为什么要命名空间(namespace) 对于一个大型的C语言软件项目,给函数和全局变量起名不是一个容易的事情,因为必须考虑有没有可能与其它程序员写的代码冲突,多数的做法是对每个模块...
  • imxiangzi
  • imxiangzi
  • 2015年08月12日 12:16
  • 420

C++自定义命名空间编写

记录一下自定义命名空间的写法 0x00 代码实现 1、定义命名空间 namespace ReacherNameSpace { //int count_value = 10; //extern ...
  • u012870721
  • u012870721
  • 2017年08月29日 15:04
  • 165

C++命名空间namespace的使用规范

1.命名空间 namespacens { ………//将内容添加到命名空间中 } using namespace ns; ……..//声明命名空间后,表示ns命名空间里面的内容对于这条声明后的代码是...
  • wsx199397
  • wsx199397
  • 2016年09月09日 20:30
  • 1855

C++在命名空间中使用函数模板

接着上文的例子,使用函数模板,就不用显示定义每个函数。
  • u010142437
  • u010142437
  • 2014年06月19日 16:50
  • 1605

C++库研究笔记——命名空间namespace 嵌套后的作用域问题

总结: 1.::ant 表根命名空间,或匿名空间 2.同时存在 ::ant::i 和::ant::blas::i,  ant::detail::i时,在::ant::detail中使用i时,默认调...
  • mathgeophysics
  • mathgeophysics
  • 2013年08月03日 13:45
  • 5276

C++中的命名空间namespace

在一个企业级的开发中,一个工程往往会很大,定义的类和方法也会特别多,而且还会引入很多的第三方库,这就不可避免的会有一些同名的冲突问题。在Java中有包(Package)的概念,也就是将不同功能的类分成...
  • luoweifu
  • luoweifu
  • 2015年03月09日 00:03
  • 3232

C++ 命名空间 namespace 知多少

A. 命名空间是什么      命名空间是一个作用域,为了防止命名冲突。不同命名空间内可以有相同名字的成员。 在所有命名空间之外,有一个全局命名空间,以隐式方式声明,这个命名空间并没有名字。 B....
  • u013575812
  • u013575812
  • 2016年04月15日 22:46
  • 968

C++命名空间namespace的理解和用法

命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个任务中的所有类声明放在同一个命名空间中。标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构...
  • lishuandao
  • lishuandao
  • 2016年03月13日 15:01
  • 666

C++ STL之命名空间、函数模板、类模板

1 命名空间 #include //using namespace std; namespace name1 { int max(int a,int b) { int result= ...
  • feng1790291543
  • feng1790291543
  • 2016年12月04日 12:19
  • 621

在c++中怎么创建命名空间

什么是命名空间呢?举一个现实中的例子,命名空间就像是一个企业,每个企业都有自己的员工。在这里假设每一个员工代表一个类,于是每一个命名空间中都包含若干个类。优于命名空间不同,编译器就可以将同名的类区别开...
  • zhaoyinhui0802
  • zhaoyinhui0802
  • 2017年05月13日 11:35
  • 1429
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中命名空间使用
举报原因:
原因补充:

(最多只允许输入30个字)