国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

詳解C++中的命名空間(namespace)

這篇具有很好參考價值的文章主要介紹了詳解C++中的命名空間(namespace)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

個人主頁:平行線也會相交
歡迎 點贊?? 收藏? 留言? 加關(guān)注??本文由 平行線也會相交 原創(chuàng)
收錄于專欄【C++之路】
詳解C++中的命名空間(namespace)

C++關(guān)鍵字(C++98)

在C++中,總共有63個關(guān)鍵字,大家還記得在C語言中有多少個關(guān)鍵字嗎,沒錯,在C語言中總共有32個關(guān)鍵字。
下面是C++的關(guān)鍵字:

asm do if auto
return try continue double
inline short typedef for
bool dynamic_cast int signed
typeid public break else
long sizeof typename throw
case enum mutable static
union wchar_t catch explicit
namespace static_cast unsigned default
char export new struct
using friend class extern
operator switch virtual register
const false private template
void true const_cast float
protected this volatile while
delete goto reinterpret_cast

命名沖突

詳解C++中的命名空間(namespace)
可以看到:上述代碼我們可以通過。
那現(xiàn)在這段代碼呢?請看:
詳解C++中的命名空間(namespace)

我們發(fā)現(xiàn)rand出現(xiàn)了重定義的錯誤那為什么rand發(fā)生了沖突了呢?其實rand這里是跟發(fā)生了沖突。std中有一個函數(shù)也叫rand,所以就會發(fā)生命名沖突的問題。
發(fā)生命名沖突的原因有兩種:

1.跟庫里發(fā)生沖突。
2.互相之間發(fā)生沖突。

其實命名沖突這個問題挺麻煩的,我們并不知道庫中是否有這個變量,在這個基礎(chǔ)上,如果我們又重新定義了這個變量,此時就會出現(xiàn)命名沖突的問題。為了解決命名沖突的問題,就引出了命名空間。

命名空間

嗯,namespace就是命名空間的意思,也是C++中的一個關(guān)鍵字,就是用來解決命名沖突的問題的。
這里,我們先來引出一個問題,請看下面代碼:

#include<iostream>
using namespace std;
int main()
{

	return 0;
}

在C++中,為什么我們一般要加上using namespace std;呢?

命名空間的定義

命名空間,即namespace,后面跟著命名空間的名字,然后接一對{},{}中的內(nèi)容就是命名空間的成員
命名空間namespace可以定義一個出來。
舉個例子:
詳解C++中的命名空間(namespace)
我們可以看到上圖的代碼出現(xiàn)了rand重定義的問題,我們?nèi)绻幌氤霈F(xiàn)這個問題,就可以用namespace定義一個域出來以解決重定義這個問題。
請看解決方法:

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

//域
namespace hello
{
	//hello這個域就會把域中的內(nèi)容(rand)進(jìn)行一個隔離
	//這里要注意,域中的rand與主函數(shù)中的rand不是一回事。
	int rand = 0;
}

int main()
{
	printf("%d\n", rand);
	return 0;
}

詳解C++中的命名空間(namespace)
這個運行結(jié)果也說明了域中的rand與主函數(shù)中的rand不是一回事。

局部域和全局域的關(guān)系

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

int a = 0;

int main()
{
	int a = 1;
	printf("%d\n", a);
	return 0;
}

上面這個代碼中的兩個a就可以同時存在。
我們把主函數(shù)外面的a看作是全局域中的a,把主函數(shù)里面中的a看作是局部域中的a。同時,我們還要知道一個點局部域和全局域既影響訪問,也影響生命周期。域分為好幾種,作用域只是域中的一種。
域總共分為下面四種:

類域
命名空間域
局部域
全局域

我們來運行上面的代碼:

詳解C++中的命名空間(namespace)
因為局部域中的a優(yōu)先,所以這里打印出來的是局部域中變量a的值,即打印出來的是1,如果我們想打印全局域中的a中的值怎么辦呢?我們可以這樣:

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

int a = 0;

int main()
{
	int a = 1;
	printf("%d\n", a); 

	//  ::稱為域作用限定符
	printf("%d\n",::a);
	return 0;
}

詳解C++中的命名空間(namespace)
運行結(jié)果如上圖,我們看到我們打印出來的0就是全局域中的a的值。
關(guān)于局部域和全局域的關(guān)系是這樣的:

