很多初學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空間中的變量已經可見,如果不加限制,編譯器就會無法識別是那一個命名空間中的變量。這一點一定要注意。 以上只是初學者不清楚的一個概念,在以後的文章中還將繼續討論其它的一些概念。