090909c++語言學習日記(命名空間)

 

 

在標準C++以前,都是用#include<iostream.h>這樣的寫法的,因爲要包含進來的頭文件名就是iostream.h。標準C++引入了名字空間的概念,並把iostream等標準庫中的東東封裝到了std名字空間中,同時爲了不與原來的頭文件混淆,規定標準C++使用一套新的頭文件,這套頭文件的文件名後不加.h擴展名,如iostream、string等等,並且把原來C標準庫的頭文件也重新命名,如原來的string.h就改成cstring(就是把.h去掉,前面加上字母c),所以頭文件包含的寫法也就變成了#include <iostream>。
並不是寫了#include<iostream>就必須用using namespace std;我們通常這樣的寫的原因是爲了一下子把std名字空間的東東全部暴露到全局域中(就像是直接包含了iostream.h這種沒有名字空間的頭文件一樣),使標準C++庫用起來與傳統的iostream.h一樣方便。如果不用using namespace std;使用標準庫時就得時時帶上名字空間的全名,如std::cout << "hello" << std::endl;
     #include "iostream"與#include<iostream>的區別:前者先在當前目錄找iostream文件,找不到再去系統頭文件路徑找,後者反之。因此,做爲一個良好的習慣,在包含系統頭文件時儘量用<>,而在包含自己的工程中的頭文件時用""。
其實沒有 < iostream.h > 這樣的東西 --- 標準化委員會在簡化非C標準頭文件時用 < iostream > 取代了它。但又沒有完全取消 < iostream.h > 的使用,並且很多編譯器都同時支持 < iostream > 和 < iostream.h > ,造成現在的局面,老大(標準化委員會)確實有不得已的苦衷。


話說當年,在標準化委員會動手重建新的標準庫的時候,遇到了問題。爲了避免類名和函數名的衝突問題,引入了名字空間std。但無數現有的C++代碼都依賴於使用了多年的僞標準庫中的功能,例如,聲明在 < iostream.h > 和 < complex.h > 等頭文件中的功能。現有軟件沒有針對使用名字空間而進行相應的設計或者升級,如果用std來包裝標準庫導致現有代碼不能使用,那手底下的小弟(程序員)是不會同意的。
標準化委員會爲了拉攏人心,吸引更多的人入會,決定爲包裝了std的那部分標準庫構建新的頭文件名。將現有C++頭文件名中的.h去掉,所以就出現了 < iostream.h> 和 < iostream > 等很多雙胞胎。對於C頭文件,採用同樣方法但在每個名字前還要添加一個C,所以C的 <string.h> 變成了 <cstring>。
舊的C++頭文件是官方明確反對使用的,但舊的C頭文件則沒有(以保持對C的兼容性)。其實編譯器製造商不會停止對客戶現有軟件提供支持,所以在可以預計的將來,舊的C++頭文件還會囂張一段時間。
如果能明白字符串頭文件的使用,舉一反三,其他的也差不多會用了。
<string.h> 是舊的C頭文件,對應的是基於char*的字符串處理函數;
<string> 是包裝了std的C++頭文件,對應的是新的strng類;
<cstring> 是對應舊的C頭文件的std版本。
跑遠了,言歸正傳。如果你的編譯器都同時支持 < iostream > 和 < iostream.h >,那使用 #include < iostream >,得到的是置於名字空間std下的iostream庫的元素;如果使用 #include < iostream.h >,得到的是置於全局空間的同樣的元素。在全局空間獲取元素會導致名字衝突,而設計名字空間的初衷正是用來避免這種名字衝突的發生。還有,打字時 < iostream > 比 < iostream.h > 少兩個字,所以我會使用 < iostream >
輸入的時候不用endl。

用cout輸出時endl的作用是輸出一個換行符並且刷新輸出流的緩衝區。

刷新緩衝區可以保證全部內容輸出到屏幕(或其他相應設備)上。否則可能仍暫時保存在緩衝區中,直到緩衝區滿了或程序結束輸出剩下的東西。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章