最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

C++自制心得——類與對象下

2023-09-11 20:09 作者:這年頭起名可真不容易  | 我要投稿

這一章就是一些瑣碎的收尾工作,單個(gè)知識點(diǎn)不難,但是很多很雜,建議多練。

1.const成員函數(shù)

在整個(gè)傳參過程中,為了保護(hù)數(shù)據(jù),this指針很容易傳成const this指針,然而這樣的this指針無法調(diào)用非const成員函數(shù),所以我們需要一種辦法用const修飾函數(shù)的this指針

這種函數(shù)就是const成員函數(shù),設(shè)計(jì)成員函數(shù)時(shí),十分建議將所有不涉及數(shù)據(jù)修改的成員函數(shù)變成const成員函數(shù),好處多多

C++的類型檢查嚴(yán)格,func(int a)和func(const int a)會(huì)被視作函數(shù)重載,也就是說我們可以同時(shí)設(shè)計(jì)const與非const函數(shù),一般情況下,這沒有什么用,但如果你要實(shí)現(xiàn)讀寫功能分離,這會(huì)非常有用

當(dāng)成員函數(shù)同時(shí)存在const版本與普通版本,普通對象會(huì)走普通版本,只有在沒有普通版本時(shí),普通對象才會(huì)走const版本,編譯器會(huì)優(yōu)先選擇最匹配函數(shù)

slist.cpp

slist.h

test.cpp

在這里,對operator[]重載兩個(gè)版本就可以實(shí)現(xiàn)普通對象可讀可寫,const對象只讀

2. 取地址重載函數(shù)

operator&的重載函數(shù),有兩個(gè),一個(gè)針對普通對象,一個(gè)針對const對象。作用就是提供對象地址,作為六大默認(rèn)成員函數(shù)直接用編譯器生成的就可以了,基本查無此人。為數(shù)不多的用途就是返回虛假地址(到底是什么極端情況才會(huì)用到這個(gè)功能)

取地址給你返野指針,就問你怕不怕,相當(dāng)缺德的寫法

3. 構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換

C++11支持單參數(shù)構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換,理論上的流程是這樣的:先調(diào)用構(gòu)造函數(shù)生成一個(gè)臨時(shí)對象,再調(diào)用拷貝構(gòu)造函數(shù)將臨時(shí)對象拷貝給a2。但是比較新的編譯器會(huì)做優(yōu)化,直接調(diào)用構(gòu)造函數(shù)生成a2。程序結(jié)果如下

我們換一種寫法

這樣寫也是可以的,但是下面的不行

為什么,臨時(shí)對象具有常性,只能用const引用接收,如果用普通引用接收,就構(gòu)成權(quán)限的放大。

如果你想關(guān)閉這個(gè)功能,可以使用explicit關(guān)鍵字聲明構(gòu)造函數(shù)

C++11也支持多參數(shù)構(gòu)造函數(shù)的隱式類型轉(zhuǎn)換

就是數(shù)組初始化的方法,沒什么可講的

那么這個(gè)特性的用途是什么?舉個(gè)例子,我現(xiàn)在想用一個(gè)順序表存日期

(原代碼只是把之前的日期類和順序表類結(jié)合到了一起,加起來500多行,為了諸位的閱讀體驗(yàn),我就不放了)

顯然,后面一種更省事,效率更高(優(yōu)化后)

4. 匿名對象

匿名對象就是臨時(shí)對象,結(jié)合之前的所學(xué)內(nèi)容,它的特性有如下幾點(diǎn)

1. 不需要名字(廢話)

2. 生命周期極短(只在當(dāng)前語句生效)

比方說這里有一個(gè)int型的臨時(shí)對象,那么它的生命周期從41行開始,至42行結(jié)束。再準(zhǔn)確一點(diǎn),這個(gè)變量的構(gòu)造始于func(int(10));語句的執(zhí)行,析構(gòu)于func(int(10));語句的結(jié)束,中間的部分就是它的生命周期

3. 具有常屬性

所有的臨時(shí)變量默認(rèn)被const修飾

其主要調(diào)用方式有兩種

1. 編譯器自動(dòng)生成

