??前情提要??
本章節(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),我們顯示的為成員變量賦上初值
-
特別注意: 上述過程只能稱作
賦初值
,并不能稱作初始化
,這是因?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:
??補(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)生成的)】
??舉個例子:
-
如上圖,若成員為
const
所修飾的變量的時(shí)候,我們是無法實(shí)例化出一個對象的 -
原因就在于: 我們無法通過默認(rèn)構(gòu)造函數(shù)中的函數(shù)體內(nèi)賦值,去給成員變量
const int _n
賦上一個值,這是因?yàn)樽兞勘?code>const所修飾,我們只有在這個 變量定義的時(shí)候才可以初始化它的值 ,否則在后續(xù)代碼中我們是無法修改它的值的
- 如上我們就可以知道如果我們使用的是
初始化列表
進(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é)可能會疑惑 自定義類型成員 用到初始化列表的是什么情況呢
-
補(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)造 的效果
??易混點(diǎn): 若同時(shí)存在 初始化列表初始化 和 函數(shù)體內(nèi)賦值,最終會采用哪個地方的值呢?
-
以上便可以看到: 對于 內(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)換
-
??舉個例子:
-
上述可以發(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)換 -
?綜上:
- 以上就是發(fā)生在構(gòu)造函數(shù)中的
神奇優(yōu)化
的全部內(nèi)容啦~
?? Ⅲ.匿名對象
??匿名對象:
-
簡單來說:就是沒有名字的對象
-
而且匿名對象的生命周期僅僅只有在構(gòu)造匿名對象的一行代碼中,并不是隨著主函數(shù)的銷毀而銷毀的
?匿名對象的意義:
-
在某種場景下,需要調(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)
??什么場景使用:
- 定義一個對象要用,但僅在這一行的代碼中使用,其他地方不再使用
?綜上:
-
匿名對象的使用可以使程序更加靈活、方便、便捷
-
上述就是
匿名對象
的概念啦~
??二.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
、protected
、private
這三種訪問級別,也可以具有返回值
?特別注意:
-
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;
};
?綜上:
-
就是
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)行初始化賦值,但是要注意這里不是初始化,這里是給聲明的成員變量 缺省值
??如上:
-
給了成員變量缺省值后,如果類調(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)系是單向的,不具有雙向性
即
A
是B
的友元類,那A
中的所有成員函數(shù)都是B
的友元函數(shù),可以訪問B
中所有私有成員變量,但B
不可以反過來訪問A
】 -
友元關(guān)系不能傳遞
如果
A
是B
的友元類,B
也是C
的友元類,不代表A
是C
的友元
?綜上:
- 以上就是
友元類
的全部內(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)贊??支持一下喲~?文章來源:http://www.zghlxwxcb.cn/news/detail-412359.html
文章來源地址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)!