1. 程式人生 > >【C++】名稱空間的引入

【C++】名稱空間的引入

在C++中,變數、函式和後面要學到的類都是大量存在的,這些變數、函式和類的名稱將都存在於全域性作
用域中
可能會導致很多衝突。使用名稱空間目的是對識別符號的名稱進行本地化,以避免命名衝突或名字
汙染
namespace關鍵字的出現就是針對這種問題的。

這麼說可能不太理解,我們來用程式碼舉個栗子。

#include <stdio.h>
#include <stdlib.h>

int a = 10;
int a = 20;
int main()
{
	printf("hello world");
	system("pause");
	return 0;
}

在這裡我們如果想要定義這個 a 是不可以的。因為它們兩個在同一作用域, 都是 a,無法區分誰是誰。

但是如果寫成這個樣子,將其中一個 a 放在main函式裡,就可以編譯通過。 所以說,不是不可以出現同名的變數,只要放在不同區域就可以了。

#include <stdio.h>
#include <stdlib.h>

int a = 10;
int main()
{
	int a = 20;
	printf("%d\n",a);
	system("pause");
	return 0;
}

在這裡,a 的輸出結果是20,因為我們知道,這裡的訪問原則是就近原則。那如果我非要訪問外面的這個 a 怎麼辦?

#include <stdio.h>
#include <stdlib.h>

int a = 10;
int main()
{
	int a = 20;
	printf("%d\n",::a);
	system("pause");
	return 0;
}

我們只需要在 a 的前面加上 “::”域作用限定符就可以了,“::a”它表示 a 訪問的是限定符左邊的內容,現在左邊沒有給名稱,表示a作用域是全域性域,這時,就可以訪問到main函式外面的 a 了,它的輸出結果是10。這裡就有了的概念。

也就是說在C語言中,同一個域中不可以取同名的變數,這也是根據它的命名規則來的。在這樣的規則下,我們也不可以把變數名定義成C語言的關鍵字,因為這裡會有衝突,系統會搞不懂你到底表示的什麼意思。

所以在C++中,開發者把這一點做了優化,就有了名稱空間的由來——namespace。

那麼我們知道了名稱空間是用來幹什麼的之後,就要來看看怎麼定義名稱空間。

定義名稱空間,需要使用到namespace關鍵字,後面跟名稱空間的名字,然後接一對{}即可,{}中即為命名
空間的成員。

namespace N
{
	int printf = 100;
	int strstr = 200;
}
int main()
{
	printf("%d\n",N::strstr);
	printf("%d\n",N::printf);
	system("pause");
	return 0;
}

如上程式碼,用了namespace之後,我就可以將函式名或者任意關鍵字定義成一個變數並且正常使用。在這裡,名稱空間 N 限制了 printf 和 strstr 只屬於該作用域,作為一個隔離,不怕和別人衝突。