目錄
前言:
一:初識(shí)面向過(guò)程和面向?qū)ο?/p>
二:類的引入
三:封裝和類的訪問(wèn)限定符
(1)封裝
(2)訪問(wèn)限定符
四:類的作用域和類的定義
(1)作用域
(2)類的定義
五:類的實(shí)例化(對(duì)象)
六:類對(duì)象的存儲(chǔ)模型
(1)結(jié)構(gòu)體內(nèi)存對(duì)齊
(2)對(duì)象及其成員函數(shù)的存儲(chǔ)模型
七:this指針
(1)引例:
(2)成因
(3)this指針的特性
前言:
C++專欄內(nèi)容連貫,沒(méi)展開(kāi)講的重要內(nèi)容都在專欄往期。
為方便語(yǔ)法學(xué)習(xí),直接展開(kāi)std命名空間。
個(gè)人主頁(yè)鏈接:https://blog.csdn.net/2301_76269963?type=blog
一:初識(shí)面向過(guò)程和面向?qū)ο?/h2>
C語(yǔ)言是面向過(guò)程的,關(guān)注的是過(guò)程,分析求解步驟,通過(guò)函數(shù)逐步解決問(wèn)題。
以洗衣服這個(gè)事情為例子:

C++是面向?qū)ο蟮模?span style="color:#4da8ee;">關(guān)注的是對(duì)象,將一件事情涉及到的對(duì)象分離出來(lái),依靠對(duì)象間的交互來(lái)解決問(wèn)題。

二:類的引入
在C語(yǔ)言中,我們會(huì)用結(jié)構(gòu)體來(lái)表示一些較復(fù)雜的事物,但是結(jié)構(gòu)體中只能聲明變量,不能聲明和定義函數(shù),C++中引入了類的概念,在結(jié)構(gòu)體的基礎(chǔ)上聲明或者定義函數(shù),我們稱為類。

struct關(guān)鍵字雖然可以用來(lái)定義類,但是C++中定義類更喜歡用class關(guān)鍵字。
(涉及到封裝和兼容性)

這里成員函數(shù)都是直接在類中定義的,聲明定義分離的寫法等把訪問(wèn)限定符和域講完了再來(lái)說(shuō)。
三:封裝和類的訪問(wèn)限定符
(1)封裝
面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。
封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口來(lái)和對(duì)象進(jìn)行交互。
封裝本質(zhì)上是一種管理,其目的是讓用戶更方便使用類。比如:對(duì)電腦這樣復(fù)雜的設(shè)備,用戶只需要使用開(kāi)關(guān)機(jī)鍵、鍵盤、鼠標(biāo)等就可以和電腦進(jìn)行交互了,完成日常事務(wù)了。但是電腦上實(shí)際工作的卻是CPU、內(nèi)存、顯卡這些硬件。
對(duì)使用者來(lái)說(shuō),不需要關(guān)心內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),設(shè)計(jì)者也不希望使用者觸及到內(nèi)核,因此計(jì)算機(jī)廠商在出廠時(shí),在外部套上殼子,將內(nèi)部實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),僅僅對(duì)外提供開(kāi)關(guān)機(jī)、鼠標(biāo)以及鍵盤插孔等,讓用戶可以與計(jì)算機(jī)進(jìn)行交互即可。
那么C++是如何實(shí)現(xiàn)細(xì)節(jié)隱藏的呢?
(2)訪問(wèn)限定符
C++實(shí)現(xiàn)封裝的方式:用類將對(duì)象的屬性與方法結(jié)合在一塊,讓對(duì)象更加完善,通過(guò)訪問(wèn)權(quán)限選擇性的將其接口提供給外部的用戶使用。
?
三個(gè)訪問(wèn)限定符:

?
訪問(wèn)限定符的說(shuō)明:
? ? 1.public修飾的成員在類外可以直接被訪問(wèn)
? ? 2.protected和private修飾的成員在類外不能直接被訪問(wèn)(此處protected和private類似)
? ? 3.訪問(wèn)權(quán)限作用域從該訪問(wèn)限定符出現(xiàn)的位置開(kāi)始直到下一個(gè)訪問(wèn)限定符出現(xiàn)時(shí)為止
? ? 4.如果后面沒(méi)有訪問(wèn)限定符,作用域就到 },即類結(jié)束
? ? 5.class定義的類的默認(rèn)訪問(wèn)權(quán)限為private,struct為public(因?yàn)閟truct要兼容C)
四:類的作用域和類的定義
(1)作用域
C++中用{ }括起來(lái)的部分都可以稱為一個(gè)域。
為了加深理解,我舉個(gè)例子:



