搜尋

首頁  >  問答  >  主體

c++ - using namespace std 有什么用?什么时候用什么时候可以不用?

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

大家讲道理大家讲道理2803 天前1183

全部回覆(5)我來回復

  • 黄舟

    黄舟2017-04-17 12:05:11

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

    回覆
    0
  • 黄舟

    黄舟2017-04-17 12:05:11

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

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 12:05:11

    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就是一個例子

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 12:05:11

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

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 12:05:11

    首先我們需要清楚命名空間的作用;命名空間是用來避免命名衝突的;
    比如我自己定義了一個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类

    回覆
    0
  • 取消回覆