所在的位置: c++ >> 基本简介 >> C++命名空间

C++命名空间

C++命名空间

本讲基本要求

*掌握:命名空间的作用及定义;如何使用命名空间。*了解:使用早期的函数库重点、难点◆命名空间的作用及定义;如何使用命名空间。

在学习本书前面各章时,读者已经多次看到在程序中用了以下语句:

usingnamspacstd;

这就是使用了命名空间std。在本讲中将对它作较详细的介绍。

一、为什么需要命名空间(问题提出)

命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。

在C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类作用域,类是出现在文件内的。在不同的作用域中可以定义相同名字的变量,互不于扰,系统能够区别它们。

1、全局变量的作用域是整个程序,在同一作用域中不应有两个或多个同名的实体(nuty),包括变量、函数和类等。

例:如果在文件中定义了两个类,在这两个类中可以有同名的函数。在引用时,为了区别,应该加上类名作为限定:classA//声明A类{public:voidfunl();//声明A类中的funl函数privat:inti;};voidA::funl()//定义A类中的funl函数{…………}classB//声明B类{public:voidfunl();//B类中也有funl函数voidfun2();};voidB::funl()//定义B类中的funl函数{…………}这样不会发生混淆。

在文件中可以定义全局变量(globalvariabl),它的作用域是整个程序。如果在文件A中定义了一个变量ainta=3;在文件B中可以再定义一个变量ainta=5;在分别对文件A和文件B进行编译时不会有问题。但是,如果一个程序包括文件A和文件B,那么在进行连接时,会报告出错,因为在同一个程序中有两个同名的变量,认为是对变量的重复定义。可以通过xtrn声明同一程序中的两个文件中的同名变量是同一个变量。如果在文件B中有以下声明:xtminta;表示文件B中的变量a是在其他文件中已定义的变量。由于有此声明,在程序编译和连接后,文件A的变量a的作用域扩展到了文件B。如果在文件B中不再对a赋值,则在文件B中用以下语句输出的是文件A中变量a的值:couta;//得到a的值为32、程序中就会出现名字冲突。在简单的程序设计中,只要人们小心注意,可以争取不发生错误。但是,一个大型的应用软件,往往不是由一个人独立完成的,而是由若干人合作完成的,不同的人分别完成不同的部分,最后组合成一个完整的程序。假如不同的人分别定义了类,放在不同的头文件中,在主文件(包含主函数的文件)需要用这些类时,就用#includ命令行将这些头文件包含进来。由于各头文件是由不同的人设计的,有可能在不同的头文件中用了相同的名字来命名所定义的类或函数。

例4名字冲突

程序员甲在头文件hadrl.h中定义了类Studnt和函数fun。

//例4中的头文件hadr1(头文件1,没其文件名为cc-h1.h)#includstring#includcmathusingnamspacstd;classStudnt//声明Studnt类{public:Studnt(intn,stringnam,inta){num=n;nam=nam;ag=a;}voidgt_data();privat:intnum;stringnam;intag;};voidStudnt::gt_data()//成员函数定义{coutnumnamagndl;}doublfun(doubla,doublb)//定义全局函数(即外部函数){rturnsqrt(a+b);}

在main函数所在的文件中包含头文件hadrl.h:#includiostramusingnamspacstd;#includhadr1.h//注意要用双引号,因为文件一般是放在用用户目录中的intmain(){Studntstud1(,Wang,18);//定义类对象_data();coutfun(5,3)ndl;rturn0;}

程序能正常运行,输出为Wang.

如果程序员乙写了头文件hadr2.h,在其中除了定义其他类以外,还定义了类Studnt和函数fun,但其内容与头文件hadrl.h中的Studnt和函数fun有所不同。

//例4中的头文件hadr2#includstring#includcmathusingnamspacstd;classStudnt//声明Studnt类{public:Studnt(intn,stringnam,chars)//参数与hadrl中的studnt不同{num=n;nam=nam;sx=s;}voidgt_data();privat:intnum;stringnam;charsx;};//此项与hadrl不同voidStudnt::gt_data()//成员函数定义{coutnumnamsxndl;}doublfun(doubla,doublb)//定义全局函数{rturnsqrt(a-b);}//返回值与hadrl中的fun函数不同//头文件2中可能还有其他内容

假如主程序员在其程序中要用到hadrl.h中的Studnt和函数fun,因而在程序中包含了头文件hadrl.h,同时要用到头文件hadr2.h中的一些内容(但对hadr2.h中包含与hadrl.h中的Studnt类和fun函数同名而内容不同的类和函数并不知情,因为在一个头文件中往往包含许多不同的信息,而使用者往往只关心自己所需要的部分,而不注意其他内容),因而在程序中又包含了头文件hadr2.h。如果主文件(包含主函数的文件)如下:

#includiostramusingnamspacstd;#includhadr1.h//包含头文件l#includhadr2.h//包含头文件2intmain(){Studntstud1(,Wang,18);_data();coutfun(5,3)ndl;rturn0;}

这时程序编译就会出错。因为在预编译后,头文件中的内容取代了对应的#includ命令行,这样就在同一个程序文件中出现了两个Studnt类和两个fun函数,显然是重复定义,这就是名字冲突,即在同一个作用域中有两个或多个同名的实体。

3、全局命名空间污染(globalnamspacpollution)。在程序中还往往需要引用一些库(包括C++编译系统提供的库、由软件开发商提供的库或者用户自己开发的库),为此需要包含有关的头文件。如果在这些库中包含有与程序的全局实体同名的实体,或者不同的库中有相同的实体名,则在编译时就会出现名字冲突。

为了避免这类问题的出现,人们提出了许多方法,例如:将实体的名字写得长—些(包含十几个或几十个字母和字符);把名字起得特殊一些,包括一些特殊的字符;由编译系统提供的内部全局标识符都用下划线作为前缀,如_









































北京中科医院
北京治疗白癜风那个医院比较好



转载请注明:http://www.nydjfy.com/jbjj/676.html

  • 上一篇文章:
  •   
  • 下一篇文章: