编程语言

img ZQGet

C++中命名空间使用

发表于2004/11/1 17:13:00  2150人阅读

分类: std的使用

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())对象以及表示学生成绩的向量的定义请参考函数对象的使用这一节.

 

阅读全文
0 0

相关文章推荐

img
取 消
img