1. 程式人生 > >【C++入門】:名稱空間的使用

【C++入門】:名稱空間的使用

  • 名稱空間

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

  • 名稱空間定義

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

  • 名稱空間用法

要說名稱空間,首先得知道一個概念:域作用限定符,來看一個程式碼:

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

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

這個程式碼中a輸出的是多少?,一執行,發現輸出的a是20,毫無疑問,這是因為,我們知道在訪問時,遵循就近原則。那如果我就是想訪問main函式外面的a呢?這時候,我們只需給a加上域作用限定符(::)就可以訪問到了,即

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

int a = 10;//全域性變數(域)
int main()
{
	int a = 20;
	printf("%d\n", ::a);//域作用限定符前面沒有東西,就預設是全域性域
	printf("hello world\n");
	system("pause");
	return 0;
}

引入了域作用限定符,名稱空間就好理解了。我們知道在c語言中,定義變數的時候,一般不能使用C語言關鍵字來定義變數,如果一旦定義了,就會出現變數重定義的問題,為了解決這個問題,在c++中就有了名稱空間。

  • 名稱空間三種用法:

  • (1)名稱空間裡面成員不展開,需要什麼,指定什麼(加名稱空間名稱及作用域限定符)
#include <iostream>

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

namespace bit//名稱空間
{
	int strstr = 10;//名稱空間成員
	int printf = 20;//名稱空間成員
}
int main()
{
	int a = 20;
	printf("%d\n", bit::printf);//指定printf屬於bit這個域
	printf("%d\n",bit::strstr);//指定strstr屬於bit這個域
	system("pause");
	return 0;
}

分析:因為printf和strstr分別是包在<stdio.h>和<string.h>裡面,如果不適用名稱空間指定的話,程式碼肯定是跑不過的。

  • (2)展開名稱空間裡面的全部成員(使用using namespace+名稱空間名稱引入)
#include <iostream>

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

namespace bit
{
	int strstr = 10;
	int printf = 20;
}
using namespace bit;//把bit這個名稱空間裡面的東西全部展出來
int main()
{
	int a = 20;
	printf("%d\n", bit::printf);
	printf("%d\n",bit::strstr);
	system("pause");
	return 0;
}

分析:這時程式碼肯定跑不過,會出現命名衝突的問題。需要說明的是一般我們很少使用把名稱空間全部展開這種方式。那麼什麼時候才適合用它呢?就是bit裡面定義的東西跟外面的東西沒有衝突時,才把它展開。

舉例:比如,我們要多次訪問a,這時,就可以把a展開了

#include <iostream>

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

namespace bit
{
	/*int strstr = 10;
	int printf = 20;*/
	int a = 20;
}
using namespace bit;//把bit這個名稱空間裡面的東西全部展出來
int main()
{
	printf("%d\n", a);
	printf("%d\n",bit::a);//這樣也是可以的
	system("pause");
	return 0;
}

分析:此時展開名稱空間。就可以直接訪問a

  • (3)展開名稱空間部分內容(使用using 將名稱空間中部分內容引入)
#include <iostream>

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

namespace bit
{
	int strstr = 10;
	int a = 10;
}
using bit::a;//指定把bit裡面的a展出來
int main()
{
	printf("%d\n", a);
	system("pause");
	return 0;
}

分析:此時想訪問a,又不能用using namespace bit;,這樣會出現命名衝突,但是使用using bit::a,指定把bit裡面的a展出來,就可以正常訪問a了

以上就是關於名稱空間的三種用法。

最後一個要說明的是:名稱空間裡面的內容,即可以定義變數,也可以定義函式,還可以進行巢狀。

注意:一個名稱空間就是定義了一個新的作用域,名稱空間中的所有內容都侷限於該名稱空間中。