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

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

這篇具有很好參考價(jià)值的文章主要介紹了回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??前情提要??

本章節(jié)是C++深度剖析封裝細(xì)節(jié)&特性的相關(guān)知識~

接下來我們即將進(jìn)入一個全新的空間,對代碼有一個全新的視角~

以下的內(nèi)容一定會讓你對C++有一個顛覆性的認(rèn)識哦?。?!

以下內(nèi)容干貨滿滿,跟上步伐吧~


作者介紹:

?? 作者: 熱愛編程不起眼的小人物??
??作者的Gitee:代碼倉庫
??系列文章&專欄推薦: 《刷題特輯》、 《C語言學(xué)習(xí)專欄》、《數(shù)據(jù)結(jié)構(gòu)_初階》 、《C++輕松學(xué)_深度剖析_由0至1》、《Linux - 感受系統(tǒng)美學(xué)》

??我和大家一樣都是初次踏入這個美妙的“元”宇宙?? 希望在輸出知識的同時(shí),也能與大家共同進(jìn)步、無限進(jìn)步??
??這里為大家推薦一款很好用的刷題網(wǎng)站呀??點(diǎn)擊跳轉(zhuǎn)



??本章重點(diǎn)

  • 探索構(gòu)造函數(shù)的奧秘&新型初始化方式

    • 初始化列表

    • 缺省值

  • 探索C++對類的“神奇優(yōu)化”

  • 了解匿名對象的概念

  • 認(rèn)識并深入了解“友元”

  • 認(rèn)識并深入了解“內(nèi)部類”


??一.回爐&剖析構(gòu)造函數(shù)

??構(gòu)造函數(shù):

  • 在前文(可>點(diǎn)擊<跳轉(zhuǎn)食用呀)對構(gòu)造函數(shù)的鋪墊下,我們繼續(xù)細(xì)致深入了解構(gòu)造函數(shù)內(nèi)部的細(xì)節(jié)

??讓我們來意義揭曉構(gòu)造函數(shù)還有什么不為人知的秘密吧~


??Ⅰ.初始化列表

??初始化&賦初值: 在了解新知識前,我們先來回憶一下這部分內(nèi)容,以便后續(xù)的更好深入

  • 初始化:簡單來說就是在定義一個變量的時(shí)候?qū)ζ渲颠M(jìn)行初始化賦值,就叫做變量的初始化,Eg:

    • int a; 為定義了一個變量a,其中初始化的過程則由編譯器將其初始化成隨機(jī)值

    • int a = 0; 為定義了一個變量a,且數(shù)值被初始化成數(shù)值0

  • 賦初值:簡單來說就是人為定義一個變量的初始值是多少,即給一個變量進(jìn)行賦值

??構(gòu)造函數(shù)初始化:

  • 在之前的學(xué)習(xí)中,我們已經(jīng)了解了構(gòu)造函數(shù)中的其中一種初始化方式:函數(shù)體內(nèi)賦值

    即在構(gòu)造函數(shù)內(nèi),我們顯示的為成員變量賦上初值

    回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

  • 特別注意: 上述過程只能稱作賦初值,并不能稱作初始化,這是因?yàn)槌蓡T變量已經(jīng)在進(jìn)入函數(shù)體內(nèi)進(jìn)行賦值前定義了,即當(dāng)成員變量進(jìn)入到函數(shù)體內(nèi)時(shí),已經(jīng)有一個初值【編譯器初始化的隨機(jī)值】,這也就是為什么函數(shù)體內(nèi)的賦值語句只能稱作賦初值,而不是初始化

  • 總結(jié): 初始化只能初始化一次,而構(gòu)造函數(shù)體內(nèi)可以多次賦值

  • 但有一種獨(dú)特的方式,可以達(dá)到給成員變量初始化:初始化列表初始化

??初始化列表

  • 以一個 冒號開始,接著是一個以 逗號分隔的數(shù)據(jù)成員列表,每個 “成員變量” 后面跟一個 放在括號中的初始值或表達(dá)式 進(jìn)行成員變量的初始化

  • Eg:回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

