1. 程式人生 > >C++名稱空間的使用

C++名稱空間的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                對using namespace std;的解釋:
        所謂namespace,是指識別符號的各種可見範圍。C++標準程式庫中的所有識別符號都被定義於一個名為std的namespace中。
        由於namespace的概念,使用C++標準程式庫的任何識別符號時,可以有三種選擇:
        1、直接指定識別符號。例如std::ostream而不是ostream。完整語句如下:
        std::cout << std::hex << 3.4 << std::endl;
        2、使用using關鍵字。
        using std::cout;
        using std::endl;
        以上程式可以寫成
        cout << std::hex << 3.4 << endl;
        3、最方便的就是使用using namespace
        std;這樣名稱空間std內定義的所有識別符號都有效(曝光)。就好像它們被宣告為全域性變數一樣。那麼以上語句可以如下寫:
        cout << hex << 3.4 << endl;

        這段程式用到了標準模板庫,在螢幕上列印字元a~z,其中main函式的標記式只有兩種是被
        C++標準委員會接受的,只有以下兩種寫法是符合C++標準的,是可移植的。即:
        int main()
        {
        }
        和
        int main(int argc, char* argv[])









很多初學C++的人,對於C++中的一些基本的但又不常用的概念感到模糊,名稱空間(namespace)就是這樣一個概念。

C++中採用的是單一的全域性變數名稱空間。在這單一的空間中,如果有兩個變數或函式的名字完全相同,就會出現衝突。當然,你也可以使用不同的名字,但有時我們並不知道另一個變數也使用完全相同的名字;有時為了程式的方便,必需使用同一名字。比如你定義了一個變數string user_name, 有可能在你呼叫的某個庫檔案或另外的程式程式碼中也定義了相同名字的變數,這就會出現衝突。名稱空間就是為解決C++中的變數、函式的命名衝突而服務的。解決的辦法就是將你的strTemp變數定義在一個不同名字的名稱空間中。就好像張家有電視機,李家也有同樣型號的電視機,但我們能區分清楚,就是因為他們分屬不同的家庭。

例如:


#include <iostream>
#include <string>
using namespace std;


//using namespace編譯指示,使在C++標準類庫中定義的名字在本程式中可以使用
//否則,iostream,string 等c++標準類就不可見了,編譯就會出錯。

//兩個在不同名稱空間中定義的名字相同的變數


namespace myown1{

string user_name = "myown1";
}
namespace myown2{

string user_name = "myown2";
}

int main()
{
cout<< "/n"
<< "Hello, "
<< myown1::user_name //用名稱空間限制符myown1訪問變數user_name
<< "... and goodbye!/n";

cout<< "/n"
<< "Hello, "
<< myown2::user_name //用名稱空間限制符myown2訪問變數user_name
<< "... and goodbye!/n";

return 0;
}


當然,我們也可以使用程式開頭的預編譯指示來使用名稱空間中的名字。使用預編譯指示的好處在於在程式中不必顯式地使用名稱空間限制符來訪問變數。以上主程式可修改為:


int main()
{
using namespace myown1;
cout<< "/n"
<< "Hello, "
<< user_name
<< "... and goodbye!/n";

// using namespace myown2;
cout<< "/n"
<< "Hello, "
<< myown2::user_name //用名稱空間限制符myown2訪問變數user_name
<< "... and goodbye!/n";

return 0;
}


但第二個變數必需用名稱空間限制符來訪問,因為此時myown1空間中的變數已經可見,如果不加限制,編譯器就會無法識別是那一個名稱空間中的變數。這一點一定要注意。 以上只是初學者不清楚的一個概念,在以後的文章中還將繼續討論其它的一些概念。







名稱空間(名字空間)
  名稱空間是C++的一種機制,用來把單個識別符號下的大量有邏輯聯絡的程式實體組合到一起。此識別符號作為此組群的名字。名稱空間用關鍵字namespace 來定義:

//stl_cpp_6.cpp
#include <iostream>
using namespace std;
namespace printA
{
  print() {cout<<"using namespace printA….."<<endl; };
}
namespace printB
{
  print() {cout<<"using namespace printB….."<<endl; };
}
int main(void)
{
  printA::print();   //測試名稱空間printA, ::是作用域解析運算子
  printB::print();
}
名稱空間可以巢狀定義:
namespace A
{
  functiong1(){};
  namespace B
  { }
}
  一個namespace是指一個具名的範圍(named scope)。namespace被用來將相關的宣告劃歸在一起,將不相關的程式碼部分隔開。名稱空間只是命名了一個特殊的作用域,當程式很大,而且需要多人合作的時候,名稱空間就顯得特別的重要。比如2個程式設計師A,B 在同一個程式中定義了函式 pop(),如果沒有使用名稱空間,則會出錯,而且這種錯誤難以檢測出來。為了安全起見,他們可以定義不同的名稱空間 A和B,在用的時候可以使用A::pop()和B::pop()來區分。
  在STL中,標準庫的全部成員在預先定義的名稱空間std中。如果要用類模板vector ,有兩種方法:一是在程式的前面新增預處理指令:

  #include <vector>
  using namespace std;
第二種方法是:

  #include <vector>
  using std::vector;            

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述