今天這一節,注意要講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 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>