名稱空間(namespace)詳解
一、為什麼使用名稱空間
考慮一種情況,當我們有兩個同名的人,Zara,在同一個班裡。當我們需要對它們進行區分我們必須使用一些額外的資訊和它們的名字,比如這個區域,如果它們生活在不同的區域或者它們的母親或父親的名字,等等。
在您的C++應用程式中也會出現同樣的情況。例如,您可能正在編寫一些具有名為xyz()函式的程式碼,並且還有另一個可用的庫,它也具有相同的xyz()函式。現在編譯器無法知道您在程式碼中引用的xyz()函式的哪個版本。
名稱空間(namespace)被設計來克服這個困難,並被用作額外的資訊來區分類似的函式、類、變數等等,它們在不同的庫中具有相同的名稱。使用名稱空間,您可以定義定義名稱的上下文。本質上,名稱空間定義了一個範圍。
二、名稱空間的定義
在C語言中只有一個全域性作用域:
1.C語言中所有的全域性識別符號共享一個作用域
2.識別符號之間可能發生衝突
C++中提出了名稱空間的概念:
1.名稱空間將全域性作用域分成不同的部分,
2.不同名稱空間中的識別符號可以同名而不會發生衝突
3.名稱空間可以發生巢狀
4.全域性作用域也叫預設名稱空間
語法:
namespace Name
{
namespace Internal
{
/*...*/
}
/*...*/
}
C++名稱空間的使用:
使用整個名稱空間:using namespace name;
使用名稱空間中的變數:using name::variable
使用預設名稱空間中的變數: ::variable
Example:
#include <stdio.h>
#include <iostream>
namespace First
{
int i = 0;
}
namespace Second
{
int i = 1;
namespace Internal //巢狀名稱空間
{
struct P //巢狀名稱空間
{
int x;
int y;
};
}
}
int main()
{
using namespace First; //使用整個名稱空間
using Second::Internal::P; //使用巢狀的名稱空間
printf("First::i = %d\n", i);
printf("Second::i = %d\n", Second::i); //使用名稱空間中的變數
P p = { 2, 3 };
printf("p.x = %d\n", p.x);
printf("p.y = %d\n", p.y);
system("pause");
return 0;
}
編譯執行,輸出結果:
三、using指令
可以使用using namespace指令避免使用名稱空間前置。該指令告訴編譯器後續程式碼正在使用指定名稱空間中的名稱。
Example:
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main () {
// This calls function from first name space.
func();
return 0;
}
編譯執行,輸出結果:
四、std名稱空間
下列程式碼可以引用cout而不預先新增名稱空間:
#include <iostream>
using std::cout;
int main () {
cout << "std::endl is used with std!" << std::endl;
return 0;
}
編譯執行,輸出結果: