天天看點

C++ namespace

   一個大型軟體通常是由多個子產品組成的,這些子產品往往是由不同的人合作完成,最後組成一個完整的程式。

假如不同的人分别定義了函數和類,放在不同的頭檔案中,在主檔案需要用到這些函數和類時,

用#include指令行将這些頭檔案包括進來。但由于各個頭檔案是由不同的人設計的,可能在不同的頭檔案中

會有相同的名字來定義函數或類,這樣就會出現 命名沖突的問題。同時如果在程式中用到第三方類庫,也會

有同樣的問題。

  為解決這一問題:

ANSI/ISO C++引入命名空間,即一個程式設計者命名的記憶體區域。程式設計者根據需要指定命名空間,并

将命名空間中聲明的辨別符和命名空間關聯起來,這樣就保證不同命名空間的同名辨別符不發生沖突。

它的一般格式:

            namespace 命名空間名

       {

         辨別符1;

         辨別符2;

         ...

       }

    如果要調用命名空間裡的函數、類、對象等,有兩種方法:(1)在原檔案中使用"using namespace 命名空間名",再

直接調用辨別符;(2)在辨別符前面加上命名空間以及作用域運算符"::";

  自定義頭檔案university.h:

  

1 namespace Peking //聲明命名空間Peking
   2 {
   3     int rank=47;//辨別符
   4 }
   5
   6 namespace Tsinghua //聲明命名空間Tsinghua
   7 {
   8     int rank=54;//與Peking同名辨別符
   9 }      

  使用檔案university.h及命名空間:

  

1 #include "stdafx.h"
   2 #include <iostream>
   3
   4 #include "university.h"//加載頭檔案university.h
   5 using namespace Peking;//顯式使用頭檔案university.h中的命名空間Peking
   6
   7 int main()
   8 {
   9     std::cout<<"世界大學排名(2010)"<<std::endl;
   10
   11     std::cout<<"北京大學:"<<rank<<std::endl;//rank等同于Peking::rank
   12     std::cout<<"清華大學:"<<Tsinghua::rank<<std::endl;//辨別符rank前面加上命名空間Tsinghua以及作用域運算符"::"
   13
   14     return 0;
   15 }      

  結果:

​​​​

  最後來說說C++中頭檔案的命名規則,因為C++是從C語言發展而來的,為了與C相容,C++保留了C語言中的一些規定,其中就包括用.h作為字尾的頭檔案,比如大家所熟悉的:stdio.h、math.h和string.h等。但後來ANSI/ISO C++建議頭檔案不帶字尾".h"。但為了使原來編寫的C++的程式能夠運作,在C++程式中的頭檔案既可以采用不帶字尾的頭檔案,也可以采用C語言中帶字尾的頭檔案。在C++中使用這兩種形式的頭檔案都可以,隻不過有幾個注意點需要說明一下:(1)如果C++程式中使用了帶字尾".h"的頭檔案,那麼不必在程式中聲明命名空間,隻需要檔案中包含頭檔案即可;(2)C++标準要求系統提供的頭檔案不帶字尾".h",但為了表示C++與C的頭檔案既有聯系又有差別,C++中所用頭檔案不帶字尾".h",而是在C語言的相應頭檔案名之前加上字首c:

 

1 #include <cstdio> //等同于C中的#include<stdio.h>
   2 #include <cstring> //等同于C中的#include<string.h>
   3 #include <cmath>//等同于C中的#include <math.h>      

繼續閱讀