命名空间和作用域
命名空间(namespace)是一种将相关的类型进行分组的逻辑命名方案。它将各种命名实体进行分组,各组间可以互不影响,避免出现重名,这与jave的包机制类似。学习本章,读者可以更好理解大型开发中的各种设计规划,更好地深入学习项目构建。
命名空间的定义
命名空间用namespace来声明,后面跟空间的名称,名称之后是由{}包含起来的声明块。在一个名字空间内声明的实体被称为名字空间成员(namespace member),每个成员都必须指向该名字空间内的唯一实体,不同的名字空间可以具有相同名字的成员。命名空间的格式如下所示。
namespace space_name
{
…
}
#include <iostream>
using namespace std;
namespace SpaceA{
class A
{
public:
int fun(void)
{
cout<<"In Class A of namespace SpaceA"<<endl;
return 1;
};
};
char *str ="In namespace SpaceA";
}
namespace SpaceB{
class A
{
public:
int fun(void)
{
cout<<"In class A of namespace SpaceB"<<endl;
return 1;
};
};
char *str ="In namespace SpaceB";
}
int main()
{
SpaceB::A ba;
SpaceA::A aa;
aa.fun();
ba.fun();
cout<<SpaceA::str<<endl;
cout<<SpaceB::str<<endl;
return 0;
}
分析:该示例定义了两个命名空间SpaceA和SpaceB,在两个空间内都有同样的类名A和变量str,但是在使用时并没有引入冲突。
注意:名字空间的说明和类的声明有点像,但是它不能以“;”结束。
名字空间的定义可以是不连续的。
名字空间还可以嵌套。
如何使用命名空间
两种方法:
1.域限定符:
域限定符是“::”,其使用方法如下所示。
space_name::space_member;
如果命名空间是嵌套的,则要连续写出所有空间名。
space_name1::space_name2::…::space_nameN::space_member;
但是,如果实体在为命名的空间内,则可以直接访问,就像一个全局变量一样。
2.使用using声明:
一个using 声明一次只能作用于一个命名空间,它明确指出了用到的命名空间,其格式如下:
using namespace name_space;
using name_space::space_member;
第一种方式表示将命名空间引用到该文件中,以后对该命名空间内的成员访问时,就不需要加完整的空间限定了。第二种方式表示只引用space_member这一个成员,而其他成员不可见。
3.别名:
有时名字空间的命名太长不方便使用,这时可以给它一个别名。其格式如下:
namespace othername=space_name;
#include <iostream.h>
#include <otherfile.h>
using namespace OtherFile;
namespace ThisFile{
char *str="char *str,in ThisFile namespace";
void fun(void)
{
cout<<"function fun,in ThisFile namespace"<<endl;
}
}
namespace{
char *unnamed ="unnamed namespace";
}
int main(int argc ,char* argv[])
{
cout<<str<<endl;
fun(); //来自空间OtherFile
cout<<ThisFile::str<<endl;
ThisFile::fun(); //引用自己的名字空间中的函数
cout<<unname<<endl;//引用无名的名字空间
return 0;
}