類定義了一個(gè)新的作用域,類的所有成員都在類的作用域中。在類體外定義成員時(shí),需要使用 :: 作用域操作符指明成員函數(shù)屬于哪個(gè)類域。
(2)類的定義
類的兩種定義方式:
【1】聲明和定義都放在類體中(注意:如果函數(shù)在類體中定義,會(huì)被當(dāng)成內(nèi)聯(lián)函數(shù)處理)。
【2】聲明定義分離,類體中只有聲明,大多數(shù)情況下適合用這種(注意:分離的話定義處函數(shù)名前面要加類名::)。


成員變量命名規(guī)則的建議:
混亂的寫法:

?正常的寫法:

五:類的實(shí)例化(對(duì)象)
類和對(duì)象的關(guān)系就像房屋和設(shè)計(jì)圖紙一樣,其中類是設(shè)計(jì)圖紙,對(duì)象是借由這個(gè)圖紙建立的房屋。圖紙說(shuō)明了房屋大概需要什么材料,并沒(méi)有像房屋一樣成為占用大量空間的實(shí)體,所以類只是說(shuō)明了類中都有什么成員,并沒(méi)有占用內(nèi)存空間,實(shí)例化出的對(duì)象才占用了空間。


六:類對(duì)象的存儲(chǔ)模型
(1)結(jié)構(gòu)體內(nèi)存對(duì)齊
涉及到對(duì)象大小計(jì)算,先介紹一下結(jié)構(gòu)體內(nèi)存對(duì)齊。
一:對(duì)齊的規(guī)則
【1】結(jié)構(gòu)體內(nèi)的成員變量會(huì)按照定義順序依次存放,其中第一個(gè)成員在結(jié)構(gòu)體變量偏移量為0的地址處。
【2】每個(gè)成員變量的起始地址必須是對(duì)齊數(shù)的整數(shù)倍,對(duì)齊數(shù)為編譯器默認(rèn)對(duì)齊數(shù)與該成員大小中較小的一方,如果不足則補(bǔ)齊到整數(shù)倍。
(我用的是VS,默認(rèn)對(duì)齊數(shù)為8)
【3】結(jié)構(gòu)體的總大小必須是結(jié)構(gòu)體中最大成員的大小的整數(shù)倍,如果不足則補(bǔ)齊到整數(shù)倍。
【4】如果結(jié)構(gòu)體成員有數(shù)組,則規(guī)則適用于數(shù)組中的每個(gè)元素。
幾個(gè)題目

圖解:


圖解:


圖解:

(2)對(duì)象及成員函數(shù)的存儲(chǔ)模型

如果每個(gè)對(duì)象都一份保存相同的函數(shù)代碼,當(dāng)一個(gè)類實(shí)例化多個(gè)對(duì)象時(shí),相同代碼保存多次,無(wú)疑是浪費(fèi)空間的,所以采用了下面的存儲(chǔ)方法。

七:this指針
(1)引例:

?
(2)成因
C語(yǔ)言中,要借由函數(shù)改變結(jié)構(gòu)體變量的值,必須傳它的指針

我們已經(jīng)知道類的成員函數(shù)是存儲(chǔ)在公共區(qū)的,不是某一個(gè)對(duì)象的私有,C++是如何實(shí)現(xiàn)直接訪問(wèn)并修改的呢?

原因很簡(jiǎn)單,C++編譯器給每個(gè)“非靜態(tài)的成員函數(shù)“(不加static)增加了一個(gè)隱藏的指針參數(shù),讓該指針指向當(dāng)前對(duì)象(函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對(duì)象),在函數(shù)體中所有“成員變量”的訪問(wèn),都是通過(guò)該指針去訪問(wèn)。只不過(guò)所有的操作對(duì)用戶是透明的,即用戶不需要來(lái)傳遞,編譯器自動(dòng)完成解引用的操作。
我們回過(guò)頭來(lái)看上面的題目:


?
空類的注意點(diǎn):
注意空類的大小,空類比較特殊,編譯器給了空類一個(gè)字節(jié)來(lái)唯一標(biāo)識(shí)這個(gè)類的對(duì)象。

