【前言】在寫程序時,雖然一直這麼用,有點疑惑爲甚麼引入了頭文件.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裏面。
咱們看到兩個標準頭文件裏面都有共同的命名空間,因此命名空間能夠是不連續的。