c++ - using namespace std 有什么用?什么时候用什么时候可以不用?
大家讲道理
大家讲道理 2017-04-17 12:03:11
0
5
1147

在 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; 运行就会提示出错,为什么?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回覆(5)
黄舟

「裡面有……………………」有啥,後面的我的上面就不顯示了

黄舟

理論上都可以不用。但前提是你要把名稱寫全,像是std::cout。

大家讲道理

namespace簡單來講是這樣的,(拿一個杜撰的例子)
從前有個人,寫了一個文件操作模組,裡面有個 open(char*) 來打開一個普通文件;
後來又寫了個資料庫操作模組,裡面也有一個 open(char*) 用來開啟一個資料庫檔案;
有一天他發現自己的一個程式同時用到了這兩個模組,結果因為函數重名導致編譯失敗了~
解決方案很簡單,改名唄~
可是如果把兩個模組中這麼多的open()分別改成file_opendatabase_open,實在是太麻煩,於是namespace的作用就體現出來了,他只要將兩個模組簡單修改為namespace file{文件操作模块的原始内容};namespace database{数据库操作模块的原始内容};就行了~(僅僅添加了幾行代碼而已哈)
這樣他需要打開文件時寫file::open,在需要打開資料庫時寫database::open,就沒有重名問題了
可是這樣子的話就不存在open函數了,所有涉及文件操作的函數都要加上file::前綴,數據庫操作都需要database::前綴,他突然發現以前寫的程式碼都不能編譯了~
難道以前的程式碼要大改嗎?不必,以檔案操作為例,只要加上一句using namespace file;就會在全域應用file命名空間,編譯器就會嘗試找file::open函數,所以以前的程式碼只要多加一句程式碼就能編譯了~

回到重點,因為C++的函式庫中用到了sortswap等常見的函式名,很容易與使用者自訂的函式同名,為了避免名字衝突,預設把所有的函式都放到了std命名空間中,這樣的話如果我們也寫了一個函數叫sort就不會造成命名衝突,因為庫中的那玩意全名是std::sort

但是我們平時寫程式都挺謹慎的,命名也足夠規範,很少出現名稱重複,反倒是std::的前綴太多餘,連寫個輸出都要用std::cout,所以方便起見,就來一句using namespace std;來省略所有的前綴。但是這樣相當於屏蔽了namespace所提供的功能,這時候如果你作死寫了一個swap函數結果命名衝突了,可別怪C++沒有提供解決方案;

當然之前的敘述有不當之處,並非只有函數才能放到namespace裡,變數、類別、結構體等等都是可以的,cout就是一個例子

巴扎黑

意思是使用標準的命名空間,如果不用的話需要使用例如std::cout來指明命名空間

刘奇

首先我們需要清楚命名空間的作用;命名空間是用來避免命名衝突的;
比如我自己定義了一個cout類,用來做輸出使用;

//#mycout.h
class cout {
...
};

程式中有這麼一段;


#include "mycout.h"
cout << "hello ";

編譯沒問題,編譯器找到我的cout類,連結使用;

如果我加上以下語句,包含了系統的cout類,並在全域範圍內可見:

#include <iostream>
using namespace std;

這時候,編譯器就犯迷糊了,現在有兩個cout類,到底使用哪個無法確定,於是只有報錯;
為了避免系統報錯,我們可以自行決定使用哪個類;有以下幾種解決方案:

去掉using namespace std

這種方式會使用我自定的cout,同時可以用std空間中的其它類(使用時需加上std::前綴,比如std::string)

#include "mycout.h"
#include <iostream>

cout << "hello";

加上using標識

如果要使用系統cout,再加上std::

#include "mycout.h"
#include <iostream>

std::cout << "hello";

對我自行定義的cout加上命名空間(建議做法)


//#mycout.h
namespace CC{
    class cout {
    ...
    };
}
#include "mycout.h"
#include <iostream>
using namespace std;

cout << "hello"; //使用系统的cout
CC::cout << "colin"; //使用我自定义的cout类
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板