自動(dòng)生成的臨時(shí)變量一般用于承載傳值返回中的返回值,值傳遞行為的實(shí)參值,或者隱式類型轉(zhuǎn)換中的源變量值。綜上,臨時(shí)變量的作用就是充當(dāng)一個(gè)中介變量,而中介變量顯然沒有必要修改,這也是為什么臨時(shí)變量具有常屬性的重要原因。

2. 程序員顯式調(diào)用

定義一個(gè)臨時(shí)對象只需要寫成類型+(參數(shù))的形式,如果沒有參數(shù)也需要括號。無論是自定義類型,還是內(nèi)置類型都能用這種方法人為生成臨時(shí)變量。既然臨時(shí)變量的作用就是充當(dāng)中間人,那么它的使用場景往往透漏出一種一次性質(zhì)感。

我現(xiàn)在只想打印一個(gè)日期,我為什么要費(fèi)勁的定義一個(gè)局部變量,直接用臨時(shí)變量不就行了。這只是臨時(shí)變量最簡單的用法,后面的內(nèi)容會(huì)用到更多的臨時(shí)對象,這里按下不表。

5. 靜態(tài)成員

已經(jīng)講了四個(gè)內(nèi)容了,想不想休息一下。哼哼,damn,咱們C++的特性就是多,不要不服氣。

1. 靜態(tài)成員變量

現(xiàn)在我想知道一個(gè)類的對象一共創(chuàng)建了幾個(gè),正在使用的有幾個(gè)。感覺這個(gè)需求一點(diǎn)也不難嘛,安排

很好很好,但是倘若如此操作,閣下又將如何?

main函數(shù)(修改后)

這倒是個(gè)難題,有沒有一種方式即可以將變量封裝到類里,又可以讓這個(gè)變量具備唯一性?用一下靜態(tài)成員變量吧

首先我們知道靜態(tài)變量單獨(dú)存在于靜態(tài)區(qū),而非棧區(qū),有了這個(gè)前置知識,有關(guān)于靜態(tài)成員變量的特性就變的很好理解

1. 靜態(tài)成員變量不會(huì)走初始化列表

首先初始化列表負(fù)責(zé)的是非靜態(tài)成員變量的初始化,又因?yàn)槊恳粋€(gè)對象都需要獨(dú)立的非靜態(tài)成員變量,所以初始化列表與對象的創(chuàng)建過程強(qiáng)相關(guān)

但是靜態(tài)變量不一樣,所有的對象只需要唯一的靜態(tài)成員變量,那么靜態(tài)成員變量的創(chuàng)建顯然不應(yīng)由初始化列表負(fù)責(zé),這是不符合邏輯的

毫無疑問,靜態(tài)成員變量也不能通過在聲明處給缺省值初始化,因?yàn)檫@種方式也要用到初始化列表。我們只能人工初始化靜態(tài)成員變量(類中的東西只是聲明,不存在實(shí)際空間)

2. 靜態(tài)成員變量不會(huì)存儲(chǔ)在對象中

理所當(dāng)然,靜態(tài)成員變量與成員函數(shù)唯一存在,無需存儲(chǔ)于對象中

2. 靜態(tài)成員函數(shù)

既然存在靜態(tài)成員變量,那么靜態(tài)成員函數(shù)又能做什么?

你能不能在不額外實(shí)例化對象的情況下打印兩個(gè)靜態(tài)成員變量嗎?好吧,我知道你要說什么,用一個(gè)A*空指針訪問就行,這個(gè)的確可以,但是還有沒有更簡單的辦法?那就用靜態(tài)成員函數(shù)

靜態(tài)成員函數(shù)的形參表里不存在this指針,所以它可以脫離對象調(diào)用,不過它就不能訪問那些直接存在對象里的內(nèi)容了,哪怕函數(shù)是用對象調(diào)用的。

一般情景下,靜態(tài)成員變量與靜態(tài)成員函數(shù)同時(shí)存在。有用到靜態(tài)變量最好就配一個(gè)靜態(tài)函數(shù)

為了檢驗(yàn)各位對靜態(tài)成員的理解,我來出一道題目

請問,在不使用循環(huán)語句,選擇語句,位運(yùn)算,乘除法的情況下,如何輸出1 + 2 + 3 + ... + n的結(jié)果(禁止使用數(shù)學(xué)相關(guān)類逃課)

出處:??途W(wǎng) JZ64(??途W(wǎng)的要求沒我這么嚴(yán)格,還能用位運(yùn)算)

