c++,命名空间namespace,using编译,using声明用法

c++,命名空间namespace,using编译,using声明用法

命名空间namespace

命名空间起源:
因为项目增大导致命名冲突,使用厂商的类库时命名冲突,用户定义时命名冲突等统称为名称空间问题,c++提供了命名空间工具来方便控制名称的作用域,需要注意的是命名空间是用来控制名称标识符的作用域的。

了解命名空间前需要的知识前提:
声明区域:
可以在其中进行声明的区域,例如函数外声明的全局变量,其声明区域为所在文件,对于函数内声明的变量,其声明区域为其声明所在的代码块。

潜在作用域:
变量的潜在作用域从声明点开始,到其声明区域的结尾,故潜在作用域比声明区域小,因为变量需要在声明以后才能被调用。
变量并非在其潜在作用域中可见,它可能被另一个在嵌套声明区域中声明的同名变量隐藏,例如在函数声明的局部变量会将同一个文件中的全局变量隐藏,变量对程序而言可见的范围被称为作用域。

引入:
c++关于全局变量和局部变量的规则定义了一种名称空间层次,每个声明区域都可以声明名称,这些名称独立于在其他声明区域中声明的名称,在一个函数中声明的局部变量不会与在另一个函数中声明的局部变量发生冲突。

新引入的命名空间的特性:
c++通过定义一种新的声明区域来创建命名的命名空间,这样做的目的之一是提供一个声明名称的区域。
一个命名空间中的名称不会与另一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该命名空间中声明的变量和函数。例如:

namespace Space01
{
 double pail;
 void fench();
}
namespace Space02
{
 double pail;
 double fench();
}

使用命名空间中的变量和函数时,需要用作用域解析符::

Space01::fench();
Space02::fench();

using声明和using编译指令:
每次使用变量和函数时都要加上名称是一件麻烦的事,c++因此提供的两种机制,分别是using声明和using编译来简化对名称空间中名称的使用,using声明使特定的标识符可用,using编译指令使整个命名空间可用。

using声明由被限定的名称和它前面的关键字using组成,例如:

using Space01::fench();

使用后,可以用名称fench()代替Space01::fench(),可以在函数体中进行声明,该声明拥有和临时变量相同的生命周期,例如:

int main()
{
 using Space01::fench();
 fench();
}

using编译指令,将该命名空间的名称全局可用,这个很常见了:

using namespace std;

这个就是using编译指令,它使命名空间中的所有名称都可用 ,而不需要域解析作用符,例如:

using namespace Space01;
int main()
{
 fench();
}

using声明和using编译虽然使用方便,但是增加了命名冲突的可能性,容易与同名标识符产生二义性。

你可能感兴趣的:(c++,c++,c语言,c++)