??補(bǔ)充:

  • 對于類來說,只要沒有被實(shí)例化出對象,就沒有真正給成員變量開辟空間

  • 也就是說,我們書寫的類中的成員變量僅僅是聲明而已,并沒有真正被被定義出來

  • 只有在用類實(shí)例化出一個對象的時(shí)候,編譯器才真正開辟了這個類的空間,而成員變量也在此時(shí)被定義出來且同時(shí)完成了初始化【若沒有顯示定義構(gòu)造函數(shù)(傳參構(gòu)造……),則編譯器會調(diào)用默認(rèn)構(gòu)造函數(shù)(即不用傳參的構(gòu)造函數(shù):全缺省構(gòu)造函數(shù)、無參構(gòu)造函數(shù)、編譯器默認(rèn)生成的)】

??舉個例子:

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

  • 如上圖,若成員為const所修飾的變量的時(shí)候,我們是無法實(shí)例化出一個對象的

  • 原因就在于: 我們無法通過默認(rèn)構(gòu)造函數(shù)中的函數(shù)體內(nèi)賦值,去給成員變量const int _n賦上一個值,這是因?yàn)樽兞勘?code>const所修飾,我們只有在這個 變量定義的時(shí)候才可以初始化它的值 ,否則在后續(xù)代碼中我們是無法修改它的值的

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

  • 如上我們就可以知道如果我們使用的是初始化列表進(jìn)行賦值的話,是可以改變const int _n這個值的

??所以:

  • 我們可以認(rèn)為成員變量的定義階段是在初始化列表處進(jìn)行定義且初始化的

  • 這也就是為什么上述類型可以被初始化,是因?yàn)檫@個變量的 定義階段 就是在初始化列表處進(jìn)行定義的,所以我們可以在初始化列表(定義)處對其進(jìn)行初始化

?特別注意:

  • 初始化列表僅能在構(gòu)造函數(shù)(構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù))中使用

  • 每個成員變量在 初始化列表 中只能出現(xiàn)一次【即初始化只能初始化一次】

  • 若類中包含以下成員變量,必須放在初始化列表位置進(jìn)行初始化【因?yàn)橐韵鲁蓡T需要在定義時(shí)就初始化】:

    • 引用成員變量

    • const成員變量

    • 自定義類型成員(該類沒有默認(rèn)構(gòu)造函數(shù))

?有同學(xué)可能會疑惑 自定義類型成員 用到初始化列表的是什么情況呢

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

  • 補(bǔ)充: 對于自定義類型成員變量也一樣,在初始化列表階段其實(shí)就是這個自定義成員變量的定義階段,所以在定義的時(shí)候自定義成員變量便會自動調(diào)用其 默認(rèn)構(gòu)造函數(shù) 進(jìn)行初始化,也就是說:自定義成員變量的默認(rèn)構(gòu)造函數(shù)其實(shí)是在初始化列表初始化階段就調(diào)用了

  • 在以上的這種情況中,我們可以發(fā)現(xiàn)是錯誤的,原因是在于自定義成員變量t2是不存在 默認(rèn)構(gòu)造函數(shù)的 而是 傳參構(gòu)造函數(shù),即此時(shí)編譯器是無法自動調(diào)用其構(gòu)造函數(shù)去初始化其成員變量的,需要我們傳參調(diào)用

  • 于是在這種情況下,我們便可以很好的利用初始化列表的特性,在自定義成員變量被定義的時(shí)候顯示的去調(diào)用其構(gòu)造函數(shù),這樣就能達(dá)到 傳參構(gòu)造 的效果

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

??易混點(diǎn): 若同時(shí)存在 初始化列表初始化函數(shù)體內(nèi)賦值,最終會采用哪個地方的值呢?

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

  • 以上便可以看到: 對于 內(nèi)置類型 來說,最終采取的函數(shù)體內(nèi)賦值作為變量值

  • 總結(jié):

    • 對于 內(nèi)置類型 來說,在經(jīng)過初始化列表初始化后,還是會經(jīng)過函數(shù)體內(nèi)賦值

    • 對于 自定義類型成員(存在默認(rèn)構(gòu)函數(shù)) 來說,建議使用初始化列表進(jìn)行初始化,效率更高

