C++学习笔记系列四
生活随笔
收集整理的這篇文章主要介紹了
C++学习笔记系列四
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、一般來(lái)說(shuō),類的私有成員只能在類的內(nèi)部訪問(wèn),類外的函數(shù)是不能訪問(wèn)它們的。 但是,可以將一個(gè)函數(shù)定義為類的友元函數(shù),這時(shí)該函數(shù)就可以訪問(wèn)該類的私有成員了。
2、運(yùn)算符重載
總原則、目的:為了使對(duì)用戶自定義數(shù)據(jù)類型的數(shù)據(jù)的操作與內(nèi)置的數(shù)據(jù)類型的數(shù)據(jù)的操作形式一致。--->例子:復(fù)數(shù)。
內(nèi)置類型 (8 種): ?>int /char / short / long /float /double /bool / ?> C++ 定義內(nèi)置類本身具有復(fù)制語(yǔ)義 。值語(yǔ)義(復(fù)制語(yǔ)義),不能進(jìn)行(禁止)復(fù)制的類,對(duì)象語(yǔ)義
重載規(guī)則不能對(duì)內(nèi)置類型的運(yùn)算符進(jìn)行重載 重載操作符必須具有一個(gè)自定義類類型或者是枚舉類型的操作數(shù) int operator+(int, int);//不能重載 優(yōu)先級(jí)和結(jié)合性是固定的,操作符的優(yōu)先級(jí)、結(jié)合性或操作數(shù)個(gè)數(shù)不能改變 X == Y + Z;
?? 4. ?如果一旦重載了邏輯運(yùn)算符,則它不再具備短路求值特性 ,不建議重載邏輯運(yùn)算符。重載操作符并不保證操作數(shù)的求值順序? &&? || ?。
? ?5、對(duì)于絕大多數(shù)可重載操作符來(lái)說(shuō),兩種重載形式都是允許的。但對(duì)下標(biāo)運(yùn)算符[] 、賦值運(yùn)算符=、函數(shù)調(diào)用運(yùn)算符()、指針運(yùn)算符->,只能使用成員函數(shù)形式。
運(yùn)算符重載的方式分為下面3種: ?? 1. 采用普通函數(shù)(自由函數(shù))的重載形式 ? --> ?+ ?- ?* ?/? 2. 采用友元函數(shù)的重載形式 ?---> ? + ?- ?* ?/ ? 3. 采用成員函數(shù)的重載形式? ---> ? ?復(fù)合運(yùn)算符 += ?++ ? -- ? ?復(fù)制運(yùn)算符 ?= ? ?operator new/delete 函數(shù)調(diào)用運(yùn)算符 ?() ?--->函數(shù)對(duì)象 [ ?] ? --->下標(biāo)訪問(wèn)運(yùn)算符 ? 右值,在操作符的右邊,同理,左值。
4、寫時(shí)復(fù)制 (Copy -on -Write) ?----> ? ?編程界“懶惰行為”——拖延戰(zhàn)術(shù)的產(chǎn)物 GNU-GCC 5.X.X ?---> ?String類也有應(yīng)用,SSO (短字符串優(yōu)先)short string optimazation? GNU-GCC ?4.X.X ?---->COW ( 寫時(shí)復(fù)制 ) 表達(dá)復(fù)制語(yǔ)義時(shí),才是寫時(shí)復(fù)制。 比如:fork( )中就有體現(xiàn)。
- 友元之普通函數(shù)(非成員函數(shù),自由函數(shù))
- 友元之成員函數(shù),,用到類的前向聲明---->聲明的是一個(gè)不完全的類。
- 友元之類。friend ?Line 或friend class Line
- 友元關(guān)系是單向的關(guān)系。不能傳遞,是不可繼承的。
- 只有兩個(gè)有強(qiáng)相關(guān)的時(shí)候,才使用,一般不使用。
2、運(yùn)算符重載
總原則、目的:為了使對(duì)用戶自定義數(shù)據(jù)類型的數(shù)據(jù)的操作與內(nèi)置的數(shù)據(jù)類型的數(shù)據(jù)的操作形式一致。--->例子:復(fù)數(shù)。
內(nèi)置類型 (8 種): ?>int /char / short / long /float /double /bool / ?> C++ 定義內(nèi)置類本身具有復(fù)制語(yǔ)義 。值語(yǔ)義(復(fù)制語(yǔ)義),不能進(jìn)行(禁止)復(fù)制的類,對(duì)象語(yǔ)義
- 不能重載的運(yùn)算符有: ? (帶點(diǎn)的不能重載) ??
- 成員訪問(wèn)符? . ??
- 成員指針訪問(wèn)運(yùn)算符? .* ??
- 域運(yùn)算符? :: ??
- 長(zhǎng)度運(yùn)算符 ?sizeof? ? ??
- 條件運(yùn)算符號(hào) ??: ? ? ?
重載規(guī)則
運(yùn)算符重載的方式分為下面3種: ?? 1. 采用普通函數(shù)(自由函數(shù))的重載形式 ? --> ?+ ?- ?* ?/? 2. 采用友元函數(shù)的重載形式 ?---> ? + ?- ?* ?/ ? 3. 采用成員函數(shù)的重載形式? ---> ? ?復(fù)合運(yùn)算符 += ?++ ? -- ? ?復(fù)制運(yùn)算符 ?= ? ?operator new/delete 函數(shù)調(diào)用運(yùn)算符 ?() ?--->函數(shù)對(duì)象 [ ?] ? --->下標(biāo)訪問(wèn)運(yùn)算符 ? 右值,在操作符的右邊,同理,左值。
- += ? -= 建議使用成員函數(shù)重載。 -->對(duì)于復(fù)合賦值運(yùn)算符。自增,自減運(yùn)算符。(對(duì)于重載來(lái)說(shuō),前置++,更容易實(shí)現(xiàn),可以返回& ,complex & operator++( )。對(duì)于后置++ 不能返回引用了,寫成,Complex operator ++(int) //int不代表一個(gè)參數(shù),只是作為一個(gè)標(biāo)志,與前置++做區(qū)別) ?所以,能夠使用前置的時(shí)候,就不要使用后置。(因?yàn)榍爸?#43;+ 的效率高于后置++)特別是在迭代器的時(shí)候。
- 對(duì)于+ - * 、可以使用自由函數(shù)或friend重載。
- 對(duì)于絕大多數(shù)可重載操作符來(lái)說(shuō),兩種重載形式都是允許的。但對(duì)下標(biāo)運(yùn)算符[] 、賦值運(yùn)算符=、函數(shù)調(diào)用運(yùn)算符()、指針運(yùn)算符->,只能使用成員函數(shù)形式。
- 函數(shù)調(diào)用運(yùn)算符()同樣只能重載為成員函數(shù)形式,返回類型 operator()(arg1,arg2,……) ? ? 參數(shù)個(gè)數(shù)可以有多個(gè),沒(méi)有限制。 ?這里的對(duì)象是一個(gè)函數(shù)對(duì)象,它是重載了函數(shù)調(diào)用運(yùn)算符的類創(chuàng)建的對(duì)象。
- 下標(biāo)運(yùn)算符[ ] ? ?返回類型& operator[ ](參數(shù)類型); 下標(biāo)運(yùn)算符的重載函數(shù)只能有一個(gè)參數(shù),不過(guò)該參數(shù)并沒(méi)有類型限制,任何類型都可以,如果類中未重載下標(biāo)運(yùn)算符,編譯器將會(huì)給出下標(biāo)運(yùn)算符的缺省定義。
- 輸入>> 輸出 <<的重載
-
- 輸入輸出流運(yùn)算符第一個(gè)參數(shù)要求是流類型(ostream , istream) ,而如果作為成員函數(shù)存在,則它的第一個(gè)參數(shù)是this 指針,故不能以成員函數(shù)重載,建議以自由函數(shù),且為友元函數(shù)。
- 流對(duì)象是不能進(jìn)行復(fù)制的。故只能返回引用。不能返回一個(gè)類型。
- 注意參數(shù)類型時(shí)i,不修改的才能加const ,要修改的不能加const 。
- 指針運(yùn)算符 -> 和 * 的重載
-
- 在智能指針時(shí),還會(huì)講解,有應(yīng)用。
- 類型轉(zhuǎn)換
-
- 轉(zhuǎn)換場(chǎng)合有:
-
- 賦值轉(zhuǎn)換 表達(dá)式中的轉(zhuǎn)換 顯式轉(zhuǎn)換
- 函數(shù)調(diào)用,
- 傳遞參數(shù)時(shí)的轉(zhuǎn)換
- 轉(zhuǎn)換方向有:
-
- 由定義類向其他類型的轉(zhuǎn)換
- 由其他類型向定義類的轉(zhuǎn)換
- 由其他類型(如int、double)等向自定義類的轉(zhuǎn)換是由構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)的
- 類型轉(zhuǎn)換函數(shù)
-
- 在類中定義類型轉(zhuǎn)換函數(shù)的形式一般為:
- operator 目標(biāo)類型名();
- 有以下幾個(gè)使用要點(diǎn):
- 轉(zhuǎn)換函數(shù)必須是成員函數(shù),不能是友元形式。
- 轉(zhuǎn)換函數(shù)不能指定返回類型,但在函數(shù)體內(nèi)必須用return語(yǔ)句以傳值方式返回一個(gè)目標(biāo)類型的變量。
- 轉(zhuǎn)換函數(shù)不能有參數(shù)
- 盡量不要多使用,違反直覺(jué)思維的。
- 類作用域
-
- 在類中定義的成員變量和成員函數(shù)的作用域是整個(gè)類
- (1)全局作用域 在函數(shù)和其他類定義的外部定義的類稱為全局類
- (2)類作用域(類中類、嵌套類) ? ? ? ? ? ? ? 一個(gè)類可以定義在另一類的定義中,這是所謂嵌套類,---> 嵌套類可以用來(lái)封裝。 ? ? ?
- PIMPL設(shè)計(jì)模式 ? ?---->了解一下。
-
- 實(shí)現(xiàn)信息隱藏
- 能夠保證接口的穩(wěn)定性,內(nèi)部的實(shí)現(xiàn)做任何變化都不會(huì)影響使用該頭文件的程序,可以最小的變化做到平滑升級(jí)庫(kù)的目的。
- 減小編譯的依賴。
- 塊作用域 類的定義在代碼塊中,這是所謂局部類,該類完全被塊包含,其作用域僅僅限于定義所在塊,不能在塊外使用類名聲明該類的對(duì)象
4、寫時(shí)復(fù)制 (Copy -on -Write) ?----> ? ?編程界“懶惰行為”——拖延戰(zhàn)術(shù)的產(chǎn)物 GNU-GCC 5.X.X ?---> ?String類也有應(yīng)用,SSO (短字符串優(yōu)先)short string optimazation? GNU-GCC ?4.X.X ?---->COW ( 寫時(shí)復(fù)制 ) 表達(dá)復(fù)制語(yǔ)義時(shí),才是寫時(shí)復(fù)制。 比如:fork( )中就有體現(xiàn)。
- 我們把引用計(jì)數(shù)放在堆上面,采用將引用計(jì)數(shù)放在字符串的‘\0’的后一位。
- 引用計(jì)數(shù)加減一,用函數(shù)封裝,在復(fù)制構(gòu)造函數(shù)時(shí)需要先淺拷貝,在加一。
- 賦值運(yùn)算符,如果不是自賦值,先左操作數(shù),引用計(jì)數(shù)減一,判斷是否為0,若是,在delete ?,淺拷貝,在右操作數(shù)計(jì)數(shù)加一。在返回。
- 用 [ ]重載后,用來(lái)修改,如果引用大于1,就原來(lái)引用減去1,然后開空間,在去復(fù)制,,在淺拷貝(修改指向),在初始化新的引用計(jì)數(shù)。
總結(jié)
以上是生活随笔為你收集整理的C++学习笔记系列四的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2. 性能测试中常见术语集合
- 下一篇: style.width与offsetWi