【前言】在写程序时,虽然一直这么用,有点疑惑为甚么引入了头文件.h还要在加上using namespace std?例如:

1 #include<iostream>
2 using namespace std;//他的作用?cout不应该在头文件里面定义的函数吗?
3 int main(0
4 {
5 cout<<"你好";
6 return 0;
7 }

  下面就介绍一下,为什么在引用了iostream头文件的情况下,想使用cout,还要加上std命名空间。

一、std和stl的关系

  stl是标准模板库,是标准库的子集。主要是容器、算法、迭代器三个方面,几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。标准模板库里面没有string,但是他在标准库里面,用来输入一个字符串类型。

  STD是命名空间的名字,目的是为了避免命名空间污染。模板库(包括stl)的设计者,特意在库文件里面加上了命名空间(下面会分析怎么加的)。这样,我们使用者就可以在定义自己的函数时,定义自己的命名空间。然后在自己定义的命名空间作用域范围内,使用我们自己定义的、但可能和标准库里的函数重名的函数。这样就不会有函数冲突了,使用时注意命名空间的作用域就好了!

二、实现自己的库和命名空间

  一个注意点,标准编码风格要求接口和实现分离。头文件包含命名空间的定义类、变量、函数、模板和其他命名空间的声明。源文件包含命名空间成员的定义部分。

 1 //myfile.h
2 #include<string>
3 namespace my_std{
4 class sales_data{/*各种函数的声明*/};
5 }
6
7 //myfile.cc
8 #include"myfile.h"
9 namespace my_std{
10 //sales_data类中函数的实现
11 }
12
13 //main.cc
14 #include"myfile.h" //若想在main.cc文件加头文件,如iostream,最好加在引入的文件之前
15 int main()
16 {
17 using my_std::sales_data;
18 sales_data data1,data2;
19 //...
20 return 0;
21 }

由上可以看出,基于接口实现分离。要在.h和.cc文件中加上namespace。这样的话,就可以在main文件中引入命名空间,在一定作用域下使用特定的函数。

三、在标准库里实战分析

标准库与上面的代码组织结构类似。但是我看的VS的STL版本中的头文件是木有.h的,他的声明和定义是在一起的也叫标准头文件。在vs里面看一下标准库源码(iostream和stl里的vector)。看来分不分离也各有个的使用者吧!我感觉分开更明晰一些!

主程序:

 1 #include<iostream>
2 #include<vector>
3 using namespace std;
4 int main()
5 {
6 std::vector<int> as;
7 cout<<"a";
8 getchar();
9 return 0;
10 }

1、先看iostream的:

  

  宏定义了std,下面所有声明实现都在命名空间std之下。

  2、再看vector的:

   

标准的c++11没有.h和.cc之分,转到声明和定义都是同一个文件。头文件及其实现都在vector里面。

  我们看到两个标准头文件里面都有共同的命名空间,所以命名空间可以是不连续的。

最新文章

  1. ViewHolder优化2&gt;:
  2. 《从零开始做一个MEAN全栈项目》(3)
  3. jsp_内置对象_request
  4. 学习Coding-iOS开源项目日志(四)
  5. 初学Node(六)搭建一个简单的服务器
  6. CUBRID学习笔记 18 sql语句的预处理(类似存储过程)
  7. 时间序列数据库选型——本质是列存储,B-tree索引,抑或是搜索引擎中的倒排索引
  8. -bash: crontab: command not found(转)
  9. [DataTable] datatable根据表中的字段进行排序
  10. springMVC整合memcached
  11. SpringMVC请求访问不到静态文件解决方式
  12. 一个view相对于屏幕或者另外一个view 的坐标
  13. JAVA经典算法40题(原题+分析)之原题
  14. 微信开发中网页授权access_token与基础支持的access_token异同 【转载、收藏】
  15. Python:字符串格式化
  16. SpringBoot统一错误处理
  17. Vue的路由实现:hash模式 和 history模式
  18. P1481 魔族密码 (LIS)
  19. [linux] 对一个虚拟机的研究
  20. 17秋 SDN课程 第二次上机作业

热门文章

  1. Scala集合库、模式匹配和样例类
  2. B、小花梨的三角形(解题报告)
  3. 用servlet在网页中打印字符串(初接触)、servlet调用过程
  4. hdu3506 Monkey Party
  5. 营业额统计 HYSBZ - 1588
  6. windows下进程间通信方法
  7. Maven与Nexus3.x环境构建详解
  8. codeforces 5D
  9. React.createClass vs. ES6 Class Components
  10. learning-js-by-reading-source-codes