目录
学了这么久了,一直搞不明白写C++程序的时候为什么要使用using namespace std;这篇文章带你深度理解一下命名空间,走起!
C++感觉C语言太捞了,凭什么变量名是唯一的,全世界每个人的名字也不是唯一的,于是C++提出了命名空间的概念,在我这个命名空间下这个变量名是这个意思,在其他命名空间下是另外的意思,那到底是啥意思?一起来看一下!
#include <stdio.h>
int main()
{
int printf = 10;
printf("123");
return 0;
}
上面的代码报错了,凭啥给我报错呢?原因是我使用了c语言库中的printf函数,而且我还定义了一个printf的变量,编译器一下子傻眼了,我是调用变量还是函数啊,所以报了这个错误。有的人说名字冲突了你换一个不就好了么,假如给你10万就让你取这个名字,有办法吗?有,没有钱做不到的事。
1 namespace概念:
- 定义命名空间需要用到namespace关键字,后面跟着命名空间的名字,然后接一对{},{}中为该命名空间的成员。
namespace my { int printf; }
- 命名空间可以嵌套
namespace my { int printf; namespace our { int scanf; } }
- 同一个工程允许存在相同名字的命名空间,编译器最后会整合到一起
- 一个命名空间就定义了一个新的作用域,命名空间中的所有成员都限制在这个作用域中
#include <stdio.h>
#include <iostream>
namespace my {
int printf;
namespace our
{
int scanf;
}
void get(int a)
{
std::cout << a << std::endl;
}
}
int main()
{
my::printf = 10;
my::get(10);
return 0;
}
2 namespace使用
2.1 加命名空间以及作用域限定符
命名空间::来访问命名空间内的成员,像下面使用的std::以及my::都是
namespace my {
int printf;
namespace our
{
int scanf;
}
}
int main()
{
my::printf = 10;
std::cout << my::printf << std::endl;
return 0;
}
2.2 使用using将命名空间内的成员引入
using std::cout;
using std::endl;
int main()
{
cout << "使用using将命名空间的成员引入" << endl;
return 0;
}
我们发现这样不用在cout前面加std::限定了,但是用的太多了我们要一个一个的using
2.3 使用using namespace将命名空间引入
using namespace std;
int main()
{
cout << "使用using将命名空间的成员引入" << endl;
return 0;
}
这样是不是用起来更爽,消费一次就可以长久使用,但是实际在写工程的时候大家的名字往往起什么都有可能,所以在使用命名空间的时候不建议将公有的命名空间展开,建议使用std::这样的访问方式更加的专业