【C++】之命名空间(namespace)

一.概念作用与使用方法

命名空间(namespace):存在的意义是为了避免变量名,函数名,结构体名等一系列名称之间因相同而发生冲突

实用场景:一个公司有三个部门,三个部门同时做同一个项目,最终,三个部门把各自写的代码合并起来的时候,为了避免发生他们各自代码的变量命名冲突,所以每个部门都把自己写的代码放到了自己的命名空间中。如:

namespace A{ code... };

namespace B{ code... };

namesapce C{ code... };

在使用的时候只需要加上自己部门的命名空间域即可。

命名空间的使用方法

1.using namespace【命名空间】;

将命名空间中的所有的定义全部展开到全局域中(不推荐,这样丧失了命名空间隔离变量名的意义,因为这样之前全局域中如果有重名变量,就会发生冲突)

2.using【命名空间】::【变量名】

将部分变量展开到全局域中

3.不使用using,使用变量的时候在变量名前加上命名空间域

std::cout <<【变量名】<< std::endl;

在同一个文件或者不同文件中,可以多次使用同一个命名空间,最终编译器会把所有相同名称的命名空间合并到一起,形成一个总的命名空间。

二.注意事项与常见错误

1.提问:为什么上面已经写了using namespace own2,1处的语句仍然还是遵从局部优先,而不是去own2找?

#include
using std::cout;
using std::endl;
namespace own1
{
	int a = 1;
}
namespace own2
{
	int a = 2;
}
using namespace own2;
int main()
{
	int a = 100;
    //1
	cout << a << endl;//输出100,局部优先原则
    //2
	cout << own2::a << endl;//输出2,指定空间域own2
	return 0;
}

答:打印一个变量的时候,不写空间域,编译器会先从局部域去找,再从全局域去找,这就符合了局部优先规则;如果指定了空间域,编译器则会直接去指定命名空间去找,例如2处的语句。

using namespace own2可以理解为是将own2解放到了全局域中,放开了此own2命名空间的控制。所以1处的语句是先去局部找,再去全局找。

2.提问:namespace命名空间不是为了解决变量名相同而导致的冲突吗,为什么这里还是冲突了。

#include
using std::cout;
using std::endl;
namespace own
{
	int a = 2;
}
using namespace own;
int a = 3;
int main()
{
	cout << a << endl;//此处报错
	return 0;
}

【C++】之命名空间(namespace)_第1张图片

 答:因为using namespace own的意思是把own命名空间解放,把所有内容放到全局域中,这时就会和全局域中的int a = 3;冲突(这里如果在局部域定义了变量并且定义了具有同名变量的命名空间同理)

如何解决:将cout<

3.写C++程序尽量不要一开始直接写上using namespace std;

这样写相当于把std命名空间全部展开到全局域中,命名空间的诞生本来就是为了防止命名冲突,如果使用了using namespace全部展开的话,就会有可能造成std中的定义与代码中的全局域中有不必要的命名冲突,这样就违背了设计者的意愿。

如果觉得每个变量或者函数前都要加空间域麻烦可以放开一部分定义。

比如说:using std :: cout

              using std :: endl

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