今天這一節,注意要講C++中的命名空間和標頭檔的命名規則。也是C++這一基礎系列的最後一節。首先感謝在學習C++的一路上,有這麼多關注這系列的博友們的陪伴和協助。正因為有了你們的建議和指導,使我對C++有了更深的認識和更大的興趣。這個系列結束之後,我會繼續學習和關注C++的一些實際應用。
大家都知道一個大型軟體通常是由多個模組組成的,這些模組往往是由不同的人合作完成,最後組成一個完整的程式。假如不同的人分別定義了函數和類,放在不同的標頭檔中,在主檔案需要用到這些函數和類時,用#include命令列將這些標頭檔包括進來。但由於各個標頭檔是由不同的人設計的,可能在不同的標頭檔中會有相同的名字來定義函數或類,這樣就會出現命名衝突的問題。同時如果在程式中用到第三方類庫,也會有同樣的問題。為解決這一問題,ANSI/ISO C++引入命名空間,即一個程式設計者命名的記憶體地區。程式設計者根據需要指定命名空間,並將命名空間中聲明的標識符和命名空間關聯起來,這樣就保證不同命名空間的同名標識符不發生衝突。它的一般格式:
namespace 命名空間名
{
標識符1;
標識符2;
...
}
花括弧內是命名空間的範圍。其實在之前所有的章節中都用到過一個C++指定的一個標準命名空間std。是否還記得在C++的發展,特點和來源程式構成 這一節中的樣本裡用到過using namespace std語句,其含義就是使用標準命名空間std。它是單詞standard的縮寫,標準C++庫中的所有標識符都在這個命名空間中,比如我們常用到的iostream標頭檔中的函數、類、對象等都在std命名空間中定義。如果要調用命名空間裡的函數、類、對象等,有兩種方法:(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 usingnamespace 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 return0;
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>
End