【前言】在写程序时,虽然一直这么用,有点疑惑为甚么引入了头文件.h还要在加上using namespace std?例如:ios
1 #include<iostream> 2 using namespace std;//他的做用?cout不该该在头文件里面定义的函数吗? 3 int main(0 4 { 5 cout<<"你好"; 6 return 0; 7 }
下面就介绍一下,为何在引用了iostream头文件的状况下,想使用cout,还要加上std命名空间。c++
1、std和stl的关系算法
stl是标准模板库,是标准库的子集。主要是容器、算法、迭代器三个方面,几乎全部的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来讲提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。标准模板库里面没有string,可是他在标准库里面,用来输入一个字符串类型。函数
STD是命名空间的名字,目的是为了不命名空间污染。模板库(包括stl)的设计者,特地在库文件里面加上了命名空间(下面会分析怎么加的)。这样,咱们使用者就能够在定义本身的函数时,定义本身的命名空间。而后在本身定义的命名空间做用域范围内,使用咱们本身定义的、但可能和标准库里的函数重名的函数。这样就不会有函数冲突了,使用时注意命名空间的做用域就行了!编码
2、实现本身的库和命名空间spa
一个注意点,标准编码风格要求接口和实现分离。头文件包含命名空间的定义类、变量、函数、模板和其余命名空间的声明。源文件包含命名空间成员的定义部分。设计
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文件中引入命名空间,在必定做用域下使用特定的函数。c++11
3、在标准库里实战分析code
标准库与上面的代码组织结构相似。可是我看的VS的STL版本中的头文件是木有.h的,他的声明和定义是在一块儿的也叫标准头文件。在vs里面看一下标准库源码(iostream和stl里的vector)。看来分不分离也各有个的使用者吧!我感受分开更明晰一些!blog
主程序:
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 }
一、先看iostream的:
宏定义了std,下面全部声明实现都在命名空间std之下。
二、再看vector的:
标准的c++11没有.h和.cc之分,转到声明和定义都是同一个文件。头文件及其实现都在vector里面。
咱们看到两个标准头文件里面都有共同的命名空间,因此命名空间能够是不连续的。