目录
命名空间的引入
命名空间的使用
命名空间的展开
流插入和提取
初始C++:C++是从实验室出来的,兼容了C,Java和C#是公司做出来的,C++的出现在某些情况下,弥补了C的缺点,并含有面向对象的思想
问题引入:运行下列代码发现报错。
#include
int rand=0;
int main()
{
printf("%d\n",rand);
return 0;
}
原因:stdlib.h头文件中,有rand的函数,导致关键字rand重定义问题,而在一些大型项目中,可能会存变量名在重定义的问题。
解决方法:引入命名空间域,把相同的变量名的变量定义在不同的空间中。编译器搜索变量时就在不同的命名空间中搜索避免重定义问题。
什么是域? 域可以简单理解为划分的一块空间。
域分为:类域,命名空间域,局部域,全局域。
全局变量在全局域,局部变量在局部域,在c中全局变量和局部变量冲突时优先访问局部变量,由此可推断,编译优先在局部域搜索变量再去全局域中搜索。
编译器搜索:局部域>全域局,不指定不搜索命名空间域。
c的库会在全局域中
#include
namespace m
{
int rand=0;
}
int rand=1;
int main()
{
int a=2;
print("%d",rand);
return 0;
}
由上文可知我们打印的是局部的值,有没用访问全局域的值和命名空间的值的方法
prinf("%d",::rand);//访问全局域
pritnf("%d",m::rand);//访问命名空间域
如果要大量访问一个命名空间,语法不免有些累赘,为了解决这个问题,C++支持把命名空间展开:相当于把变量放在了全局域。
using namespace m//把命名空间m展开
命名空间不仅可以定义变量还能定义结构体函数,嵌套命名空间。
嵌套命名空间的访问:
pritnf("%d",m1::m2::rand);
多个同名的命名空间会被合并成一个命名空间
当不同的头文件包含相同的命名空间时,引用头文件会使得命名空间合并。
c++的内置命名空间std包含STL,C++库
#include//C++头文件没有.h
using namespace std//展开命名空间std
int main()
{
cout<<"hellow world"<
命名空间和头文件的关系?
调用函数时,先找到函数的声明,再从声明中找函数的源码,引用
头文件把cout的声明放在了全局域中,那么下一步要从声明找cout的函数定义,可是函数定义并不在全局域中,放在了命名域中,解决方法就是展开std命名域。简单来说,声明放在了头文件,定义放在了命名空间中。
命名空间小建议,项目时不要展开命名空间,指定展开,平常日常练习中可以展开命名空间。
using std::cout;
using std::endl;
cout<
简单理解为cout流插入的作用是把hellow world流入控制台,endl相当于换行符
cin流提取相当于scanf,把1,2提取到x,y。
cout/cin和printf,scanf的比较:
优点:cout,cin可以自动识别数据类型,涉及函数重载。
缺点:可能带来损失精度,要控制精度时使用c语言更方便。
c语言的printf和scanf比cin,cout快,原因cout要兼容c语言,检查C语言的缓冲区。