【C++入门】命名空间的定义和使用
一、命名空间是什么
在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。
命名空间:用于解决命名冲突
一个命名空间就是一个新的作用域,其中的所有内容都局限于该空间中。
同名变量的访问优先级:局部域 > 全局域 > 命名空间域
二、命名空间的定义
定义命名空间,需要使用到namespace
关键字。
做法:在namespace
后面跟命名空间的名字,然后接一对{}
即可。
{}
中的就是命名空间的成员。
注:命名空间的定义是可嵌套的。
// lx是命名空间的名字,一般开发中是用项目名字做命名空间名
namespace lx
{// 命名空间中可以定义变量/函数/类int a;
}
一个工程中允许存在多个同名的命名空间,这些同名的命名空间最后会被编译器合成到同一个命名空间中。
std
是C++标准库的命名空间名,C++将标准库的定义实现都放在这个命名空间中。
三、命名空间的使用
谈到命名空间的使用,就得介绍一个域操作符::
例如,::a
的意思就是访问全局变量a
。
例如,lx::a
的意思就是访问命名空间lx
里的变量a
。
命名空间的使用有三种方式:
1.命名空间名称+域操作符
int main()
{printf("%d\\n", lx::a);return 0;
}
2.使用using
将命名空间中某个成员引入
using lx::a;
int main()
{printf("%d\\n", a);return 0;
}
3.使用using namespace
将命名空间引入
using namespce lx;
int main()
{printf("%d\\n", a);return 0;
}
std
命名空间的使用惯例:
- 日常练习中建议直接
using namespace std
using namespace std
展开,标准库就全部暴露出来了,如果我们定义的变量 / 函数 / 类跟标准库里的重名,就会产生冲突。- 所以在项目开发中建议:
- 指定访问,例如:
std::cout << "hello world!" << std::endl;
- 展开常用的,例如:
using std::cout;
using std::endl;
cout << "hello world!" << endl;
ps:关于cout
和cin
更多复杂的用法,比如控制浮点数输出精度、控制整型输出进制格式,由于C++兼容C语言,这些又用得不是很多,我们就不展开学习了。后续如果有需要,我们再配合文档学习。