C++命名空間的使用__C++
來源:互聯網
上載者:User
對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;