博客主页:博主链接
本文由 M malloc 原创,首发于 CSDN
学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构
欢迎点赞 收藏 ⭐留言 如有错误敬请指正!
未来很长,值得我们全力奔赴更美好的生活✨
在C++中,名称可以是变量、函数、结构、枚举、类以及类和结构的成员。当随着项目的增大,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能导致名称冲突。例如:两个库可能都定义了名为List、Tree和Node的类,但定义的方式不兼容。用户可能希望使用一个库的List类,而使用另一个库的Tree类。这种冲突被称为名称空间问题。
本篇文章将讲授C++的命名空间相关的知识
前言
声明区域是可以在其中进行声明的区域。例如,可以在函数外面声明全局变量,对于这种变量,其声明区域为其声明所在的文件。对于在函数中声明的变量,其声明区域可以为其声明所在的代码块。
潜在作用域(potential scope)
变量的潜在作用域从声明点开始,到其声明区域的结尾,因为潜在作用域比声明区域小,这是由于变量必须定义后才能使用。
C++关于全局变量和局部变量的规定定义了一种名称空间层次。每个声明区域都可以声明名称,这些名称独立于在其他声明区域中声明的名称。在一个函数中声明的局部变量不会与在另一个函数中声明的局部变量发生冲突。
#include
using namespace std;
int add(int left, int right)
{
return left + right;
}
double add(double left, double right)
{
return left + right;
}
void Swap(int* p1, int* p2)
{}
void Swap(double* p1, double* p2)
{}
int main()
{
cout << add(1, 1) << endl;
cout << add(1.1, 1.1) << endl;
return 0;
}
在上述代码中从#include 到最后一个有括号为止都属于声明区(全局名称空间)
通过定义一种新的声明区域来创建命名的名称空间,这样做的目的之一是提供一个声明名称的区域。一个名称空间中的名称不会与另外一个名称空间的想通名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。例如,下面的代码使用新的关键字namespace创建了两个名称空间:
输入
namespace mei
{
double pail;
float price;
int pal;
}
namespace zhi
{
double fetch;
float price;
int pal;
}
注意
名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此,在默认的情况下,在名称空间中声明的名称的链接性为外部的(除非它引用了常量)
全局名称空间(global namespace)
它对应于文件级声明区域,因此前面所说的全局变量现在被描述为位于全局名称空间中。
作用域解析运算符::
我们需要一种方法来访问给定名称空间中的名称。最简单的方法就是,通过作用域解析运算符::,使用名称空间来限定该名称:
#include
namespace mei
{
double pail;
float price;
int pal;
}
namespace zhi
{
double fetch;
float price;
int pal;
}
int main()
{
mei::pail = 12.22;
zhi::price = 10.1;
return 0;
}
我们并不希望每次使用名称时都对它进行限定,因此C++提供了两种机制(using声明和using编译指令)来简化对名称空间中名称的使用。using声明使特定的标识符可用,using编译指令使整个名称空间可用
using声明由被限定的名称和它前面的关键字using组成:
using mei::pail;//a using declaration
using声明将特点名称添加到它所属的声明区域中。例如main()中的using声明mei::pail将pail添加到main()定义的声明区域中。完成该声明后,便可以使用名称pail代替mei::pail。下面的代码说明了这几点:
#include
namespace mei
{
double pail;
float price;
int pal;
}
namespace zhi
{
double fetch;
float price;
int pal;
}
double pail;
int main()
{
using mei::pail;//a using declaration
float pail;
std::cin >> pail;
mei::pail = 12.22;
zhi::price = 10.1;
return 0;
}
我们来看上述代码,其实上述代码是会报错的,我们来看报错信息
由于using声明将名称添加到局部声明区域中。因此这个示例避免了将另一个局部变量也命名为pail另外,和其他局部变量一样,pail也将覆盖同名的全局变量
在函数的外名声明时,将把名称添加到全局名称空间中:
#include
void other();
namespace mei
{
double pail;
float price;
int pal;
}
namespace zhi
{
double fetch;
float price;
int pal;
}
using mei::pail;//a using declaration
int main()
{
std::cin >> pail;
other();
return 0;
}
void other()
{
std::cout << pail << std::endl;
}
using声明使一个名称可用,而using编译指令使所有名称都可用。using编译指令由名称空间名和它前面的关键字using namespace 组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符::
using namespace mei;
在使用using编译指令和using声明,需要记住的一点是,它们增加了名称冲突的可能性
提示:在学习的过程中,我们需要先自行进行思考,并且多去阅读一些大佬的书籍,俗话说的好,书籍是人类进步的阶梯!
好啦今日的分享到这里就结束啦,我是爱你们的M malloc希望可以帮助到你们噢,最后别忘记三连啦!!