C語(yǔ)言定義了3個(gè)層次的作用域:文件、函數(shù)和復(fù)合語(yǔ)句。
C++ 引入了類的作用域,類是在文件內(nèi)的。
在不同的作用域中,可以定義相同名字的變量,互不干擾,編譯器能夠區(qū)別它們。
1、命名空間的概念
C語(yǔ)言中,只有一個(gè)全局作用域,所有全局標(biāo)識(shí)符共享一個(gè)作用域,因此絕對(duì)不能重名。
但隨著系統(tǒng)越來越復(fù)雜,通常不會(huì)僅由一個(gè)人來開發(fā),不同的人開發(fā)同一個(gè)系統(tǒng),不可避免地會(huì)出現(xiàn)變量或函數(shù)的命名沖突,當(dāng)將所有人的代碼結(jié)合到一起時(shí),就會(huì)因?yàn)樽兞炕蚝瘮?shù)重名,導(dǎo)致編譯失敗。
因此,C++提出了命名空間的概念:
- 命名空間將全局作用域分成不同的部分;
- 不同命名空間的標(biāo)識(shí)符可以同名,不會(huì)發(fā)生沖突;
- 命名空間可以嵌套。
namespace Name1
{
namespace Name2
{
/*...*/
}
/*...*/
}
全局作用域也叫默認(rèn)命名空間。
2、舉例說明
比如現(xiàn)在有一個(gè)小學(xué),學(xué)校里有六個(gè)年級(jí),每個(gè)年級(jí)有三個(gè)班級(jí)。
現(xiàn)在一位老人來這個(gè)學(xué)校找到校長(zhǎng),要找一位叫張三的學(xué)生,感謝他在公共汽車上給自己讓座。
現(xiàn)在校長(zhǎng)(編譯器)要找張三,但學(xué)校里有很多叫張三的人,怎么確定是哪個(gè)張三呢?
這時(shí)如果知道張三是哪個(gè)年紀(jì),哪個(gè)班級(jí),那么很快就能確定是誰(shuí)。
假設(shè)是三年級(jí)二班的張三,那么這個(gè)三年級(jí)二班就是命名空間。
namespace grade
{
namespace class
{
student zhang_san;
}
}
C++的命名空間,就是一種為了避免命名沖突的機(jī)制。
3、使用方式
C++的命名空間,有兩種使用方式:
- 導(dǎo)入整個(gè)命名空間:using namespace name;
- 只導(dǎo)入命名空間中的某個(gè)變量:using name::variable
// 導(dǎo)入整個(gè)std命名空間到當(dāng)前作用域
using namespace std;
// 只導(dǎo)入cout到當(dāng)前作用域
using std::cout;






