1、<iostream>和<iostream.h>

在你的编译器include文件夹里面可以看到,二者是两个文件,里面的代码是不一样的。

后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里;

c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。

因此,

当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;

当使用<iostream>时,该头文件没有定义全局命名空间,必须使用namespace std,这样才能正确使用cout。

2、using namespace std

  • 什么是namespace?

  所谓namespace,是指标识符的各种可见范围。

  C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

  • namespace std的使用:

  由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

  1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
  std::cout << std::hex << 3.4 << std::endl;

  2、使用using关键字。
  using std::cout;
  using std::endl;

  以上程序可以写成
  cout << std::hex << 3.4 << endl;

  3、最方便的就是使用using namespace std;

  例如:
  #include <iostream>
  #include <sstream>
  #include <string>
  using namespace std;

  这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
  cout << hex << 3.4 << endl;
  因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。

  所以就有了<iostream.h>和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。

  命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"

  • 什么时候需要加using namespace std,什么时候不加?

  命名空间的作用是什么?

  命名空间的作用就是防止函数或变量等命名重复。

  例如:STL有个string类,如果你也自定义了一个string类,那么此时编译器就无法识别string是哪个string,如果加上命名空间的话,就可以很好地区分开。假设我把自定义的string类放在了AAA这个命名空间里,那么在使用时AAA::string会告诉编译器,调用的是AAA命名空间中的string类,而std::string会告诉编译器,调用的是std命名空间的string类。

  回答上述问题,使用using namespace std告诉编译器,我默认使用的是std命名空间里面的东西,因此当出现与std命名空间中函数和类等命名重复的定义时,为了避免编译器混淆,不要加上using namespace std,但如果还需要调用里面的东西时,可以使用直接指定标识符的方法,如std::cout等。

  

参考文章:

http://www.jb51.net/article/40018.htm

http://wenwen.sogou.com/z/q227104716.htm

转载于:https://www.cnblogs.com/AndyJee/p/4575319.html

(C++)浅谈using namespace std相关推荐

  1. 【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)

    震惊!世上最接地气的字符串浅谈(HASH+KMP) 笔者过于垃圾,肯定会有些错的地方,欢迎各位巨佬指正,感激不尽! 引用:LYD的蓝书,一本通,DFC的讲稿,网上各路巨佬 Luguo id: 章鱼那个 ...

  2. 【算法微解读】浅谈线段树

    浅谈线段树 (来自TRTTG大佬的供图) 线段树个人理解和运用时,认为这个是一个比较实用的优化算法. 这个东西和区间树有点相似,是一棵二叉搜索树,也就是查找节点和节点所带值的一种算法. 使用线段树可以 ...

  3. 浅谈深浅拷贝问题(这里只针对拷贝构造函数和赋值运算符重载)和简易srting类模拟实现

    浅谈深浅拷贝问题(这里只针对拷贝构造函数和赋值运算符重载)和简易srting类模拟实现 文章目录 浅谈深浅拷贝问题(这里只针对拷贝构造函数和赋值运算符重载)和简易srting类模拟实现 一.什么是浅拷 ...

  4. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  5. laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式

    浅谈laytpl 模板空值显示null的解决方法及简单的js表达式 laytpl 模板语法 {{ d.field }} 输出一个普通字段,不转义html 官方的说明 但d.field 为空时会显示nu ...

  6. Python实例浅谈--Python与C/C++相互调用

    转载链接:Python实例浅谈之三Python与C/C++相互调用_乌托邦2号的博客-CSDN博客_python 调用c++类 目录 一.问题 二.Python调用C/C++ 1.Python调用C动 ...

  7. 浅谈动态规划 ——by cbw

    浅谈动态规划 基本思路 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能 会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解. 动态规划算法与分治法类似,其基本思想也 ...

  8. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)

    虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...

  9. 洛谷P1156 垃圾陷阱 题解浅谈刷表法与填表法

    洛谷P1156 垃圾陷阱 题解&浅谈刷表法与填表法 填表法 :就是一般的动态规划,当前点的状态,可以直接用状态方程,根据之前点的状态推导出来. 刷表法:由当前点的状态,更新其他点的状态.需要注 ...

最新文章

  1. jemeter监听器的使用
  2. 夺命雷公狗---javascript NO:03 流程结构
  3. OpenCASCADE:Inspector的TInspectorEXE 示例
  4. Linux版本划分——基于打包方式
  5. Apache htaccess的简单总结,以及参数的使用
  6. BBC“20世纪最伟大科学家”,屠呦呦入围,与爱因斯坦并列
  7. Java-API:java.util.ArrayList
  8. 微软专家推荐11个Chrome 插件
  9. Transact-SQL语言
  10. 【面试经历】问题总结
  11. 机器学习(非线性回归)
  12. 服务器网卡修复工具,网络适配器无法启动如何修复 不能启动的处理办法
  13. 后面尾缀-T、-X、-TX…分别表示的意思
  14. Web-elasticsearch的使用
  15. 简单实现账号密码登录(写死了)
  16. 南阳理工学院ACM多乐赛暨16级退役纪念赛 C PK没有女朋友
  17. 【已解决】MySQL 服务正在启动 MySQL 服务无法启动
  18. 【iOS 安全相关】
  19. Arduino ESP32 通过getString方法获取网络时间和气象数据
  20. android手机值多少钱,手机换屏的钱可以买个手机了,为啥成本这么贵?

热门文章

  1. [个人推荐]函数式编程另类指南[zz]
  2. kafka logstash elk
  3. Elasticsearch Reference [6.7] » Modules » Network Settings
  4. CSS3 outline-offset 属性 项目中input会遇到
  5. C#中将DLL文件打包到EXE文件
  6. Microsoft Deployment Toolkit 2010 新功能实战之一
  7. js二级下拉被flash档住的解决办法
  8. 单线程写多线程读安全的结构体
  9. wordpress在新窗口打开留言者链接
  10. ms sql 触发器( 转)