???重要內(nèi)容:

  • 成員變量在類中 聲明次序 就是其在初始化列表中的 初始化順序

  • 簡單來說: 就是成員變量的 定義順序 是由 成員變量在類中的 聲明次序 所決定的

  • 與其在初始化列表中的初始化語句先后次序無關(guān)

  • 建議: 養(yǎng)成 類中成員變量聲明的順序初始化列表中初始化的順序 保持一致

?綜上:

  • 初始化列表是成員變量定義的地方

  • 所以可以盡量多使用初始化列表進(jìn)行成員的初始化,因?yàn)榧词刮覀儾粚懗蓡T也需要進(jìn)行定義,也還是會經(jīng)歷初始化列表這一步的

  • 上述就是初始化列表的全部內(nèi)容啦~


?? Ⅱ.神奇的構(gòu)造優(yōu)化

??構(gòu)造函數(shù)中的優(yōu)化:

  • 在C++中,對于對象的構(gòu)造存在一種神奇的構(gòu)造優(yōu)化,接下來就讓我們一同揭秘吧~

  • 在此之前,先補(bǔ)充一個小知識點(diǎn):隱式類型轉(zhuǎn)換

    • 在之前有提到過,只要發(fā)生類型偏差,編譯器都會自動生成一個臨時(shí)變量去接收類型變換后的值,再進(jìn)行賦值,而非直接轉(zhuǎn)換本身變量的類型去進(jìn)行賦值【這里可以點(diǎn)擊>回顧<跳轉(zhuǎn)食用呀】

    • 而對于對象的構(gòu)造,也存在一種隱式類型轉(zhuǎn)換

??舉個例子:

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

  • 上述可以發(fā)現(xiàn),對于aa2這個對象竟然可以支持這種構(gòu)造方式

  • 本質(zhì)就是:因?yàn)?code>100是整形,而aa2是自定義類型,是不可能直接賦值的,所以會發(fā)生隱式類型轉(zhuǎn)換

    • 1??因?yàn)榘l(fā)生了類型偏差,編譯器會自動產(chǎn)生一個類型與接收對象相同的類型去接收拷貝數(shù)據(jù)

    • 【即編譯器相當(dāng)于拿100去構(gòu)造了一個臨時(shí)對象:A tmp(100);

    • 2??然后再利用這個臨時(shí)對象去賦值給接收對象

    • 【即編譯器再將剛創(chuàng)建的臨時(shí)對象去賦值:A aa2(tmp);

    • 綜上:這里的對象構(gòu)造看似也只有一條語句,實(shí)則編譯器做了以上兩步操作:構(gòu)造臨時(shí)對象?拷貝構(gòu)造【語法意義上】

  • 但真實(shí)的情況是: 編譯器對隱式類型轉(zhuǎn)換其實(shí)做了特別的優(yōu)化

    • 將上述的兩步操作優(yōu)化為一步操作了,優(yōu)化成A aa2(100);一條語句了

    • 這也就是為什么上述的兩步操作被稱為語法意義上,因?yàn)閷?shí)際情況是編譯器發(fā)生優(yōu)化了,直接進(jìn)行拿值進(jìn)行構(gòu)造了

?如果不想讓編譯器發(fā)生如上的隱式類型轉(zhuǎn)換:

  • 可以給構(gòu)造函數(shù)加上explicit關(guān)鍵字修飾

  • explicit修飾構(gòu)造函數(shù),將會禁止單參構(gòu)造函數(shù)的隱式轉(zhuǎn)換

  • 回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

?綜上:

  • 以上就是發(fā)生在構(gòu)造函數(shù)中的神奇優(yōu)化的全部內(nèi)容啦~

?? Ⅲ.匿名對象

??匿名對象:

  • 簡單來說:就是沒有名字的對象

  • 而且匿名對象的生命周期僅僅只有在構(gòu)造匿名對象的一行代碼中,并不是隨著主函數(shù)的銷毀而銷毀的

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

