前言
我们在c语言中经常会遇到如下错误:
这是因为c语言在编译时,会将头文件的内容展开,而<stdlib.h>中rand()是一个函数,所以我们定义rand的全局变量时,会发生冲突,产生重定义的错误,为了解决这种命名污染的问题,c++提出了命名空间的解决方案。
还有一种情况,我们在实际项目中,每个人定义的变量名称可能是相同的,当我们需要将所有人的代码合并时,命名污染的问题就会导致项目不能正常运行,所以c++用命名空间的方式来解决这种问题。
一、命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
namespace my_name
{
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
namespace N1
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
二、命名空间的使用
1、作用域分解运算符
在讲命名空间的时候首先给大家介绍一个作用域分解运算符 " :: " 。
?使用说明 ? A,B表示两个类,而在A,B中都有成员member
- A :: member表示类A成员中的member
- B :: member表示类B成员中的member
当前面的类不指定的时候,默认为全局
使用方法如下:
2、三种使用方式
int main()
{
printf("%d\n", N::a);
return 0;
}
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
- 使用using namespace 命名空间名称 引入
using namespce N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}
三、对using namespace std的理解
首先我们需要理解std代表的是什么:
- std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中。
也就是说,我们使用的cout,endl,都被放在了std里面,在c语言中,我们包含了头文件便可直接使用printf,scanf,但在c++中,这些虽然包含在头文件中,但我们不能直接使用,因为它们的名称被放在了std里面,用来避免命名污染,所以我们需要使用命名空间,才能使用cout,endl。
|