1、命名空间概念简介
命名空间引入
一个项目可以包含数百个.cpp文件,这些源文件可以由不同的人来开发。
假如把这些.cpp文件由张三和李四来开发,张三在开发过程中写了一个这样的原函数radius(),
李四也起了一个这样的函数名radius(),两个人起的函数名同名了,而且参数和返回值也完全相同。
张三在zhangsan.cpp中写了的radius()的函数原型如下:
void radius()
{
printf("张三的radius()函数.rn");
}
李四在自己的lisi.cpp文件中写的radius函数原型如下:
void radius()
{
printf("李四的radius()函数.rn");
}
然后编译出来的结果如下:
Visual stdio编译报错:
"void __cdecl radius(void)" (?radius@@YAXXZ) 已经在 lisi.obj 中定义。
那么有什么办法可以在一个项目中可以有同名称的函数、类或者变量等的同名实体。
当然有,那就是引入命名空间,系统中可以定义多个命名空间,每个命名空间都有自己的名字,命名空间不能有相同的名字。可以把命名空间看成一个作用域,我们在这个命名空间里面定义函数,即使跟另外一个命名空间里面定义的函数同名,也互不影响。
命名空间定义:
namespace 命名空间名
{
}
我们把zhangsan.cpp文件中的radius()函数写到zhangsan.cpp文件中的namespace zhangsan的命名空间中,如下:
namespace zhangsan
{
void radius()
{
printf("张三的radius()函数.rn");
}
}
把lisi.cpp文件中的radius()函数写到lisi.cpp文件中的namespace lisi的命名空间中,如下:
namespace lisi
{
void radius()
{
printf("李四的radius()函数.rn");
}
}
然后再编译,发现编译器不会报错了。说明同名的函数可以在不同的作用域中定义。
2、一个命名空间仅在一个工程一个文件中存在和多个文件中含同一个命名空间的说明
假如manespace list仅在一个工程的一个文件lisi.cpp中出现,则说明在这个文件中定义了这个命名空间;假如manespace list不仅存在于lisi.cpp中,在zhangsan.cpp中也出现,相对于lisi.cpp来说则相当于在zhangsan.cpp中打开已经存在的命名空间并为这个命名空间添加新的成员,相对于zhangsan.cpp来说,也是如此,说明命名空间定义的成员可以不连续,且命名空间可以写在多个文件中。
3、外界如何访问这个/某个命名空间中的radius()函数
格式:命名空间名::实体名 这里的::称为”作用域运算符”
如果命名空间没有在main函数文件中,则需要在zhangsan.cpp文件对应的头文件zhangsan.h中声明radius()函数,在zhangsan.h头文件中声明radius函数如下:
namespace zhangsan
{
void radius();
}
然后在main函数文件中,或者调用radius()函数的文件中需要包含zhangsan.h头文件,#include”zhangsan.h”,如下所示:
#include#include #include "zhangsan.h" using namespace std; int main() { zhangsan::radius(); return 0; }
小技巧:
在调用命名空间的函数时,总是需要”命名空间::实体名”才能调用,可不可以像C语言一样不需要命名空间和::作用域,直接调用函数呢,当然是可以的,方法是引用命名空间,如调用zhangsan命名空间的radius()函数,则引用zhangsan的命名空间,如下所示:
#include#include #include "zhangsan.h" using namespace std; using namespace zhangsan; int main() { radius(); return 0; }
但是,如果两个命名空间中含有同名称的函数,这样使用会发生冲突,编译器不知道你要调用哪个命名空间下的radius()函数。