?匿名對象的意義:

  • 在某種場景下,需要調(diào)用類中的一個函數(shù)去“搞事情”,且只需要調(diào)用此函數(shù)一次

  • 如果是平常的方法,我們構(gòu)造一個普通對象,從而去調(diào)用函數(shù),但函數(shù)我們只需要調(diào)用一次,此時(shí)這個普通對象就會一直占用空間,直至程序結(jié)束而調(diào)用析構(gòu)

  • 而此時(shí),匿名對象就可以起到很大的作用,因?yàn)槲覀儍H調(diào)用這個函數(shù)一次,所以匿名對象就可以在一行代碼中幫我們?nèi)フ{(diào)用,執(zhí)行完這行代碼去執(zhí)行下一句的時(shí)候,匿名對象生命周期結(jié)束,便會自動析構(gòu)

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

??什么場景使用:

  • 定義一個對象要用,但僅在這一行的代碼中使用,其他地方不再使用

?綜上:

  • 匿名對象的使用可以使程序更加靈活、方便、便捷

  • 上述就是匿名對象的概念啦~


??二.static成員

??靜態(tài)成員:

  • 聲明為 static的類成員 稱為 類的靜態(tài)成員

  • static修飾的 成員變量,稱之為 靜態(tài)成員變量

  • static修飾的 成員函數(shù),稱之為 靜態(tài)成員函數(shù)

  • 簡單來說:就是被static所修飾的成員都為靜態(tài)成員,即被修飾的成員不再屬于單個對象的,而是屬于這個類的,這個類中的所有對象【即所有對象共用此成員,多個對象中的靜態(tài)成員其實(shí)都是在同一塊空間上的】,而且靜態(tài)成員的生命周期是全局的

??靜態(tài)成員的特征:

  • 靜態(tài)成員為所有類對象所共享,不屬于某個具體對象的實(shí)例

  • 靜態(tài)成員變量必須在類外定義(初始化),定義時(shí)不需要添加static關(guān)鍵字

  • 類靜態(tài)成員可用類名::靜態(tài)成員或者對象.靜態(tài)成員(靜態(tài)變量為私有成員就不可以了)來訪問

  • 靜態(tài)成員函數(shù) 沒有 隱藏的 this指針,不能訪問任何非靜態(tài)成員

  • 靜態(tài)成員和類的普通成員一樣,也有public、protectedprivate這三種訪問級別,也可以具有返回值

?特別注意:

  • 1??靜態(tài)成員變量生命周期是全局的,但變量并不能在構(gòu)造函數(shù)內(nèi)初始化,因?yàn)樽兞看鎯τ陟o態(tài)區(qū)【即靜態(tài)變量屬于這個類的成員變量,但并不存儲于這個類的存儲區(qū)域】

  • 2??編譯器專門給 靜態(tài)成員變量的定義初始化,開了個后門:可以在全局中通過::(域作用限定符)去突破類域,初始化靜態(tài)成員變量(即使靜態(tài)成員變量是私有成員也是可以的,在這里不受訪問限制符限制,因?yàn)檫@是編譯器專門留給初始化設(shè)置的后門)

  • 3??靜態(tài)成員函數(shù):只需要突破類域(即告訴編譯器要找的函數(shù)是屬于哪個類的)就可以訪問得到,并不需要構(gòu)造一個對象才能調(diào)用

  • 4??靜態(tài)成員變量:若想訪問,會受到訪問限定符的限制,若為私有成員,則需要設(shè)立一個靜態(tài)成員函數(shù)去獲取【所以一般訪問靜態(tài)成員變量的話,會給一個靜態(tài)成員函數(shù)】

