嵌入(ru)式學習筆(bi)記:類(lei)與封裝基礎入(ru)門(men)知識分享
時間(jian):2018-09-05 來(lai)源:未知
c++是學(xue)習任何(he)一門IT技術(shu)都必須要學(xue)的(de),在(zai)c++的(de)學(xue)習重點(dian)和(he)難點(dian)也就是類(lei)與封(feng)(feng)裝(zhuang)了,在(zai)這里我(wo)這只老鳥總結(jie)出(chu)了一些類(lei)與封(feng)(feng)裝(zhuang)基礎(chu),比較全面(mian),對c++類(lei)與封(feng)(feng)裝(zhuang)的(de)入(ru)門學(xue)習必備。
一、如何定義類
定(ding)義(yi)一(yi)(yi)個類,本質上(shang)是定(ding)義(yi)一(yi)(yi)個數據類型的藍圖。這實際上(shang)并沒(mei)有定(ding)義(yi)任何數據,但它(ta)定(ding)義(yi)了(le)(le)類的名(ming)稱意味(wei)著什么(me),也就是說,它(ta)定(ding)義(yi)了(le)(le)類的對(dui)象(xiang)包括(kuo)了(le)(le)什么(me),以(yi)及可以(yi)在這個對(dui)象(xiang)上(shang)執行哪些操(cao)作。
類(lei)(lei)定義(yi)是以關鍵字 class 開(kai)頭,后跟(gen)類(lei)(lei)的名稱。類(lei)(lei)的主體是包含在一(yi)(yi)對(dui)花括號中。類(lei)(lei)定義(yi)后必須跟(gen)著一(yi)(yi)個分號或一(yi)(yi)個聲明(ming)列表。
class 類名(ming)
{
成員。。。。
};
訪問限定符:
private: 私有成(cheng)員變量或函數在類的外部是(shi)不可(ke)訪(fang)(fang)問(wen)的,甚至是(shi)不可(ke)查看的。只有類和(he)友元(yuan)函數可(ke)以訪(fang)(fang)問(wen)私有成(cheng)員。
public: 公有成員在程序(xu)中類(lei)的外部(bu)是可(ke)訪(fang)問的。可(ke)以(yi)不使用任何成員
函數來設(she)置(zhi)和獲取公(gong)有變量(liang)的(de)值
protected:保(bao)護成(cheng)員變量或(huo)函數與私(si)有成(cheng)員十分相(xiang)似,但(dan)有一點(dian)不
同,保護成(cheng)員在派生類(即子類)中是可(ke)訪問的。
什(shen)么(me)是類的(de)內部(bu)和類的(de)外部(bu)?
在(zai)(zai)類的(de)作用(yong)域范圍(wei)內叫(jiao)(jiao)類的(de)內部,在(zai)(zai)類的(de)作用(yong)域訪(fang)問外(wai)叫(jiao)(jiao)類的(de)外(wai)部
注意:定義類的(de)時候,類的(de)成員函數可以在(zai)(zai)類的(de)內部(bu)聲明,在(zai)(zai)類的(de)外部(bu)定義,在(zai)(zai)外部(bu)定義的(de)時候需(xu)要加作用域。
在(zai)表(biao)(biao)示(shi)數據類(lei)(lei)型(xing)(xing)的時候(hou),class可以省(sheng)略,直接用類(lei)(lei)名(ming)表(biao)(biao)示(shi)數據類(lei)(lei)型(xing)(xing)。
class 和struct 有什么(me)區別?
在不加訪問(wen)限(xian)定符的(de)情況(kuang)下,class的(de)成員默(mo)認是私有(you)屬性,struct 的(de)成員默(mo)認是公(gong)有(you)屬性。
對象和類的關(guan)系(xi):
類是(shi)某一事物的(de)(de)抽象,類是(shi)數據類型(xing),對(dui)象是(shi)類的(de)(de)實例化,對(dui)象是(shi)變量名(ming)。
二、this指針
this指(zhi)針默認在非靜(jing)態的(de)成員函數中存在。
指(zhi)向當前對(dui)象的首地址(zhi),誰(shui)調用該成員函數,誰(shui)就是當前對(dui)象。this指(zhi)針在表示成員變量的時候可(ke)以省略
三、構造函數
作(zuo)用(yong):初始化(hua)成員變量,初始化(hua)只會(hui)進行一次,所(suo)以任何一個對象只會(hui)
調用一次(ci)構造函(han)數
特點:
1.函數名(ming)和類名(ming)一樣
2.沒有返回值(zhi)
3.可以重載
4.如(ru)果沒有自定義構(gou)造函數,編譯器會提供默認(ren)的(de)構(gou)造函數進行初始化工作
5.如果自定義構造(zao)函數,對象初始化(hua)不會(hui)調用默認(ren)的構造(zao)函數,而(er)是調用自定義的構造(zao)函數
6.構(gou)造(zao)函數(shu)不需要主動調(diao)用,創(chuang)建對象的(de)時候會自(zi)動調(diao)用構(gou)造(zao)函數(shu)進行初始(shi)化
7.構造(zao)函數可以用初始(shi)化列表進(jin)行(xing)初始(shi)化
8.構造函數通常是公有(you)的,如(ru)果是非公有(you)將(jiang)無法創建(jian)對象(xiang)
默認構造函數無入參(can),無打印(yin)。
拷(kao)貝(復制)構造(zao)函(han)數(shu) copy construct function
作用:用一個(ge)已經(jing)存在的(de)(de)對(dui)象(xiang)給(gei)新(xin)創(chuang)建(jian)的(de)(de)對(dui)象(xiang)初始化(hua)。有默(mo)認(ren)的(de)(de)拷(kao)貝構造(zao)函數(shu),如果沒有自(zi)定義(yi),就用默(mo)認(ren)的(de)(de)。如果自(zi)定義(yi)拷(kao)貝構造(zao)函數(shu),只會調用自(zi)定義(yi)的(de)(de)拷(kao)貝構造(zao)函數(shu)默(mo)認(ren)構造(zao)函數(shu)屬于淺拷(kao)貝
深拷貝(bei)和(he)淺拷貝(bei)
淺拷貝(bei): 棧內(nei)存之間數據(ju)的拷貝(bei)
深(shen)拷(kao)貝: 堆內存(cun)之間(jian)數據的(de)拷(kao)貝四、析構函數
作用:在(zai)對(dui)象(xiang)生命(ming)周期結束的時候,回收對(dui)象(xiang)的資(zi)源(內存)
特點:
1.函數名是類名前加~
2.沒有返回值(zhi)
3.沒有入(ru)參,不能(neng)進行(xing)函數重載(zai)
4.如果沒(mei)有(you)自定義析構函(han)數,編(bian)譯器會提供(gong)默認的析構函(han)數(默認析構函(han)數無(wu)打印,且只會釋放棧內存空間)
5.如果(guo)自定義析(xi)構函數,不會用默(mo)認的析(xi)構函數,只會用自定義的析(xi)構函數
6.析構函數不需(xu)要(yao)主動(dong)調(diao)(diao)用(yong),在對象生(sheng)命周期(qi)結束的(de)時候自動(dong)調(diao)(diao)用(yong)
7.如果(guo)主(zhu)動(dong)調用析(xi)(xi)構函(han)數(shu),只(zhi)是執行析(xi)(xi)構函(han)數(shu)體中的(de)內(nei)容,并不會改變對象的(de)生命周期。
構(gou)造函(han)(han)數(shu)和(he)析構(gou)函(han)(han)數(shu)的順序?
構造函數按照(zhao)程序執行的順序進(jin)行構造。
析(xi)構(gou)函(han)數的執(zhi)行順(shun)序由對象的生命周期來決定:
堆內存(cun)的數據是(shi)人為釋放,當你忘(wang)了人為釋放時在(zai)程序(xu)結束(shu)后會自動釋放;
棧的內存(cun)在(zai)函數結(jie)束以(yi)后(hou)就釋(shi)放,析構(gou)函數的順序(xu)和構(gou)造函數相反。
靜態數據(ju)區的(de)內存在(zai)程序結束以后才釋(shi)放,同樣和構(gou)造的(de)順序相反。
對象的內存(cun)空(kong)間(jian)有多大?
等(deng)于對象(xiang)的(de)(de)成(cheng)員變量(liang)(liang)的(de)(de)內(nei)存大小(xiao)之和(滿足字節對齊(qi))當對象(xiang)沒有成(cheng)員變量(liang)(liang),對象(xiang)的(de)(de)內(nei)存大小(xiao)為1個字節
總結:
定義一個(ge)類,默認有哪些成員函(han)數(shu)和(he)運算符可以(yi)直接(jie)使用(yong)?1.構造函(han)數(shu)
2.析構函數
3.拷(kao)貝構造函(han)數
4.賦值運算符
5.&取地址運算符
四(si)、靜態成員
加上static修飾的成(cheng)員叫靜態成(cheng)員,特點:屬于該類的所有對象共享的
1.靜(jing)態(tai)成員變(bian)量(liang) 本質上是全(quan)局變(bian)量(liang),所(suo)以需(xu)要在全(quan)局范圍(wei)聲(sheng)明,靜(jing)態(tai)成員變(bian)量(liang)的內存在靜(jing)態(tai)數(shu)據區,只有一份,不(bu)在對象(xiang)的內存空間內。
2.靜(jing)態(tai)成(cheng)(cheng)(cheng)員(yuan)函數 可(ke)以通過類(lei)名::函數名,直接(jie)調(diao)用靜(jing)態(tai)成(cheng)(cheng)(cheng)員(yuan)函數,靜(jing)態(tai)成(cheng)(cheng)(cheng)員(yuan)函數沒有this指針(zhen)。靜(jing)態(tai)成(cheng)(cheng)(cheng)員(yuan)函數訪問(wen)不了非靜(jing)態(tai)的成(cheng)(cheng)(cheng)員(yuan)變量非靜(jing)態(tai)成(cheng)(cheng)(cheng)員(yuan)函數可(ke)以訪問(wen)靜(jing)態(tai)成(cheng)(cheng)(cheng)員(yuan)變量
五、只讀成員
被const修飾的成(cheng)員(yuan)叫只(zhi)讀成(cheng)員(yuan),只(zhi)讀成(cheng)員(yuan)只(zhi)能讀不(bu)能寫,不(bu)能做左值(zhi)。
1.只讀(du)成員變量(liang) 在初始化(hua)的時候只能(neng)用初始化(hua)列表(biao)
2.只(zhi)(zhi)讀(du)成員(yuan)函(han)數(shu) 不(bu)(bu)能(neng)修改成員(yuan)變量的(de)(de)值。只(zhi)(zhi)讀(du)成員(yuan)函(han)數(shu)不(bu)(bu)能(neng)調用(yong)非只(zhi)(zhi)讀(du)的(de)(de)成員(yuan)函(han)數(shu),非只(zhi)(zhi)讀(du)的(de)(de)成員(yuan)函(han)數(shu)可以調用(yong)只(zhi)(zhi)讀(du)的(de)(de)成員(yuan)函(han)數(shu)
3.只(zhi)讀(du)對(dui)(dui)象 該對(dui)(dui)象只(zhi)能(neng)讀(du)不能(neng)寫 mutable 關鍵(jian)字 (可(ke)變的)
被mutable修飾的變量不受const的約束三、友(you)元
類(lei)(lei)的(de)好友(you)(you)叫友(you)(you)元(yuan)。友(you)(you)元(yuan)可以訪問(wen)類(lei)(lei)的(de)私有成員。
1.外(wai)部函數(shu)是(shi)友元(yuan) ***** 該外(wai)部函數(shu)可以訪問本類的私有成員(yuan)
2.外部(bu)類是友元(yuan) *** 外部(bu)友元(yuan)類的所有成(cheng)員函數都(dou)可以(yi)訪問(wen)本(ben)類的私(si)有成(cheng)員
3.外部(bu)類的成(cheng)(cheng)員函數是友元 *** 只有(you)(you)聲明為友元的成(cheng)(cheng)員函數可(ke)以(yi)訪問本類的私有(you)(you)成(cheng)(cheng)員,其他的成(cheng)(cheng)員函數不(bu)行(xing)
友元具不(bu)具有傳遞(di)性(xing)?
友元不具有傳遞性
友元的聲明不受訪問限(xian)定符(fu)的影響。總結(jie)什么(me)(me)是封裝(zhuang),封裝(zhuang)有(you)什么(me)(me)作用?
1.定義(yi)類,類中有(you)數據和方法(fa),模塊(kuai)化編程(cheng),提高(gao)編程(cheng)的效率。
2.通過訪問限定(ding)(ding)符,確定(ding)(ding)哪些成員是隱(yin)藏的,哪些是暴露在(zai)外的接口,為了數(shu)據安(an)全性。
友元破壞(huai)了封裝,需要謹慎使用。
六、運算符重載
為什么要進行運算符重載(zai)?
1.運算(suan)符只(zhi)對基本(ben)數據(ju)類(lei)型有(you)效,對自定(ding)義的類(lei)類(lei)型無效。對象之間的運算(suan)必須要進行運算(suan)符重載
2.使用用運算符重載,使對象之間的運算變得簡單(dan),方便。
大部分運算符都可以被重載,只有如下(xia)不能(neng):
成員運(yun)算符(fu). 三目運(yun)算符(fu)?: sizeof運(yun)算符(fu) 作用(yong)域運(yun)算符(fu)::
運算符重(zhong)載(zai)的本質是特殊(shu)的函數:(函數名特殊(shu))
返回值類型 operator 運算符(入(ru)參列(lie)表。。。)
{
函(han)數(shu)體。。。。
}
類有哪些函數:
1.成員(yuan)函數(shu) 類(lei)的(de)組成部分,可以訪問類(lei)的(de)私(si)有成員(yuan),有this指針指代當前對象
2.友元函數 不是(shi)類的組成(cheng)部(bu)分(fen),可以類訪問(wen)私有(you)成(cheng)員,沒有(you)this指針
3.非友(you)元的(de)外部函數(shu) 不能訪問類的(de)私有(you)成員成員函數(shu)和(he)友(you)元函數(shu)做運算符重載有(you)什么區別?
友元函數比成(cheng)(cheng)員(yuan)函數做(zuo)相(xiang)同的(de)運算符重載多一個(ge)入參。原因:成(cheng)(cheng)員(yuan)函數有this指針可(ke)以指代一個(ge)對象。
注意:運算符重載不能改變(bian)運算符的優先級和(he)含義。
七、數據封裝
所有的 C++ 程序都有以(yi)下兩個基本要素(su):
程序語句(代碼(ma)):這是程序中執行動作(zuo)的部分,它們被稱為函數。
程序(xu)數據:數據是程序(xu)的信(xin)息,會受到(dao)程序(xu)函數的影響。
封裝(zhuang)是(shi)面向對象(xiang)編程中的(de)把數據和操作(zuo)數據的(de)函數綁定在一(yi)起的(de)一(yi)個概念,這樣能(neng)避免受到外界的(de)干擾和誤用,從而確保(bao)了安(an)全。數據封裝(zhuang)引申出(chu)了另一(yi)個重要(yao)的(de) OOP 概念,即數據隱(yin)藏(zang)。
數據(ju)封裝是一種把數據(ju)和操(cao)作數據(ju)的函數捆(kun)綁在一起的機制(zhi),數據(ju)抽象是一種僅向用戶暴露接(jie)口而把具體的實現細節(jie)隱藏起來的機制(zhi)。數據(ju)抽象
數(shu)據抽象是指,只向外界(jie)提供關鍵信息(xi),并隱藏其(qi)后臺的實現(xian)細(xi)節,即只表(biao)現(xian)必要的信息(xi)而不呈現(xian)細(xi)節。
數(shu)據抽象是一種(zhong)依賴于接口(kou)和實(shi)現分離(li)的編程(cheng)(設計)技術。
舉一(yi)個現實生活中的(de)真實例子(zi),比如(ru)一(yi)臺電視機,您可(ke)以(yi)打開和(he)關閉、切換頻道、調整音(yin)量、添加外部(bu)(bu)組件(如(ru)喇叭(ba)、錄像機、DVD 播放(fang)器),但是您不知道它的(de)內部(bu)(bu)實現細節,也就是說,您并(bing)不知道它是如(ru)何(he)(he)通過纜線接收信號(hao),如(ru)何(he)(he)轉換信號(hao),并(bing)最終顯(xian)示在屏幕上。
因(yin)此,我們可以說電(dian)視把它(ta)的內部(bu)實(shi)現和外(wai)(wai)部(bu)接口分離開(kai)了,您(nin)無需知道它(ta)的內部(bu)實(shi)現原理,直接通過它(ta)的外(wai)(wai)部(bu)接口(比如電(dian)源按(an)鈕、遙(yao)控(kong)器(qi)、聲量控(kong)制(zhi)器(qi))就(jiu)可以操(cao)控(kong)電(dian)視。
數據抽象的(de)好處
數據抽象(xiang)有兩個重要的優勢:
類的(de)內部(bu)受到保護,不會因無意的(de)用(yong)戶(hu)級(ji)錯(cuo)誤導致對(dui)象狀態受損。類實現可能隨著(zhu)時間的(de)推移而發生(sheng)變化,以便應(ying)(ying)對(dui)不斷變化的(de)需(xu)求,或者應(ying)(ying)對(dui)那些要求不改變用(yong)戶(hu)級(ji)代碼的(de)錯(cuo)誤報告。
如(ru)果只在類的(de)私有部分定義數據(ju)成員,編寫該類的(de)作者就(jiu)可(ke)以隨意(yi)更改數據(ju)。如(ru)果實現發生(sheng)改變(bian),則(ze)只需要檢查類的(de)代碼,看看這(zhe)個改變(bian)會導致哪些影響。如(ru)果數據(ju)是公(gong)有的(de),則(ze)任何(he)直(zhi)接(jie)訪問舊表(biao)示形式的(de)數據(ju)成員的(de)函數都可(ke)能受到影響。