原理是這樣的,我定義了一個(gè)長度為n的Sum數(shù)組,就可以自動(dòng)調(diào)用Sum構(gòu)造函數(shù)n次,我再用靜態(tài)成員變量保存每次的計(jì)算數(shù)據(jù),一個(gè)循環(huán)就做好了,接下來再用靜態(tài)函數(shù)返回答案,大功告成

6. 友元

1. 友元函數(shù)

我們最早講友元函數(shù)是為了解決流輸入流輸出對象與this指針搶占成員函數(shù)第一個(gè)參數(shù)的問題。友元函數(shù)的特性如下

1. 友元函數(shù)由友好聲明,函數(shù)聲明,函數(shù)定義三部分組成

友好聲明用于表達(dá)這個(gè)函數(shù)與那些類有友好關(guān)系(友好聲明在友好類(類里有友元聲明的)內(nèi)部,格式為friend+函數(shù)聲明),函數(shù)聲明用于告知編譯器這個(gè)函數(shù)的確存在,函數(shù)定義則是函數(shù)實(shí)際實(shí)現(xiàn)之處,三者缺一不可

2. 友元函數(shù)可以訪問其友好類的私有及保護(hù)成員,但是友元函數(shù)不是友好類的成員函數(shù)

3. 友元函數(shù)的友好聲明不受友好類訪問限定符限制,因此其位置任意

4. 友元函數(shù)的調(diào)用規(guī)則與普通函數(shù)一致

2. 友元類

友元類的聲明與友元函數(shù)類似,為friend+class+類名,同樣可定義在任一位置,友元類的特性如下

1. 友元關(guān)系是單向的

現(xiàn)在類A與類B互為友元類,兩個(gè)print函數(shù)也可以正常使用,但如果我去掉類A里的友元類聲明就會(huì)出現(xiàn)這樣的錯(cuò)誤

所以友元關(guān)系是這樣的,類A說類B是它的朋友,類B才能用類A的東西,但是如果類B說類A不是它的朋友,哪怕類A說類B是它的朋友,類A還是不能用類B的東西

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

現(xiàn)實(shí)里也是這樣的,你朋友的朋友不一定就是你的朋友

3. 友元關(guān)系不能繼承(后面講繼承再說)

友元是一個(gè)不太好的語法,會(huì)提高代碼耦合度(起碼比goto強(qiáng),實(shí)際場景下建議少用,盡量采用get,set函數(shù)(除非你想偷懶

7. 內(nèi)部類

顧名思義,定義在類內(nèi)部的類,特性如下

1. 內(nèi)部類受外部類類域與訪問限定符的轄制

2. 外部類(內(nèi)部類外一層的)天生是內(nèi)部類的友元類,但內(nèi)部類天生不是外部類的友元類

這么寫代碼會(huì)直接報(bào)錯(cuò)

3. 除上述關(guān)系,兩個(gè)類相互獨(dú)立存在

這段代碼的運(yùn)行結(jié)果就是

main函數(shù)(修改后)

這是調(diào)試的結(jié)果

你也看見了,無論是類的大小,還是對象里的成員變量數(shù)都能證明A與B兩個(gè)類保持著一定程度的獨(dú)立關(guān)系

可喜可賀,類與對象的初級內(nèi)容我們終于講完了,下一個(gè)專欄我會(huì)講一些附加內(nèi)容,涉及到編譯器對類的一些優(yōu)化,難度較高只做了解,而且大概率講的不好或者是不深,請酌情觀看。下下個(gè)專欄講內(nèi)存管理,敬請期待

C++自制心得——類與對象下的評論 (共 條)

分享到微博請遵守國家法律
济南市| 环江| 景德镇市| 托克托县| 沿河| 襄垣县| 荃湾区| 黑山县| 景谷| 武义县| 汝阳县| 涞源县| 济阳县| 蚌埠市| 天全县| 秦皇岛市| 明水县| 运城市| 漾濞| 洛宁县| 四子王旗| 杭锦后旗| 新民市| 晋中市| 滁州市| 博野县| 康定县| 罗城| 富川| 东丽区| 彩票| 杭州市| 连州市| 临武县| 河津市| 新安县| 临洮县| 宾川县| 密云县| 山东省| 精河县|