??面試題: 實(shí)現(xiàn)一個類,去計(jì)算中程序中創(chuàng)建出了多少個類對象

  • 這個題目,就很好體現(xiàn)了靜態(tài)成員的存在的意義

    即我們可以創(chuàng)建一個計(jì)數(shù)器,把每一次類對象的創(chuàng)建都下統(tǒng)計(jì)下來,計(jì)算一共創(chuàng)建了多少個類對象

  • 有了以上想法,便有了以下的想法實(shí)現(xiàn):

    類外面 創(chuàng)建一個計(jì)數(shù)器去記錄:但此方法有個問題就是如何去設(shè)定條件判定類對象創(chuàng)建的時(shí)候記錄下來,所以對于此方法是 不好實(shí)現(xiàn)的

    類里面 創(chuàng)建一個計(jì)數(shù)器(成員變量)去記錄:此方法就 很好實(shí)現(xiàn) 了,因?yàn)轭悓ο髣?chuàng)建時(shí)一定會調(diào)用構(gòu)造函數(shù)的,于是可以在構(gòu)造函數(shù)內(nèi)都做一個記錄,只要調(diào)用就統(tǒng)計(jì)一次,但這個計(jì)數(shù)器是需要屬于這個類的,即這個類的所有對象都是共享這個計(jì)數(shù)器的,而不是分開記錄,這樣最終才能獲得總的類的對象個數(shù)

  • 此時(shí)就可以利用上靜態(tài)成員的特性了,將計(jì)數(shù)器用static修飾,這樣計(jì)數(shù)器就能在這個類中的所有對象中被同時(shí)共用

class A
{
public:
	A()
	{
		n++;
	}

	A(const A& a)
	{
		n++;
	}

	static int GetN()
	{
		return n;
	}

private:
	static int n;
};

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

?綜上:

  • 就是static成員的全部內(nèi)容啦~

  • 靜態(tài)成員函數(shù) 不可以 調(diào)用非靜態(tài)成員函數(shù)

  • 非靜態(tài)成員函數(shù) 可以 調(diào)用類的靜態(tài)成員函數(shù)


??Ⅰ.成員初始化新方式

??C++11成員初始化新方式:

  • C++11支持非靜態(tài)成員變量在聲明時(shí)進(jìn)行初始化賦值,但是要注意這里不是初始化,這里是給聲明的成員變量 缺省值

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)

??如上:

  • 給了成員變量缺省值后,如果類調(diào)用的是默認(rèn)構(gòu)造函數(shù)的話,就會在 初始化列表階段缺省值 去初始化自己【若存在函數(shù)體內(nèi)賦值,最終的賦值還是以函數(shù)體內(nèi)賦值為主】

  • 對于自定義類型成員來說,缺省值僅支持單成員變量的自定義類型,且必須是公有成員【本質(zhì):這里其實(shí)發(fā)生了隱式類型轉(zhuǎn)換,被編譯器優(yōu)化成了傳值構(gòu)造】

?綜上:

  • 就是新型的初始化方式啦~

  • 給缺省值本質(zhì)就是最后一層預(yù)防未初始化的保障,不到萬不得已才使用的

  • 在有缺省值初始化列表初始化、函數(shù)體內(nèi)賦值的情況下,成員變量最終使用的值是函數(shù)體內(nèi)賦值,若沒有函數(shù)體內(nèi)賦值其次使用的是初始化列表初始化的值,最后才是缺省值


??三.友元

??友元:

  • 友元分為:友元類 & 友元函數(shù)

  • 友元本質(zhì)是提供了一種 突破封裝 的方式,有時(shí)提供了便利

  • 但也存在副作用,友元會增加耦合度,破壞了封裝,所以友元不宜多用

??接下來我們就深入“友元”吧~


??Ⅰ.友元函數(shù)

??友元函數(shù):

  • 簡單來說:可以讓 非本類的函數(shù) 訪問到 本類的私有成員變量

  • 即友元函數(shù)可訪問類的私有和保護(hù)成員,但不是類的成員函數(shù)

  • 友元函數(shù) 是定義在類外部的普通函數(shù),不屬于任何類,但需要在 類的內(nèi)部 有一個函數(shù)聲明:frined ? 函數(shù)聲明

??舉個例子:

友元函數(shù) 就可以適用在如下場景中:

class Date
{
public:
	Date(int year, int month, int day)
		 : _year(year)
		 , _month(month)
		 , _day(day)
	 {}
	
