一個大型軟體通常是由多個子產品組成的,這些子產品往往是由不同的人合作完成,最後組成一個完整的程式。
假如不同的人分别定義了函數和類,放在不同的頭檔案中,在主檔案需要用到這些函數和類時,
用#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>