C語言定義了3個層次的作用域:文件、函數和復合語句。
C++ 引入了類的作用域,類是在文件內的。
在不同的作用域中,可以定義相同名字的變量,互不干擾,編譯器能夠區別它們。
1、命名空間的概念
C語言中,只有一個全局作用域,所有全局標識符共享一個作用域,因此絕對不能重名。
但隨著系統越來越復雜,通常不會僅由一個人來開發,不同的人開發同一個系統,不可避免地會出現變量或函數的命名沖突,當將所有人的代碼結合到一起時,就會因為變量或函數重名,導致編譯失敗。
因此,C++提出了命名空間的概念:
- 命名空間將全局作用域分成不同的部分;
- 不同命名空間的標識符可以同名,不會發生沖突;
- 命名空間可以嵌套。
namespace Name1
{
namespace Name2
{
/*...*/
}
/*...*/
}
全局作用域也叫默認命名空間。
2、舉例說明
比如現在有一個小學,學校里有六個年級,每個年級有三個班級。
現在一位老人來這個學校找到校長,要找一位叫張三的學生,感謝他在公共汽車上給自己讓座。
現在校長(編譯器)要找張三,但學校里有很多叫張三的人,怎么確定是哪個張三呢?
這時如果知道張三是哪個年紀,哪個班級,那么很快就能確定是誰。
假設是三年級二班的張三,那么這個三年級二班就是命名空間。
namespace grade
{
namespace class
{
student zhang_san;
}
}
C++的命名空間,就是一種為了避免命名沖突的機制。

3、使用方式
C++的命名空間,有兩種使用方式:
- 導入整個命名空間:using namespace name;
- 只導入命名空間中的某個變量:using name::variable
// 導入整個std命名空間到當前作用域
using namespace std;
// 只導入cout到當前作用域
using std::cout;