	void operator<<(ostream& out) 
	{
		out << _year << "-" << _month << "-" << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};
  • 我們想重載<<(輸出)操作符,對類直接進(jìn)行輸出

  • 但此時(shí)我們可以發(fā)現(xiàn),如果運(yùn)算符重載函數(shù)為成員函數(shù)的話,默認(rèn)是自帶一個參數(shù)Date* this,所以左操作數(shù)變?yōu)?code>Date* this,右操作數(shù)為out

  • 這樣就會導(dǎo)致上述的運(yùn)算符重載函數(shù)其實(shí)是調(diào)不動的,需要_year << out才調(diào)得動,但這樣寫代碼就 失去可讀性了

  • 于是,我們就可以自己實(shí)現(xiàn)一個全局的運(yùn)算符重載函數(shù),去重新排操作數(shù)的順序(即參數(shù)傳參的順序),解決上述問題:

ostream& operator<<(ostream& out,const Date& d ) 
{
	out << d._year << "-" << d._month << "-" << d._day << endl;

	return out;
}
  • 但上述又會出現(xiàn)新的問題,就是在類外無法訪問類中的私有成員,而如果這個函數(shù)成為類的 友元函數(shù) 的話,就可以很好的解決這個問題
class Date
{
public:
	friend ostream& operator<<(ostream& out, const Date& d);

	Date(int year, int month, int day)
		: _year(year)
		, _month(month)
		, _day(day)
	{}

	void operator<<(ostream& out)
	{
		out << _year << "-" << _month << "-" << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << "-" << d._month << "-" << d._day << endl;

	return out;
}
  • 此時(shí)就相當(dāng)于把朋友(外部函數(shù))邀請進(jìn)家(類)里做客,這樣朋友就可以無限制訪問私有成員等等【因?yàn)轭惱餂]有訪問限定符的限制,可以直接訪問】

  • 這也就是為什么說友元函數(shù)不是類的成員函數(shù),因?yàn)榕笥咽冀K是朋友,無法成為家人

?特別注意:

  • 友元函數(shù)不能用 const修飾

  • 一個函數(shù)可以是多個類的友元函數(shù)

  • 友元函數(shù)的調(diào)用與普通函數(shù)的調(diào)用和原理相同

?綜上:

  • 就是友元函數(shù)的全部內(nèi)容啦~

  • 友元函數(shù)解決了可讀性的問題(搶位置問題)

  • 友元函數(shù)可以訪問到類中的私有成員變量


?? Ⅱ.友元類

??友元類:

  • 友元類的所有成員函數(shù)都可以是另一個類的友元函數(shù),都可以訪問另一個類中的非公有成員

  • 友元類聲明:在想要成為其友元類的類中寫上friend ? 類的聲明

?特別注意:

  • 友元關(guān)系是單向的,不具有雙向性

    AB的友元類,那A中的所有成員函數(shù)都是B的友元函數(shù),可以訪問B中所有私有成員變量,但B不可以反過來訪問A

  • 友元關(guān)系不能傳遞

    如果AB的友元類,B也是C的友元類,不代表AC的友元

?綜上:

  • 以上就是友元類的全部內(nèi)容啦~

?? Ⅲ.總結(jié)

  • 如非迫不得已,不建議使用友元,因?yàn)槠浔举|(zhì)是一種破壞封裝的行為

??四.內(nèi)部類

??內(nèi)部類:

  • 如果一個類定義在另一個類的內(nèi)部,這個內(nèi)部類就叫做 內(nèi)部類

  • 此時(shí)這個內(nèi)部類是一個獨(dú)立的類,它不屬于外部類,更不能通過外部類的對象去調(diào)用內(nèi)部類【因?yàn)橥獠款悓?nèi)部類沒有任何優(yōu)越的訪問權(quán)限】

  • 本質(zhì):內(nèi)部類就是外部類的友元類,內(nèi)部類可以通過外部類的對象參數(shù)來訪問外部類中的所有成員,但是外部類不是內(nèi)部類的友元