我們是默認(rèn)從局部域開始搜索的,即局部優(yōu)先;當(dāng)然,如果局部沒有的話,我們就會去全局域進(jìn)行搜索,所以有局部先訪問局部,沒有局部才會去訪問全局。

我們通過域作用限定符::可以去直接訪問全局域。即上面的代碼,注意觀察,::的前面是不加任何東西的(注意前面不需要我們加空格),意思就是我們直接去訪問全局域。

命名空間域

詳解C++中的命名空間(namespace)
上圖代碼中總共有三個域(局部域、全局域、命名空間域),每個域中都有一個變量a,我們如何去訪問這三個作用域中的a呢,請看下面:
詳解C++中的命名空間(namespace)
我們現(xiàn)在把全局域中的變量a注釋掉看看運行結(jié)果,所以來看下面這段代碼的運行結(jié)果:
詳解C++中的命名空間(namespace)
我們發(fā)現(xiàn)程序根本運行不了,所以這里就報錯了。
所以我們通過這個程序發(fā)現(xiàn),這個程序并不會去到命名空間里去進(jìn)行搜索;那這里就會引出一個新的問題,程序什么時候才會去到命名空間域中去進(jìn)行搜索呢?
這里有兩種可能性會去搜索命名空間域中的內(nèi)容

1.我們展開了命名空間域
2.指定訪問命名空間

我們先來看第一種(展開命名空間)
詳解C++中的命名空間(namespace)
如果我們不展開的話:

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

int a = 2;

namespace hello
{
	int a = 1;
}

//展開命名空間
//using namespace hello;

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

上面就是我們不對命名空間進(jìn)行展開,上面代碼中的3個變量a依然可以同時存在。

補充一點,我們C++中常用的using namespace std;展開的是std標(biāo)準(zhǔn)庫中的命名空間。
現(xiàn)在如果我們想訪問命名空間中的變量a,我們可以采用第二種方式(指定訪問命名空間)

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

int a = 2;

namespace hello
{
	int a = 1;
}

//展開命名空間
//using namespace hello;

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

詳解C++中的命名空間(namespace)
上面的代碼中我們雖然沒有對命名空間進(jìn)行展開,但是我們指定了命名空間。
現(xiàn)在新的問題來了,如果我們把命名空間展開會發(fā)生什么呢?請看:

詳解C++中的命名空間(namespace)
上述代碼中,我們把命名空間里的內(nèi)容進(jìn)行展開,展開的意思就是編譯時把命名空間里的內(nèi)容暴露到全局,是是否會到命名空間里面去搜索,,而此時全局域中已經(jīng)有一個變量a了,所以會出現(xiàn)上圖a不明確的問題。
所以我們現(xiàn)在再來看namespace這個關(guān)鍵字發(fā)現(xiàn)它并不友好,它會把我們的命名空間進(jìn)行展開,而我們?yōu)槭裁匆衙臻g進(jìn)行展開呢?命名空間進(jìn)行展開的意義何在?

命名空間就是為了防止自己的內(nèi)容與其它域發(fā)生沖突而設(shè)立的。

小結(jié)

我們雖然可以指定指定命名空間里面的內(nèi)容,但是這樣不是很方便,所以有些地方有些時候我們會把命名空間進(jìn)行展開,一旦我們把命名空間進(jìn)行展開,就可能會出現(xiàn)一系列問題。比如,重定義問題、某個變量不明確等等問題。所以,我們以后不要輕易使用using namespace。
現(xiàn)在,我們再來看開頭還沒有解決的問題:
詳解C++中的命名空間(namespace)
我們既然無法把rand定義在全局域中,那就直接把rand定義在一個命名空間域并不對這個域進(jìn)行展開就好了,請看:
詳解C++中的命名空間(namespace)
詳解C++中的命名空間(namespace)
所以我們利用命名空間就可以解決開頭rand重定義的問題,但是這個問題C語言無法解決,而C++中的命名空間就可以解決。

命名空間中可以定義哪些內(nèi)容

在命名空間中,我們可以定義很多東西,比如結(jié)構(gòu)體類型、定義變量、定義函數(shù)等都是可以的。請看舉例:

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

namespace hello
{
	int rand = 10;
	
	int Add(int left, int right)
	{
		return left + right;
	}

	struct Node
	{
		struct Node* next;
		int data;
	};
}

int main()
{
	return 0;
}

嵌套命名空間

命名空間是可以進(jìn)行嵌套的,比如:

