> 文章列表 > 一文搞懂using namespace std【命名空间】【C++初阶】

一文搞懂using namespace std【命名空间】【C++初阶】

一文搞懂using namespace std【命名空间】【C++初阶】

本篇文章将打开C++学习新篇章,欢迎与博主一起学习交流。

目录

前言

一、命名空间定义

二、命名空间的使用

1、三种使用方法

2、局部域>全局域/已展开的命名空间>未展开的命名空间

三、建议

总结

前言

在C语言学习中,我们如果定义了一个变量的名字跟头文件中的某个函数冲突了,编译器就会报错;一些变量,函数和类都存在于全局变量中,可能会导致很多冲突,为了解决这个问题,cpp就引入了命名空间(namespace)这个概念。


一、命名空间的定义

使用命名空间的目的是对标识符的名称进行本地化,以免命名冲突或名字污染。

一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限在该命名空间中。

定义: namespace(关键字)+命名空间的名字+{命名空间的成员}

namespace jy
{int rand = 10;int Add(int left,int right){return left+right;}struct Node{struct Node*next;int val;};
}

注意:

命名空间可以嵌套定义

同一个工程中允许存在多个相同名称的命名空间,最后编译器会合成同一个命名空间中。

二、命名空间的使用

namespace N
{int a = 1;
}

1、三种使用方法

(1)加命名空间名称及作用域限定符(::)

int main()
{printf("%d", N::a);return 0;
}

:若作用域限定符(::)左边为空,则代表全局

eg:

int a=1;
int main()
{int a=0;printf("%d",::a);//输出1return 0;
}

2)使用  using将命名空间中某个成员  引入

using N::a;
int main()
{printf("%d", a);return 0;
}

(3)使用  using namespace 命名空间名称  引入

using namespace N;//把N这个命名空间展开
int main()
{printf("%d", a);return 0;
}

2、局部域>全局域/已展开的命名空间>未展开的命名空间

※(1)局部变量  与  全局变量或已展开的命名空间冲突时,优先局部

namespace N
{int a = 1;
}
using namespace N;int main()
{int a = 0;printf("%d", a);//输出0return 0;
}

※(2)全局变量  与  未展开命名空间冲突时,优先全局

int a = 0;
namespace N
{int a = 1;
}int main()
{printf("%d",a);//输出0
}

※(3)全局变量  与  已展开的命名空间冲突,这是不合法的,会报错。

int a = 0;
namespace N
{int a = 1;
}
using namespace N;
int main()
{printf("%d",a);
}

a的值不明确,报错。

※(4)命名空间未展开,编译器是不会搜索命名空间里的变量的。

namespace N
{int a=0;
}
int main()
{printf("%d",a);
}

三、建议

显然,直接展开一整个命名空间其实会有风险,如果定义和库重名了,就报错了

因此,在项目里面建议不要直接像using namespace std;这样展开。

可以只对常用的进行展开

如:

using std::cout;
using std::cin;

总结

再点点题,平时我们经常看到或用到的using namespace std;其实就是将std这个命名空间展开,释放到全局,std这个命名空间里包括了cpp库中几乎所以的函数名等,如cin,cout等,都在std这个命名空间中。