?特別注意:

  • 內(nèi)部類(友元類、函數(shù)也可以)可以定義在外部類的public、protected、private都是可以的

  • 注意內(nèi)部類(友元類也可以)可以直接訪問外部類中的static、枚舉成員,不需要外部類的對象/類名【因?yàn)橐呀?jīng)突破類域了】

  • sizeof(外部類)=外部類,和內(nèi)部類沒有任何關(guān)系

?綜上:

  • 就是內(nèi)部類的全部內(nèi)容啦~

  • 使用起來基本和友元類無差別,因?yàn)槠浔举|(zhì)就是友元類

  • 只不過友元類是聲明在類內(nèi)部,定義在類外部

  • 內(nèi)部類則直接定義在類內(nèi)部


??總結(jié)

綜上,我們基本了解了C++中的 “封裝細(xì)節(jié)&特性” ?? 的知識啦~

恭喜你的內(nèi)功又雙叒叕得到了提高?。?!

感謝你們的閱讀??

后續(xù)還會繼續(xù)更新??,歡迎持續(xù)關(guān)注??喲~

??如果有錯誤?,歡迎指正呀??

?如果覺得收獲滿滿,可以點(diǎn)點(diǎn)贊??支持一下喲~?

回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)文章來源地址http://www.zghlxwxcb.cn/news/detail-412359.html