//嵌套命名空間
#include<stdio.h>
#include<stdlib.h>

namespace N1
{
	int a = 0;
	int b = 1;
	int Add(int left, int right)
	{
		return left + right;
	}

	namespace N2
	{
		int a = 1;
		int c = 0;
		int d = 0;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

補充一點:C++中的C++庫里的所有東西都會被分裝在std命名空間中。stl是C++標(biāo)準(zhǔn)庫的一部分cout等都在C++標(biāo)準(zhǔn)庫中。

我們?nèi)绾卧L問嵌套命名空間呢?請看舉例:
詳解C++中的命名空間(namespace)

我們知道不同的域可以有同名名變量,但是同一個域不能有同名變量。我們同一個命名空間如若給非要給同樣的變量,這個時候嵌套命名空間就派上用場了。
我們在平常最常見的C++代碼大體是長這樣的,請看:

#include<iostream>
using namespace std;

int main()
{
	return 0;
}

其實這樣直接展開的話會有風(fēng)險,我們定義的如果跟庫中的重名,就報錯了。所以項目里面盡量不要去進(jìn)行展開。注意,展開不一定會報錯。如果是日常練習(xí)的話(代碼少),就可以直接展開;那如果是項目中的話,前往不要隨意對命名空間進(jìn)行展開。建議直接訪問指定命名空間,比如:
詳解C++中的命名空間(namespace)
但是如果我們一個項目中有非常多cout的話,我們不可能要輸入非常多次的std::,所以這里推薦一種非常實用的方式,請看:
詳解C++中的命名空間(namespace)
這樣的話,我們就不需要把整個命名空間進(jìn)行展開了,我們直接把最常用的展開就可以了。

總結(jié)

命名空間的存在是為了解決C語言的一個缺陷,我們知道C語言存在命名沖突的問題,為了解決命名沖突問題,于是C++就引入了命名空間的內(nèi)容。命名空間是對全局域的比如變量、函數(shù)、類型就行分裝,以防止之間發(fā)生沖突。再次強調(diào)命名空間解決的是全局域的沖突,局部域基本上沒有命名空間的問題,局部域的話就相當(dāng)于在函數(shù)里面,函數(shù)本身就是一個局部域,不同的函數(shù)之間可以定義同名的變量(因為不同的域里面可以定義同名的變量)。
我們對命名空間進(jìn)行搜索主要有三種方式:第一:展開命名空間;第二:直接訪問命名空間;第三:訪問某個。(其中第二種第三種都是通過域作用限定符來進(jìn)行操作的)。
同時,我們在對命名空間進(jìn)行展開的時候需要格外小心,不要輕易的對命名空間進(jìn)行展開。
好了,以上就是C++中命名空間的內(nèi)容,算是C++中的開頭。
就到這里吧,下次見嘍各位,再見啦?。。?/strong>
詳解C++中的命名空間(namespace)文章來源地址http://www.zghlxwxcb.cn/news/detail-417860.html

到了這里,關(guān)于詳解C++中的命名空間(namespace)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C++——命名空間(namespace)

    C++——命名空間(namespace)

    目錄 1. C語言命名沖突 2. 命名空間定義 3. 命名空間使用 可能大家在看別人寫的C++代碼中,在一開始會包這個頭文件:#includeiostream 這個頭文件等價于我們在C語言學(xué)習(xí)到的#includestdio.h,它是用來跟我們的控制臺輸入和輸出的,這里簡要提下,后續(xù)詳談。 除了上面這個頭文件,

    2024年02月10日
    瀏覽(20)
  • 【C++初階】命名空間 namespace

    【C++初階】命名空間 namespace

    在正式進(jìn)入C++前,我們需要先了解了解C++。顧名思義,C++是基于C的一種編程語言,相較于C,C++寫出來的代碼更簡潔,有時候C需要幾百行代碼,而C只需要幾十行就可以解決,C++也很好的解決了C中存在的一些問題,例如: 命名沖突。 C++的命名空間 就能很好的解決這個問題。

    2023年04月19日
    瀏覽(21)
  • C++篇 ---- 命名空間namespace

    C++篇 ---- 命名空間namespace

    由于在c語言中在定義時可能會出現(xiàn)重命名現(xiàn)象,造成空間沖突,c語言中有命名沖突:1 和庫沖突。2 互相之間的沖突,變量命名沖突。所以c++中就有了對其改進(jìn)的namespace,針對重定義,解決空間沖突。 以下是c語言實現(xiàn)的代碼 這里會報錯是由于變量rand與庫函數(shù)中的ra

