C++命名空間namespace的使用

C++語言引入命名空間(Namespace)這一概念主要是爲了避免命名衝突,其關鍵字爲 namespace。
科技發展到如今,一個系統通常都不會僅由一個人來開發完成,不同的人開發同一個系統,不可避免地會出現變量或函數的命名衝突,當所有人的代碼測試通過,沒有問題時,將所有人的代碼結合到一起,因爲變量或函數重名而導致的問題將會造成一定的混亂,例如:

int flag = 1; //小李聲明的變量
// …… //中間間隔若干行代碼
bool flag = true; //小韓聲明的變量

如上所示,因爲個人習慣不同,小李喜歡聲明int型變量用於邏輯判斷,而小韓則更喜歡採用bool類型變量。但兩個聲明放到同一個函數中的時候,很明顯編譯器會提示出flag變量重新定義的錯誤。這種問題若不加以處理是無法編譯通過的。
可以使用命名空間解決類似上面的命名衝突問題,例如:

namespace Li
{ //小李的變量聲明
    int flag = 1;
}
namespace Han
{ //小韓的變量聲明
    bool flag = true;
}

小李與小韓各自定義了以自己姓氏爲名的命名空間,此時將小李與小韓的flag變量定義再置於同一個函數體中,則不會有任何問題,當然在使用這兩個變量的時候需要指明所採用的是哪一個命名空間中的flag變量。

1. 指定所使用的變量時需要用到“::”操作符,“::”操作符是域解析操作符。例如:

Li::flag = 0; //使用小李定義的變量flag
Han::flag = false; //使用小韓定義的變量flag

2. 除了直接使用域解析操作符,還可以採用using聲明(using declaration),例如:

using Li::flag;
flag = 0; //使用小李定義的變量flag
Han::flag = false; //使用小韓定義的變量flag

在代碼的開頭用using聲明瞭Li::flag,其含義是using聲明以後的程序中如果出現未指明的flag時,則使用Li::flag,但是若要使用小韓定義的flag,則仍需要Han::flag.

3. using聲明不僅僅可以針對命名空間中的一個變量,也可以用於聲明整個命名空間,例如:

using namespace Li;
flag = 0; //使用小李定義的變量flag
Han::flag = false; //使用小韓定義的變量flag

如果命名空間Li中還定義了其他的變量,則同樣具有flag變量的效果,在using聲明後,若出現未具體指定命名空間的命名衝突變量,則默認採用Li命名空間中的變量。

命名空間內部不僅可以聲明或定義變量,對於其它能在命名空間以外聲明或定義的實體,同樣也都能在命名空間內部進行聲明或定義,例如變量的聲明或定義、函數的聲明或定義、typedef等都可以出現在命名空間中。

4. 舉例

#include<iostream>
using namespace std;
int main()
{
    cout<<"hello world!"<<endl;
    return 0;
}

這是一個簡單的C++程序hello world示例,在程序中採用了using聲明命名空間std,using namespace std; 這一語句涵蓋了std命名空間中的所有標識符,而該命名空間包含C++所有標準庫。頭文件iostream文件中定義的所有變量、函數等都位於std命名空間中,每次使用iostream中的變量或函數都需要在前面加上std::是非常麻煩的一件事,爲此可直接用using聲明將std中的所有變量或函數等都聲明出來。
如果不用using namespace std;這一語句,則程序應該像下面這樣:

#include<iostream>
int main()
{
    std::cout<<"hello world!"<<std::endl;
    return 0;
}

這樣看起來是相當麻煩的,如果在某次使用iostream中變量或函數時漏掉std則會導致爲定義標識符錯誤。
C++語言是以C語言爲基礎的,它繼承了所有的C語言函數庫,但C++對這些標準庫都重新命名了。標準C頭文件(如math.h)重命名爲cmath,去掉頭文件的.h,並在前面加上c。因此在C++中如需使用math.h頭文件則可以按照如下方式使用。

#include<cmath>
using namespace std;

下面是一個QT中的project:
在這裏插入圖片描述
namespace 頭文件:

#ifndef NAMESPACE_H
#define NAMESPACE_H
namespace Li
{   //小李的變量聲明
    int flag = 1;
}
namespace Han
{   //小韓的變量聲明
    bool flag = true;
}
#endif // NAMESPACE_H

主函數代碼:

#include <iostream>
#include "namespace.h"
using namespace std;
using namespace Li;

int main(int argc, char *argv[])
{
    cout << Li::flag << endl;
    Li::flag = 9;
    cout << Li::flag << endl;
    return 0;
}

輸出結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章