在 C++ 中 using namespace std;
有什么用,什么时候用什么时候可以不用,
#include<iostream.h>
using namespace std;
class point
{
public:
int x;
int y;
void print()
{
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
}
};
void main()
{
point pt;
pt.x=0;
pt.y=1;
pt.print();
}
这段代码如果不注释掉 using namespace std;
运行就会提示出错,为什么?
「裡面有……………………」有啥,後面的我的上面就不顯示了
理論上都可以不用。但前提是你要把名稱寫全,像是std::cout。
namespace
簡單來講是這樣的,(拿一個杜撰的例子)從前有個人,寫了一個文件操作模組,裡面有個
open(char*)
來打開一個普通文件;後來又寫了個資料庫操作模組,裡面也有一個
open(char*)
用來開啟一個資料庫檔案;有一天他發現自己的一個程式同時用到了這兩個模組,結果因為函數重名導致編譯失敗了~
解決方案很簡單,改名唄~
可是如果把兩個模組中這麼多的
open()
分別改成file_open
和database_open
,實在是太麻煩,於是namespace
的作用就體現出來了,他只要將兩個模組簡單修改為namespace file{文件操作模块的原始内容};
和namespace database{数据库操作模块的原始内容};
就行了~(僅僅添加了幾行代碼而已哈)這樣他需要打開文件時寫
file::open
,在需要打開資料庫時寫database::open
,就沒有重名問題了可是這樣子的話就不存在
open
函數了,所有涉及文件操作的函數都要加上file::
前綴,數據庫操作都需要database::
前綴,他突然發現以前寫的程式碼都不能編譯了~難道以前的程式碼要大改嗎?不必,以檔案操作為例,只要加上一句
using namespace file;
就會在全域應用file
命名空間,編譯器就會嘗試找file::open
函數,所以以前的程式碼只要多加一句程式碼就能編譯了~回到重點,因為C++的函式庫中用到了
sort
、swap
等常見的函式名,很容易與使用者自訂的函式同名,為了避免名字衝突,預設把所有的函式都放到了std
命名空間中,這樣的話如果我們也寫了一個函數叫sort
就不會造成命名衝突,因為庫中的那玩意全名是std::sort
但是我們平時寫程式都挺謹慎的,命名也足夠規範,很少出現名稱重複,反倒是
std::
的前綴太多餘,連寫個輸出都要用std::cout
,所以方便起見,就來一句using namespace std;
來省略所有的前綴。但是這樣相當於屏蔽了namespace
所提供的功能,這時候如果你作死寫了一個swap
函數結果命名衝突了,可別怪C++沒有提供解決方案;當然之前的敘述有不當之處,並非只有函數才能放到
namespace
裡,變數、類別、結構體等等都是可以的,cout
就是一個例子意思是使用標準的命名空間,如果不用的話需要使用例如std::cout來指明命名空間
首先我們需要清楚命名空間的作用;命名空間是用來避免命名衝突的;
比如我自己定義了一個cout類,用來做輸出使用;
程式中有這麼一段;
編譯沒問題,編譯器找到我的cout類,連結使用;
如果我加上以下語句,包含了系統的cout類,並在全域範圍內可見:
這時候,編譯器就犯迷糊了,現在有兩個cout類,到底使用哪個無法確定,於是只有報錯;
為了避免系統報錯,我們可以自行決定使用哪個類;有以下幾種解決方案:
去掉using namespace std
這種方式會使用我自定的cout,同時可以用std空間中的其它類(使用時需加上std::前綴,比如std::string)
加上using標識
如果要使用系統cout,再加上std::
對我自行定義的cout加上命名空間(建議做法)