您现在的位置是:首页 >技术交流 >【C++】你了解命名空间吗?网站首页技术交流
【C++】你了解命名空间吗?
简介C++ 命名空间
C++语言之父:Bjarne Stroustrup博士(本贾尼)
当我们在编写代码的时候,可能会产生一些命名冲突,为了解决这一冲突我们引出命名空间的概念
(ps:命名冲突的产生主要包括两个方面原因:1、与库函数名冲突;2、相互之间的冲突<比如在和朋友一起完成一个项目时,在互相不知晓的情况下,写了两个同名函数>)
☑ 命名空间:定义一个新的作用域,对标识符的名称进行本地化, 以避免命名冲突或名字污染
那么这个时候就有人要问了,怎么又有一种新的作用域呀(C语言中就接触到了局部和全局作用域,suoyi作用域都有哪些呀)?
▲一般作用域分为:类域,局部域,全局域,命名空间域
(在很早之前,C++标准库是有头文件[.h]的,类似于VC6.0这种编译器上就支持。但是后来在加入了命名空间之后,以示区别就删掉了.h)
▲C++中访问的时候的默认顺序是:
局部域=》全局域=》展开了的命名空间域or指定访问命名空间域 (记住这个顺序!!!)
☑ 命名空间的定义:(命名空间中的变量也属于全局变量)
namespace + 名字
{
... ...
}
(注意最后面是没有分号的)
eg:
namespace A
{
int x = 20;
}
用namspace + 名字来定义一个命名空间,命名空间内就是一个命名空间域,此作用域中的内容可通过展开了的命名空间域or指定访问命名空间域的方式来搜索访问。(跳转至下一个要点解释如何访问→)
1、命名空间不仅可以定义变量 还可以定义函数类型等 名字可随意但是注意最后不能给分号(与结构体不同)
namespace + 名字
{
... ...
}
(注意最后面是没有分号的)
eg:
namespace A
{
int x = 20;
}
2、可嵌套 N1(N2) 二者同时定义a变量 访问N2中的a可以用 N1::N2::a来访问
namespace N1
{
int a = 1;
namespace N2
{
int a = 5;
int b = 10;
int c = 20;
}
}
int main()
{
printf("%d
", N1::a);//访问N1中的a
printf("%d
", N1::N2::a);//访问N2中的a
return 0;
}
3、一个项目中的相同名字的命名空间可以合并到同一个命名空间中
☑ 访问方式:
①展开了的命名空间域
展开整个命名空间域
using namespace A;
展开部分(eg:展开std命名空间中的cout函数)
using std::cout;
②指定访问命名空间域
namespace A
{
int x = 20;
}
int main()
{
int x = 10;
printf("%d
", A::x);
return 0;
}
☑命名空间的使用(初步理解)
◎在定义了两个相同的变量(一个局部,一个全局),在访问的时候会优先访问局部变量。如果想要访问全局变量怎么办?如果仅仅只是在C语言领域中可以解决这个问题吗?
答案是不能,但是C++却可以实现(这也是C++对C语言完善的一个体现),我们只需要用到命名空间就可以解决这个问题。
◎这里使用命名空间,相当于把x封装到了命名空间域中,可以通过特定方式来访问,也就解决了上述问题。
☑命名空间使用的相关注意事项
1、使用展开命名空间域的方式是有风险的,很有可能与全局变量产生冲突,因此一般使用指定访问or展开部分的方式来访问。
2、展开了的命名空间域&&包含头文件的区别
展开了的命名空间域是指 搜索(在编译阶段去命名空间中搜索);
包含头文件是指 展开(在预处理阶段将头文件中的内容展开)
(这块不太懂的可以去看看C语言中的预处理和编译相关内容)
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。