    2023年04月16日
    瀏覽(22)
  • 【C++技能樹】NameSpace --命名空間的使用

    【C++技能樹】NameSpace --命名空間的使用

    ? Halo,這里是Ppeua。平時主要更新C語言,C++,數(shù)據(jù)結(jié)構(gòu)算法......感興趣就關(guān)注我吧!你定不會失望。 ??個人主頁:主頁鏈接 ??算法專欄:專欄鏈接 ????? 我會一直往里填充內(nèi)容噠! ??LeetCode專欄:專欄鏈接? ???? 目前在刷初級算法的LeetBook 。若每日一題當(dāng)中有力所能

    2023年04月16日
    瀏覽(23)
  • k8s學(xué)習(xí)筆記(四):命名空間(namespace)詳解

    k8s學(xué)習(xí)筆記(四):命名空間(namespace)詳解

    Kubernetes中的Namespace是一種用于在 集群內(nèi)部組織和隔離資源 的機制。一個Namespace可以看作是一個 虛擬的集群 ,它將物理集群劃分為多個邏輯部分,每個部分都有自己的一組資源(如Pod、Service、ConfigMap等)。 Namespace 適合用于 隔離不同用戶創(chuàng)建的資源 用于給集群中的 任何對

    2024年02月12日
    瀏覽(21)
  • Kubernetes集群命名空間(Namespace)

    Namespace是對一組資源和對象的抽象集合. 常見的 pod, service, deployment 等都是屬于某一個namespace的(默認(rèn)是 default) 不是所有資源都屬于namespace,如nodes, persistent volume,namespace 等資源則不屬于任何 namespace 使用 kubectl get all --namespace=命名空間名稱 可以查看此命名空間下的所有資源

    2024年02月16日
    瀏覽(22)
  • 【C++】命名空間詳解

    【C++】命名空間詳解

    目錄 前言 命名空間的定義 ?命名空間的使用 在C/C++中,變量、函數(shù)和后面要學(xué)到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存 在于全局作用域中,可能會導(dǎo)致很多沖突。 使用命名空間的目的是對標(biāo)識符的名稱進(jìn)行本地化 , 以 避免命名沖突或名字污染 ,namespa

    2024年01月25日
    瀏覽(30)
  • 【C#】【命名空間(namespace)】.NET6.0后支持的頂級語句使用問題

    創(chuàng)建C#項目且使用.Net6.0以上的版本時,默認(rèn)code會使用頂級語句形式: 1、略去static void Main(String[ ] args)主方法入口; 2、隱式使用(即隱藏且根據(jù)代碼所需要的類自動調(diào)用)其他命名空間(包括): using System; using System.IO; using System.Collections.Generic; using System.Linq; using System.Net

    2024年02月08日
    瀏覽(27)
  • 【C++那些事兒】初識C++ 命名空間,C++中的輸入輸出以及缺省函數(shù)

    【C++那些事兒】初識C++ 命名空間,C++中的輸入輸出以及缺省函數(shù)

    君兮_的個人主頁 即使走的再遠(yuǎn),也勿忘啟程時的初心 C/C++ 游戲開發(fā) Hello,米娜桑們,這里是君兮_,數(shù)據(jù)結(jié)構(gòu)和算法初階更新完畢,我們繼續(xù)來擴充我們的知識面,今天我們從認(rèn)識C++開始來帶大家學(xué)習(xí)C++,我之前看過一套書叫做《明朝那些事兒》,把本來枯燥的歷史講的生動

    2024年02月08日
    瀏覽(36)
  • 【C++初階】關(guān)鍵字&命名空間&缺省函數(shù)&函數(shù)重載入門必看?。?!超詳解!??!

    【C++初階】關(guān)鍵字&命名空間&缺省函數(shù)&函數(shù)重載入門必看!?。〕斀猓。?!

    ?========================================================================= 主頁點擊直達(dá): 個人主頁 我的小倉庫:代碼倉庫 C語言偷著笑: C語言專欄 數(shù)據(jù)結(jié)構(gòu)挨打小記: 初階數(shù)據(jù)結(jié)構(gòu)專欄 Linux被操作記:Linux專欄 LeetCode刷題掉發(fā)記: LeetCode刷題 算法: 算法專欄? C++頭疼記: C++專欄 計算機

    2024年02月07日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包