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