到了這里,關(guān)于回爐與剖析C++封裝特性 - 重新認(rèn)識C++,完滿呈現(xiàn)全部內(nèi)部細(xì)節(jié)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 重新認(rèn)識小米

    重新認(rèn)識小米

    被鎂光燈聚焦的企業(yè),總是會被貼上各種標(biāo)簽。 8月14日,小米科技創(chuàng)始人雷軍以“成長”為主題的年度演講,刷遍社交網(wǎng)絡(luò)。提到小米,你首先想到什么?手機(jī)發(fā)燒友、極致性價(jià)比,還是最年輕的500強(qiáng)? 這些都是外界用自己的視角貼上的標(biāo)簽,或許從作為創(chuàng)始人的雷軍的話

    2024年02月12日
    瀏覽(15)
  • 重新認(rèn)識Word——頁眉頁腳

    重新認(rèn)識Word——頁眉頁腳

    我們之前已經(jīng)全面的構(gòu)建了我們的文章,現(xiàn)在我們來了解一下,我們畢業(yè)論文的頁眉(頁面信息)頁腳(頁碼)的設(shè)置。 一份Word文檔是由 字,行,段,頁,節(jié) 組成的,前面幾個還比較好理解,那這個 節(jié) 是干什么的呢?其實(shí)節(jié)就是 不同的格式 ,Word里面不同的章節(jié)可能對頁

    2024年02月01日
    瀏覽(16)
  • 重新認(rèn)識Android中的線程

    重新認(rèn)識Android中的線程

    new Thread:可復(fù)寫Thread#run方法。也可以傳遞Runnable對象,更加靈活。 缺點(diǎn):缺乏統(tǒng)一管理,可能無限制新建線程,相互之間競爭,及可能占用過多系統(tǒng)的資源導(dǎo)致死機(jī)或oom。 AsyncTask,輕量級的異步任務(wù)工具類,提供任務(wù)執(zhí)行的進(jìn)度回調(diào)給UI線程 場景:需要知曉任務(wù)執(zhí)行的進(jìn)度

    2024年02月11日
    瀏覽(22)
  • Kerberos 重新認(rèn)識 From Oracle安全

    https://docs.oracle.com/cd/E24847_01/html/819-7061/seamtm-1.html#scrolltoc Kerberos服務(wù)是一種網(wǎng)絡(luò)身份認(rèn)證協(xié)議,由麻省理工學(xué)院(MIT)開發(fā)。它提供了強(qiáng)大的身份驗(yàn)證功能,用于在計(jì)算機(jī)網(wǎng)絡(luò)中驗(yàn)證用戶和服務(wù)之間的身份。Kerberos采用了一種基于密鑰的認(rèn)證機(jī)制,通過使用加密票證來證實(shí)用戶

    2024年02月12日
    瀏覽(15)
  • 通過Nginx重新認(rèn)識HTTP錯誤碼

    在web開發(fā)過程中,通過HTTP錯誤碼快速定位問題是一個非常重要的技能,同時(shí)Nginx是非常常用的一個實(shí)現(xiàn)HTTP協(xié)議的服務(wù),因此本文結(jié)合二者談?wù)凬ginx對HTTP錯誤碼的處理。 在RFC2616對HTTP協(xié)議做了定義,其對錯誤碼定義分為5大類,依次分為100-199、200-299、300-399、400-499、500-599。 1

    2024年02月07日
    瀏覽(14)
  • Linux安裝MySQL 【重新認(rèn)識MySQL上篇】

    Linux安裝MySQL 【重新認(rèn)識MySQL上篇】

    前言 本文章收錄在MySQL性能優(yōu)化+原理+實(shí)戰(zhàn)專欄,點(diǎn)擊此處查看開篇介紹。 本文摘錄自 ? 小孩子4919《MySQL是怎樣運(yùn)行的:從根兒上理解MySQL》 該篇文章初心是介紹MySQL的安裝,但是隨著后面不斷的學(xué)習(xí),遇到的坑越來越多,導(dǎo)致本篇文章不斷的更新,敬請諒解! 在深層次的

    2024年02月03日
    瀏覽(18)
  • Claude2 AI實(shí)戰(zhàn):重新認(rèn)識我們自己

    Claude2 AI實(shí)戰(zhàn):重新認(rèn)識我們自己

    交流源于內(nèi)心本真的需要,通過交流來降低信息的不對稱,今天的交流對象是一個集大成者的老學(xué)者,當(dāng)然是由 Claude2 扮演,相信會有不一樣的收獲。 角色設(shè)定 你是一名集大成者的年邁學(xué)者,在哲學(xué)、社會學(xué)、歷史、心理學(xué)等方面都有很高的造詣,現(xiàn)在我們針對一些問題進(jìn)

    2024年02月13日
    瀏覽(22)
  • Outlook郵箱不簡單帶你重新認(rèn)識它

    Outlook郵箱不簡單帶你重新認(rèn)識它

    我們都知道微軟公司提供的郵箱產(chǎn)品有兩個,開放免費(fèi)使用Outlook和Hotmail,其實(shí)還有一個Live郵箱,只不過現(xiàn)在不對外開放了,盡管如此,Outlook和Hotmail也是Live的二級域名。 二級域名說明:是父級的子級,同屬一個服務(wù)器。 ? Outlook郵箱有兩大特色: 一、Outlook是跨平臺化產(chǎn)品

    2024年02月05日
    瀏覽(17)
  • 重新認(rèn)識Elasticsearch-一體化矢量搜索引擎

    重新認(rèn)識Elasticsearch-一體化矢量搜索引擎

    2023 哪個網(wǎng)絡(luò)詞最熱?我投“生成式人工智能”一票。過去一年大家都在擁抱大模型,所有的行業(yè)都在做自己的大模型。就像冬日里不來件美拉德色系的服飾就會跟不上時(shí)代一樣。這不前段時(shí)間接入JES,用上好久為碰的RestHighLevelClient包。心血來潮再次訪問Elasticsearch官網(wǎng),發(fā)現(xiàn)

    2024年02月02日
    瀏覽(23)
  • CSS 重新認(rèn)識 !important 肯定有你不知道的

    CSS 重新認(rèn)識 !important 肯定有你不知道的

    重新認(rèn)識 !important 影響級聯(lián)規(guī)則 與 animation 和 transition 的關(guān)系 級聯(lián)層cascade layer 內(nèi)聯(lián)樣式 !important 與權(quán)重 !important 與簡寫屬性 !important 與自定義變量 !important 最佳實(shí)踐 在開始之前, 先來規(guī)范一下文中的用語, 首先看 W3C 中關(guān)于 CSS 的一些術(shù)語定義吧. 下圖來自 W3C 我們將一個完整

    2024年02月04日
    瀏覽(14)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包