namespace 命名空间

命名空间

 

std是一个类(输入输出标准),它包括了cin成员和cout成员,“using name space std ;”以后才能使用它的成员。#include<iostream.h>中不存在类std,但是他有cin,out的相关函数,不需要使用命名空间了。而第二种标准#include<iostream>,它包含了一个类,在类的使用之前要预处理一下,“using namespace std;”就是这个功能,然后你就可以使用cin,cout这两个成员函数了,假设你不使用预处理(using namespace std;),麻烦加上std::cin或者std::cout再去使用它的成员函数(因为头文件中存在这个类)
命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突。

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

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

例:如果在文件中定义了两个类,在这两个类中可以有同名的函数。在引用时,为了区别,应该加上类名作为限定: 
class A //声明A类 
{ public: 
void funl();//声明A类中的funl函数 
private: 
int i; }; 
void A::funl() //定义A类中的funl函数 
{…………}

class B //声明B类
{ public:
    void funl(); //B类中也有funl函数
    void fun2(); };
void B::funl() //定义B类中的funl函数
{ …………}

这样不会发生混淆。 
在 文件中可以定义全局变量(global variable),它的作用域是整个程序。如果在文件A中定义了一个变量a int a=3; 
在文件B中可以再定义一个变量a int a=5; 
在分别对文件A和文件B进行编译时不会有问题。但是,如果一个程序包括文件A和文件B,那么在进行连接时,会报告出错,因为在同一个程序中有两个同名的变量,认为是对变量的重复定义。 
可 以通过extern声明同一程序中的两个文件中的同名变量是同一个变量。如果在文件B中有以下声明: 
extem int a; 
表示文件B中的变量a是在其他文件中已定义的变量。由于有此声明,在程序编译和连接后,文件A的变量a的作用域扩展到了文件B。如果在文件B中不再对a赋值,则在文件B中用以下语句输出的是文件A中变量a的值: cout<

二、 什么是命名空间(解 决方案)

命名空间:实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。 
如: namespace ns1 //指定命名中间nsl 
{ int a; 
double b; } 
namespace 是定义命名空间所必须写的关键字,nsl 是用户自己指定的命名空间的名字(可 以用任意的合法标识符,这里用ns1是因为ns是namespace的缩写,含义请楚),在花括号内是声明块,在其中声明的实体称为命名空间成员(namespace member)。现在命名空间成员包括变量a和b,注意a和b仍然是全局变量,仅仅是把它们隐藏在指定的命名空间中而已。如果在程序中要使用变量a和b,必须加上命名空间名和作用域分辨符“::”,如nsl::a,nsl::b。这种用法称为命名空间限定(qualified),这些名字(如nsl::a)称为被限定名 (qualified name)。C++中命名空间的作用类似于操作系统中的目录和文件的关系,由于文件很多,不便管理,而且容易重名,于是人们设立若干子目录,把文件分别放到不同的子目录中,不同子目录中的文件可以同名。调用文件时应指出文件路径。 
命名空间的作用:是建立一些互相分隔的作用域,把一些全局实体分隔开来。以免产生老点名叫李相国时,3个人都站起来应答,这就是名字冲突,因为他们无法辨别老师想叫的是哪一个李相国,同名者无法互相区分。为了避免同名混淆,学校把3个同名的学生分在3个班。这样,在小班点名叫李相国时,只会有一个人应答。也就是说,在该班的范围(即班作用域)内名字是惟一的。如果在全校集合时校长点名,需要在全校范围内找这个学生,就需要考虑作用域问题。如果校长叫李相国,全校学生中又会有3人一齐喊“到”,因为在同一作用域中存在3个同名学生。为了在全校范围内区分这3名学生,校长必须在名字前加上班号,如高三甲班的李相国,或高三乙班的李相国,即加上班名限定。这样就不致产生混淆。 
可以根据需要设置许多个命名空间,每个命名空间名代表一个不同的命名空间域,不同的命名空间不能同名。这样,可以把不同的库中的实体放到不同的命名空间中,或者说,用不同的命名空间把不同的实体隐蔽起来。过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用 namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。 
在声明一个命名空间时,花括号内不仅可以包括变量,而且还可以包括以下类型: 
·变量(可以带有初始化); 
·常量; 
·数(可以是定义或声明); 
·结构体; 
·类; 
·模板; 
·命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。 
例如 
namespace nsl 
{ const int RATE=0.08; //常量 
doublepay; //变量 
doubletax() //函数 
{return a*RATE;} 
namespacens2 //嵌套的命名空间 
{int age;} 

如果想输出命名空间nsl中成员的数据,可以采用下面的方法: 
cout<

三、 使用命名空间解决名字冲突(使用指南)

有了以上的基础后,就可以利用命名空间来解决名字冲突问题。现在,对例4程序进行修改,使之能正确运行。 
例5 利用命名空间来解决例4程序名字冲突问题。 
修改两个头文件,把在头文件中声明的类分别放在两个不同的命名空间中。 
//例8.5中的头文件1,文件名为header1.h 
using namespace std; 
#include 
#include 
namespace ns1 //声明命名空间ns1 
{ class Student //在命名空间nsl内声明Student类 
{ public: 
Student(int n,string nam,int a) 
{ num=n;name=nam;age=a;} 
void get_data(); 
private: 
int num; 
string name; 
int age; }; 
void Student::get_data() //定义成员函数 
{ cout<

四、 使用命名空间成员的方法

从上面的介绍可以知道,在引用命名空间成员时,要用命名空间名和作用域分辨符对命名空间成员进行限定,以区别不同的命名空间中的同名标识符。即: 
命名空间名::命名空间成员名 
这种方法是有效的,能保证所引用的实体有惟一的名字。但是如果命名空间名字比较长,尤其在有命名空间嵌套的情况下,为引用一个实体,需要写很长的名字。在一个程序中可能要多次引用命名空间成员,就会感到很不方便。 
1 、使用命名空间别名 
可以为命名空间起一个别名(namespace alias),用来代替较长的命名空间名。如 
namespace Television //声明命名空间,名为Television 
{ … } 
可以用一个较短而易记的别名代替它。如: 
namespace TV=Television; //别名TV与原名Television等价 
也可以说,别名TV指向原名Television,在原来出现Television的位置都可以无条件地用TV来代替。 
2、使用using命名空间成员名 
using后面的命名空间成员名必须是由命名空间限定的名字。例如: 
using nsl::Student; 
以上语句声明:在本作用域(using语句所在的作用域)中会用到命名空间ns1中的成员Student,在本作用域中如果使用该命名空间成员时,不必再用命名空间限定。例如在用上面的using声明后,在其后程序中出现的Student就是隐含地指nsl::Student。 
using声明的有效范围是从using语句开始到using所在的作用域结束。如果在以上的using语句之后有以下语句: 
Student studl(101,”Wang”,18); //此处的Student相当于ns1::Student 
上面的语句相当于 
nsl::Student studl(101,”Wang”,18); 
又如 
using nsl::fun; //声明其后出现的fun是属于命名空间nsl中的fun 
cout<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值