(3)this指針的特性
1. this指針的類型:類類型* const,即成員函數(shù)中,不能給this指針賦值
(const修飾在 * 之后,代表指針這個(gè)值本身不能更改)
2. 只能在“成員函數(shù)”的內(nèi)部使用
3. this指針本質(zhì)上是“成員函數(shù)”的形參,當(dāng)對(duì)象調(diào)用成員函數(shù)時(shí),將對(duì)象地址作為實(shí)參傳遞給this形參。所以對(duì)象中不存儲(chǔ)this指針
4.this指針是“成員函數(shù)”第一個(gè)隱含的指針形參,一般情況由編譯器通過(guò)寄存器自動(dòng)傳遞,不需要用戶傳遞
5.雖然編譯器會(huì)自動(dòng)實(shí)現(xiàn)解引用操作,但是手動(dòng)解引用訪問(wèn)成員變量也是支持的。不能手動(dòng)傳this指針這個(gè)隱藏的參數(shù)。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-479170.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-479170.html
C語(yǔ)言是面向過(guò)程的,關(guān)注的是過(guò)程,分析求解步驟,通過(guò)函數(shù)逐步解決問(wèn)題。
以洗衣服這個(gè)事情為例子:
C++是面向?qū)ο蟮模?span style="color:#4da8ee;">關(guān)注的是對(duì)象,將一件事情涉及到的對(duì)象分離出來(lái),依靠對(duì)象間的交互來(lái)解決問(wèn)題。
在C語(yǔ)言中,我們會(huì)用結(jié)構(gòu)體來(lái)表示一些較復(fù)雜的事物,但是結(jié)構(gòu)體中只能聲明變量,不能聲明和定義函數(shù),C++中引入了類的概念,在結(jié)構(gòu)體的基礎(chǔ)上聲明或者定義函數(shù),我們稱為類。
struct關(guān)鍵字雖然可以用來(lái)定義類,但是C++中定義類更喜歡用class關(guān)鍵字。
(涉及到封裝和兼容性)
這里成員函數(shù)都是直接在類中定義的,聲明定義分離的寫法等把訪問(wèn)限定符和域講完了再來(lái)說(shuō)。
(1)封裝
面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。
那么C++是如何實(shí)現(xiàn)細(xì)節(jié)隱藏的呢?
(2)訪問(wèn)限定符
C++實(shí)現(xiàn)封裝的方式:用類將對(duì)象的屬性與方法結(jié)合在一塊,讓對(duì)象更加完善,通過(guò)訪問(wèn)權(quán)限選擇性的將其接口提供給外部的用戶使用。
?三個(gè)訪問(wèn)限定符:
?
訪問(wèn)限定符的說(shuō)明:
? ? 1.public修飾的成員在類外可以直接被訪問(wèn)
? ? 2.protected和private修飾的成員在類外不能直接被訪問(wèn)(此處protected和private類似)
? ? 3.訪問(wèn)權(quán)限作用域從該訪問(wèn)限定符出現(xiàn)的位置開(kāi)始直到下一個(gè)訪問(wèn)限定符出現(xiàn)時(shí)為止
? ? 4.如果后面沒(méi)有訪問(wèn)限定符,作用域就到 },即類結(jié)束
? ? 5.class定義的類的默認(rèn)訪問(wèn)權(quán)限為private,struct為public(因?yàn)閟truct要兼容C)
(1)作用域
C++中用{ }括起來(lái)的部分都可以稱為一個(gè)域。
為了加深理解,我舉個(gè)例子:
類定義了一個(gè)新的作用域,類的所有成員都在類的作用域中。在類體外定義成員時(shí),需要使用 :: 作用域操作符指明成員函數(shù)屬于哪個(gè)類域。
(2)類的定義
類的兩種定義方式:
【1】聲明和定義都放在類體中(注意:如果函數(shù)在類體中定義,會(huì)被當(dāng)成內(nèi)聯(lián)函數(shù)處理)。
【2】聲明定義分離,類體中只有聲明,大多數(shù)情況下適合用這種(注意:分離的話定義處函數(shù)名前面要加類名::)。
成員變量命名規(guī)則的建議:
混亂的寫法:
?正常的寫法:
類和對(duì)象的關(guān)系就像房屋和設(shè)計(jì)圖紙一樣,其中類是設(shè)計(jì)圖紙,對(duì)象是借由這個(gè)圖紙建立的房屋。圖紙說(shuō)明了房屋大概需要什么材料,并沒(méi)有像房屋一樣成為占用大量空間的實(shí)體,所以類只是說(shuō)明了類中都有什么成員,并沒(méi)有占用內(nèi)存空間,實(shí)例化出的對(duì)象才占用了空間。
(1)結(jié)構(gòu)體內(nèi)存對(duì)齊
涉及到對(duì)象大小計(jì)算,先介紹一下結(jié)構(gòu)體內(nèi)存對(duì)齊。
一:對(duì)齊的規(guī)則
【1】結(jié)構(gòu)體內(nèi)的成員變量會(huì)按照定義順序依次存放,其中第一個(gè)成員在結(jié)構(gòu)體變量偏移量為0的地址處。
【2】每個(gè)成員變量的起始地址必須是對(duì)齊數(shù)的整數(shù)倍,對(duì)齊數(shù)為編譯器默認(rèn)對(duì)齊數(shù)與該成員大小中較小的一方,如果不足則補(bǔ)齊到整數(shù)倍。
(我用的是VS,默認(rèn)對(duì)齊數(shù)為8)
【3】結(jié)構(gòu)體的總大小必須是結(jié)構(gòu)體中最大成員的大小的整數(shù)倍,如果不足則補(bǔ)齊到整數(shù)倍。
【4】如果結(jié)構(gòu)體成員有數(shù)組,則規(guī)則適用于數(shù)組中的每個(gè)元素。
幾個(gè)題目
圖解:
圖解:
圖解:
(2)對(duì)象及成員函數(shù)的存儲(chǔ)模型
如果每個(gè)對(duì)象都一份保存相同的函數(shù)代碼,當(dāng)一個(gè)類實(shí)例化多個(gè)對(duì)象時(shí),相同代碼保存多次,無(wú)疑是浪費(fèi)空間的,所以采用了下面的存儲(chǔ)方法。
(1)引例:
?
(2)成因
C語(yǔ)言中,要借由函數(shù)改變結(jié)構(gòu)體變量的值,必須傳它的指針
我們已經(jīng)知道類的成員函數(shù)是存儲(chǔ)在公共區(qū)的,不是某一個(gè)對(duì)象的私有,C++是如何實(shí)現(xiàn)直接訪問(wèn)并修改的呢?
原因很簡(jiǎn)單,C++編譯器給每個(gè)“非靜態(tài)的成員函數(shù)“(不加static)增加了一個(gè)隱藏的指針參數(shù),讓該指針指向當(dāng)前對(duì)象(函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對(duì)象),在函數(shù)體中所有“成員變量”的訪問(wèn),都是通過(guò)該指針去訪問(wèn)。只不過(guò)所有的操作對(duì)用戶是透明的,即用戶不需要來(lái)傳遞,編譯器自動(dòng)完成解引用的操作。
我們回過(guò)頭來(lái)看上面的題目:
?
空類的注意點(diǎn):
注意空類的大小,空類比較特殊,編譯器給了空類一個(gè)字節(jié)來(lái)唯一標(biāo)識(shí)這個(gè)類的對(duì)象。
(3)this指針的特性
1. this指針的類型:類類型* const,即成員函數(shù)中,不能給this指針賦值
(const修飾在 * 之后,代表指針這個(gè)值本身不能更改)
2. 只能在“成員函數(shù)”的內(nèi)部使用
3. this指針本質(zhì)上是“成員函數(shù)”的形參,當(dāng)對(duì)象調(diào)用成員函數(shù)時(shí),將對(duì)象地址作為實(shí)參傳遞給this形參。所以對(duì)象中不存儲(chǔ)this指針
4.this指針是“成員函數(shù)”第一個(gè)隱含的指針形參,一般情況由編譯器通過(guò)寄存器自動(dòng)傳遞,不需要用戶傳遞
5.雖然編譯器會(huì)自動(dòng)實(shí)現(xiàn)解引用操作,但是手動(dòng)解引用訪問(wèn)成員變量也是支持的。不能手動(dòng)傳this指針這個(gè)隱藏的參數(shù)。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-479170.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-479170.html
到了這里,關(guān)于C++入門:類和對(duì)象(上)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!