> 文章列表 > 波奇学C++:命名空间和流输入输出

波奇学C++:命名空间和流输入输出

波奇学C++:命名空间和流输入输出

目录

命名空间的引入

命名空间的使用

命名空间的展开

流插入和提取


初始C++:C++是从实验室出来的,兼容了C,Java和C#是公司做出来的,C++的出现在某些情况下,弥补了C的缺点,并含有面向对象的思想

命名空间的引入

问题引入:运行下列代码发现报错。

#include<stdlib.h>
int rand=0;
int main()
{printf("%d\\n",rand);return 0;
}

原因:stdlib.h头文件中,有rand的函数,导致关键字rand重定义问题,而在一些大型项目中,可能会存变量名在重定义的问题。

解决方法:引入命名空间域,把相同的变量名的变量定义在不同的空间中。编译器搜索变量时就在不同的命名空间中搜索避免重定义问题。

什么是域? 域可以简单理解为划分的一块空间。

域分为:类域,命名空间域,局部域,全局域。

全局变量在全局域,局部变量在局部域,在c中全局变量和局部变量冲突时优先访问局部变量,由此可推断,编译优先在局部域搜索变量再去全局域中搜索。

编译器搜索:局部域>全域局,不指定不搜索命名空间域。

c的库会在全局域中

命名空间的使用

#include<stdio.h>
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<iostream>//C++头文件没有.husing namespace std//展开命名空间stdint main(){cout<<"hellow world"<<endl;return 0;
}

命名空间和头文件的关系?

调用函数时,先找到函数的声明,再从声明中找函数的源码,引用<iostream>头文件把cout的声明放在了全局域中,那么下一步要从声明找cout的函数定义,可是函数定义并不在全局域中,放在了命名域中,解决方法就是展开std命名域。简单来说,声明放在了头文件,定义放在了命名空间中。

命名空间小建议,项目时不要展开命名空间,指定展开,平常日常练习中可以展开命名空间。

using std::cout;
using std::endl;

流插入和提取

cout<<hellow world<<endl//流插入
int x=0;
int y=0;
cin<<x<<y//流提取

简单理解为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语言的缓冲区。