日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【Accelerated C++】重点回顾(续)

發布時間:2025/3/21 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Accelerated C++】重点回顾(续) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看了劉未鵬推薦過的C++入門經典《Accelerated C++》,讀此書的過程中一再感嘆“大師就是大師,他可以很輕松的把東西的本質呈現在你面前”,這本書采用了現實中與我們很接近的學生成績信息管理這一例子,層層推進,一步一步引出C++中的知識點,根據任務提出解決方案,讓你感受到C++中一些設計的比要性。

一下是我讀此書時做的筆記,謹用于記憶。


ps:這篇是第二篇,之前的筆記請看這個鏈接【Accelerated C++】重點回顧。


第八章、編寫泛型函數


? ? C++語言的一個重要特性就是可以使用并創建泛型函數。

2、而且僅有一個類型以特定的方式支持特定的操作集時,這個類型才是迭代器。

3、實現泛型函數的語言特性叫做‘模板函數’(template function)
? ? ? --模板是標準庫的基石。
? ? template <class T>
? ? T median( vector<T> v ){
? ? ? ? ...
? ? }
? ? T為類型參數。

4、模板實例化
? ? 當我們一個vector<int>對象調用median函數時,系統會高效的創建并編譯這個函數的一個實例,而且在這個函數中所有T都會用int來取代。

? ? C++標準并沒有說明系統改如何管理模板實例化,所以每個系統都按照它自己的特殊方式來解決實例化。

? ? 模板實例化有兩點需要明確的:
? ? ? ? 1)C++系統遵循的是傳統的編輯-編譯-鏈接模板,實例化往往不是發生在編譯時期,就是在鏈接時期。直到模板實例化,系統才會檢驗模板的代碼是否可用用于指定的類型。
? ? ? ? 2)當前的大多數系統都要求,為了可用實例化一個模板,模板的定義,而不僅僅是聲明,都必須是系統可以訪問的。這意味著:定義模板的源文件和頭文件都必須是可訪問的。很多系統都希望模板的頭文件可以包含源文件 --->函數聲明與定義都在.h文件中。

5、標準庫定義了5個迭代器種類:
? ? 1)順序只讀訪問 ? ? -->輸入迭代器 ? ? ? ? ? ? ? ? ? ?只能輸入
? ? 2)順序只寫訪問 ? ? -->輸出迭代器 ? ? ? ? ? ? ? ? ? ?只能輸出
? ? 3)順序讀寫訪問 ? ? -->前向迭代器(所有標準庫都滿足),既能輸入,也能輸出
? ? 4)可逆訪問 ? ? ? ? -->雙向迭代器(容器類都支持) , ? 既能輸入,也能輸出
? ? 5)隨機訪問 ? ? ? ? --高效的隨機訪問任意元素, ? ? ? 既能輸入,也能輸出



6、為什么下界常常是指向最后一個元素的下一個值? ? ? (更簡單,可靠)
? ? 1)如果這個區間沒有任何元素,那么就沒有能標記末尾的最后一個元素。--如果在開始元素之前的位置標記為空區間,會降低程序的可靠性。
? ? 2)可以讓我們只需要比較迭代器的相等性和不等性。
? ? ? ? while( begin != end )
? ? ? ? ? ? ++begin;
? ? 3)可以為我們提供一種罪自然的方式來表示'區間之外'。

7、如果沒有標準庫需要區分輸入輸出迭代器和前向迭代器的話,為什么還分出這兩個種類呢?
? ? 其中的一個原因是,并不是所有迭代器都與容器相關聯。比如:
? ? ? ? 標準庫提供了可以和輸入輸出流綁定的迭代器。用于istream的迭代器滿足輸入迭代器的要求,用于ostream的迭代器滿足輸出迭代器的要求。
? ? ? ? 使用適當的流迭代器,我們可以通過普通的迭代器操作來控制一個istream或者一個ostream。 流迭代器就是一個模板。

8、C++標準庫的一個重要貢獻就是,通過把迭代器用作算法和容器之間的粘合劑,算法可以獲得數據結果的獨立性。此外,算法使用的迭代器都要求支持某些操作,這樣我們就可以根據這些操作來分解算法,這就意味著,我們可以很容易的把一個容器和能夠在這個容器上使用的算法匹配起來。

第九章、定義新類型


1、C++有種類型:
? ? 內置類型和類。


2、許多C++設計都基于這樣的一種思想:
? ? 允許程序員創建于內置類型一樣易用的類型。


3、即便一個程序從來沒有直接的創建人和const對象,它也可能會通過調用創建大量的const對象的引用。
? ? 如:當我面把一個非const對象傳遞給帶有一個const引用的函數時,這個函數就會把這個對象當做是const對象來處理,編譯器也將只允許它調用這種對象的const成員。


4、何時為成員函數,何時為非成員函數?
? ? 有一個通用的規則:如果這個函數會改變對象的狀態,那么這個函數就應該成為這個對象的成員。


5、struct與class的唯一區別:
? ? 默認保護的方式不同。默認保護會應用于第一個保護標簽之前的所有成員。


? ? struct:第一個保護標簽之前的成員都是public
? ? class: 第一個保護標簽之前的成員都是private


6、訪問器函數
? ? 因為我們隱藏了數據成員,因此我們需要定義一個訪問器函數來進行訪問。
? ? std::string name() const{ return str; }
? ? 那么函數是一個const成員函數,它不帶有任何參數,并且返回一個string值,也就是str的一個副本。通過復制str,而不是返回它的一個引用。


? ? 這樣的函數經常被允許簡單地訪問隱藏的數據,這樣就破壞了我們想要得到的封裝性。
? ??
? ? 只有當訪問器是類的抽象接口的一部分時,才應該提供訪問器。
? ? 這里,我們抽象出了一個學生和一個對應的最終成績,所以提供一個name函數是合適的。換句話說,我們并沒有提供其他的成績--midterm、final、或者homework的訪問器。因為這些成績都是時下的基本組成部分,而不是接口的組成部分。


7、當創建標準庫中某個類的一個對象時,標準庫可以保證這個對象開始時會有一個適當的值。


8、構造函數?
? ? 是特殊的成員函數,它定義了對象如何初始化。我們沒有辦法顯示調用一個構造函數。但是創建類的一個對象時就會自動的調用適當的構造函數。
? ? 如果沒有定義任何夠做函數,編譯器就會為我們合成一個。


9、默認合成的構造函數的規則:
? ? 1)如果一個對象的類型是定義了一個或多個構造函數的類的話,那么適當的構造函數會完全控制這個類的對象的初始化。
? ? 2)如果一個對象的類型是內置類型的話,那么值初始化會把它設置為0,而默認初始化會提供一個不明確的值。
? ? 3)否則,這個對象的類型只能是沒有定義任何構造函數的類。
? ? ? ? 如果是這樣的話,對這個對象進行值初始化或者默認初始化就會對它的每個數據成員進行適當的值初始化或者默認初始化。如果這個對象的任何一個數據成員的類型也是一個類,而且這個類帶有自己的構造函數的話,初始化過程就會遞歸的進行。


10、我們應該確保每個數據成員任何時候都有一個有意義的值。


11、默認構造函數:
? ? 不帶有任何參數的構造函數被認為是默認構造函數。
? ? 它的工作是確保對象的數據成員被適當地初始化。


12、系統在創建一個新的類對象時,會發生下面幾個連續的步驟:
? ? 1)系統會分配內存空間,以保存這個對象。
? ? 2)根據構造函數的初始化列表,初始化這個對象。
? ? 3)執行構造函數的函數體。


13、系統會初始化每個對象的每個數據成員。不管夠做函數初始化列表中是否有這些成員。
? ? 雖然夠做函數的函數體隨后可能會改變這些初始值,但是初始化列表會在構造函數的函數體執行前執行。


? ? 通常來說,顯示的為一個成員提供一個初始值,要比在構造函數的函數體中對這個成員進行賦值要好的多。
? ? ? ? 通過這樣的初始化,而不是進行賦值操作,我們可以避免做兩次相同的工作。


14、對于內置類型的成員來說,在構造函數中為它們提供一個值顯得尤為重要。
? ? 因為,如果沒有初始化,那么在局部生存空間中聲明的對象就會使用垃圾信息來初始化。


15、成員初始化的順序取決于它們在類中聲明的順序。
? ? 因此,應該要避免順序的依賴性--->在構造函數的函數體中對這些成員賦值,而不是在構造函數初始化列表中初始化它們。


第十章、管理內存和底層數據結構


1、理解標準庫的關鍵是:
? ? 使用核心語言的編程工具和技巧,這些方法在其他地方也派的上用場。

2、數組和指針:
? ? 數據也是一種容器。
? ? 指針是一種隨機訪問的迭代器。

3、指針是表示對象的地址的一個值。每個不同的對象都有一個唯一的地址,這個地址表示計算機中保存這個對象的內存空間。
? ? 如果x是一個對象,那么&x就是它的地址,
? ? 如果p是一個對象的地址,那么*p就是對象本身。

? ? &x中的&是一個取地址操作符。
? ? *是一個解引用操作符,作用類似于迭代器上的*的作用。

4、程序員們經常使用0值來初始化指針,因為
? ? 可以把0轉換為指針時可以生成一個值,它可以確保與指向任何對象的指針的值不同。
? ? 而且,常數0是唯一一個可以轉換成指針類型的整數值。
? ? 從0轉換生成的值,常常稱為空指針。

5、指向函數的指針
? ? 沒有程序可以創建或修改一個函數,只有編譯器可以做這個工作。
? ? 對于函數來說,程序所能做的,僅僅是調用它或者取得它的地址。

6、int (*fp)(int);
? ? fp是一個函數指針,它所指的函數帶有一個int類型的參數,并且返回int類型的結果。
? ? int next( int n )
? ? {
? ? ? ? return n+1; ?
? ? }
? ? 可以使用下列任一條,使fp指向next函數:
? ? ? ? fp = &next;
? ? ? ? fp = next;?
? ? 可以完全這樣的操作:
? ? ? ? i = (*fp)(i);?
? ? ? ? i = fp(i);?
7、
8、數組:
? ? 不能動態的增長或收縮,編譯時期,必須知道數組匯總的元素個數。
? ? 數組名:就是一個指向數組中首元素的指針。

9、字符串直接量
? ? 一個字符串直接量實際上是一個const char數組,它包含的元素個數比字面上的字符數多1.--‘\0’
? ? 字符串直接量就是一個指針,指向空字符終止的數組的首字符。

10、3中內存管理
? ? 1)自動內存管理
? ? ? ? 系統在運行時為這個局部變量分配所需內存,并子退出時釋放。
? ? ? ? int* invalid_pointer()
? ? ? ? {
? ? ? ? ? ? int x;?
? ? ? ? ? ? return &x; ?
? ? ? ? }
? ? ? ? 這個函數會返回局部變量x的引用,但是,返回時,x所占的內存已經被釋放。&x創建的指針現在是無效的。

? ? 2)靜態內存管理
? ? ? ??
? ? ? ? int* pointer_to_static()
? ? ? ? {
? ? ? ? ? ? static int x;?
? ? ? ? ? ? return &x;?
? ? ? ? }
? ? ? ??
? ? ? ? 程序對x分配一次內存,而且只分配一次,并且只要程序在運行,我們就不釋放這個變量的內存。
? ? ? ??
? ? ? ? warnning:每次返回一個相同的對象的指針
? ? ? ??
? ? 3)動態分配內存
? ? ? ? 刪除一個零指針沒有什么影響。

? ? ? ? int *p = new int(42);?
? ? ? ? ++*p; ?//*p is now 43
? ? ? ? delete p;?
? ? ? ? int* pointer_to_dynamic()
? ? ? ? {
? ? ? ? ? ? return new int(0);?
? ? ? ? }
? ? ? ? 調用這個函數的程序應該在適當的時候負責釋放這個對象。


第十一章、定義抽象數據類型


1、當設計一個類時,一般都首先指定需要提供的接口。

2、內存分配
? ? 使用new T[n] 不僅會分配好內存空間,還會調用T的默認構造函數來初始化每個元素。
? ? 如果我們使用了new T[n],那么我們就對T強加了一個要求:只有當T有一個默認構造函數時,用戶才能創建一個Vec<T>對象。

3、explicit:
? ? 意思是:只有在用戶明確地調用這個構造函數的地方,編譯器才能使用這個構造函數,否則無法使用。
? ? 這個關鍵字只在帶有一個參數的構造函數的定義中有意義。

4、通常的,迭代器本身也是類。

5、一般來說,操作符函數可以是成員函數,也可以是非成員函數。
? ? 然而,索引操作符是必須為成員函數的操作之一。

6、索引操作符可以找到底層數組的對應位置,然后返回這個位置的元素的引用。
? ? 返回引用的原因:
? ? ? ? 如果保持在容器中的對象很大的話,應該避免對這些對象進行復制,這樣效率才更高。

7、類的作者可以控制對戲那個創建,復制,賦值以及銷毀過程中發生的一切。如果沒有定義這些操作,編譯器會合成這些定義。--可能會導致莫名其妙的行為。

8、復制構造函數
? ? 無聊是顯示復制,還是隱式復制,都是有一個叫做復制構造函數的特殊構造函數來控制的。
? ? 復制構造函數是一個成員函數。

? ? Vec(const Vec& v);?
? ? 復制不應該改變被復制的對象,所以使用const。

7、如果我們復制指針的值,那么復制的指針和原先的指針就都指向相同的底層數據。
? ? warnning:其中一個數值的改變會引起另一個值的改變,因為它們指向的是同一個數據。
? ? 解決方案:當復制一個Vec對象時,需要分配新的空間。

8、賦值操作符不同于復制構造函數的地方是:
? ? 賦值操作符往往需要刪掉左操作符已有的值,然后用新的值,也就是右操作符的值來替換。
? ??
? ? 需要考慮自我賦值情況的處理。

9、Vec<T>::operator=( const Vec& rhs )
? ? {
? ? ? ? ...
? ? ? ? return *this;?
? ? }

? ? 使用*this:
? ? ? ? this關鍵字只在成員函數內部有效。
? ? 須確保返回時,引用的對象仍存在,因此不能返回局部對象的引用。

10、賦值不是初始化
? ? 理解賦值和初始化之間的區別是學好C++的關鍵之一。
? ? 初始化: 復制構造函數
? ? 賦值: ? operator=

? ? 區別:
? ? ? ? 賦值總會刪除先前的值,而初始化不會這樣。而且,初始化會創建一個新的對象,同時為這個對象提供一個值
? ??
? ? 兩者區別重要的原因:
? ? ? ? 1)構造函數總是用來控制初始化
? ? ? ? 2)operator=成員函數總是用來控制賦值操作

? ? 初始化會發生在:
? ? ? ? 1)變量聲明中
? ? ? ? 2)在函數如果中,傳遞函數參數的時候
? ? ? ? 3)在函數返回語句中,返回一個值的時候
? ? ? ? 4)在構造函數初始化列表中

? ? 賦值發生在:
? ? ? ? 在表達式中使用=操作符的時候
? ??
? ? 如:
? ? ? ? string url_ch = "zerocool"; ? ? ? ? //initialization
? ? ? ? string spaces(url_ch.size(), ''); ? //initialization
? ? ? ? string y; ? ? ? ? ? ? ? ? ? ? ? ? ? //initialization
? ? ? ? y = url_ch; ? ? ? ? ? ? ? ? ? ? ? ? //assignment

11、析構函數:無人和參數與返回值,控制類的對象被銷毀時發生的操作。

12、良好的習慣:為每個類提供一個 默認構造函數(可能是顯式或隱式的提供)

13、如果類的作者沒有定義賦值構造函數、賦值操作符、析構函數---編譯器會生成默認版。
? ? 默認版的函數會定義為遞歸操作————根據元素類型的適當規則、賦值、復制或者銷毀數據元素。
? ? warnning:默認析構函數來銷毀一個指針時,并不會釋放指針指向的內存空間。

14、三者缺一不可的規則:
? ? 由于復制構造函數、析構函數以及賦值操作符如此緊密的聯系在一起,所以它們之間的關系就形成了一個三者缺一不可的規則:如果一個類需要一個析構函數,那么它也需要其他兩個。

15、使用new:不僅會分配內存空間,還會把這些內存初始化(即使我們不適用這些元素)


第十二章、使類的對象像數值一樣工作


本章重點討論如何為類設計良好的接口。

1、友元
? ? 用來使非成員函數讀寫成員數據。
? ? 可以定義寫成類定義中的任何地方):不管它是跟在private標簽,還是public標簽后,都沒有什么區別。
? ? 由于友元函數有特殊的訪問權限,所以它是類的接口的一部分。因此(最好在類定義的開頭位置,靠近類的公有接口的地方)

2、定義二元操作符
? ? 非成員函數-->對稱性
? ? 把二元操作符定義為非成員函數就是一個很好的習慣。這樣做,我們可以保持操作數之間的對稱性。

? ? 如果一個操作符是一個類的成員,那么這個操作符的左操作數就不能是自動類型轉換的結果。

3、explicit
? ? 一般來說,如果一個構造函數是用來定義對象的結構的構造方式,而不是定義對象內容的構造方式的話,這個構造函數就會被定義為explicit,、。如果夠做函數的參數是對象的一部分的話,這種構造函數就不應該定義為explicit。

4、void*類型
? ? 指向void的指針常常被叫做通用指針,這是因為這種指針可以指向任何類型的對象。
? ? 當然,我們不能對這種指針解引用,原因是它指向的對象的類型還是未知的。
? ? 但是我們可以把void*轉換為bool類型。

5、類型轉換和內存管理
? ? 很多C++程序對系統的接口都是用C語言或者匯編語言來完成的,這些語言都是使用以空字符終止的字符數組來保存字符串數據的。

6、類型轉化是通過非explicit的夠做函數定義的,并且這種構造函數只帶有一個單獨的參數:類型轉換也可以通過類型轉換操作符來定義,形式為operator type-name()。



第十三、使用繼承和動態綁定


1、繼承是oop的基石。

2、系統是如何創建派生類的對象,
? ? 系統首先會為這個對象分配空間。接下來,它會執行適當類型的構造函數來初始化這個對象。如果這個對象是派生類的對象,就需要給構造過程再加一步,那就是構造對象的基類部分。派生類的對象是按照下面的方式來構造的:
? ? 1、為整個對象分配空間(包括基類成員和派生類成員)
? ? 2、調用基類的構造函數來初始化對象中的基類部分
? ? 3、使用構造函數初始化列表直接初始化派生類的成員
? ? 4、如果派生類的構造函數的函數體中有語句,就執行這些語句

3、多態和虛函數
? ? 關鍵字virtual只能用在類定義中。
? ? ? ? 如果這個函數是在聲明之外單獨定義的話,我們就不需要在定義中重復關鍵字virtual了。

4、動態綁定
? ? 虛函數的運行時選取只與什么時候通過引用或者指針來調用這個函數有關。
? ? 如果通過一個對象(而不是通過對象的引用或者指針)來調用一個虛函數,當然可以在編譯時知道這個對象的準確類型。一個對象的類型是確定的:它就是它定義時的類型,不會再運行時改變。
? ? 相反,基類的引用或者指針可以引用或指向基類的對象,也可以引用或指向這個基類的派生類的對象,也就是說,引用和指針的類型以及引用和指針綁定的對象的類型,在運行時可能會改變。

5、靜態綁定:在編譯時綁定

6、動態綁定和靜態綁定的區別是理解C++如何支持OOP的關鍵。
? ? 如果我們用一個對象來調用一個虛函數,這個調用就是靜態綁定,因為除了編譯時期,對象的類型不可能在執行的過程中發生變化。
? ? 相反,如果我們通過一個指針或者引用來調用一個虛函數,這個函數就是動態綁定,也就是說,是在運行時綁定的。在運行時,使用哪個版本的虛函數,取決于這個引用和指針綁定的對象的類型。

7、我們可以在需要指向基類的指針或引用的地方使用派生類類型,這個例子就是OOP的核心概念————多態。
? ? 它的意思是,一個類型可以代表多種類型。
? ? C++是通過虛函數的動態綁定特性來支持多態的。

8、虛析構函數
? ? 如果一個指向基類的指針被用來刪除派生類的對象時,基類就需要一個虛析構函數。如果這個類沒有別的理由需要一個析構函數的話,這個虛析構函數就必須被定義,而且函數體可以為空。
? ? 虛析構函數也可以繼承。

9、派生類沒有必要中定義虛函數。
? ? 如果一個類沒有重定義虛函數,它就會繼承這個函數在繼承層次中離當前最近的定義。
? ? 然而,首先出現在這個類中的虛函數必須被定義。

10、覆蓋
? ? 如果派生類的函數與基類一樣,就可以覆蓋基類的函數。

11、友元不能被繼承,也不能傳遞。


from:?http://blog.csdn.net/cyh_24/article/details/8276138

總結

以上是生活随笔為你收集整理的【Accelerated C++】重点回顾(续)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 污视频在线观看网址 | eeuss国产一区二区三区黑人 | 婷婷精品一区二区三区 | 99精品视频免费看 | 久久人妻少妇嫩草av无码专区 | 日本一二三区视频在线 | 91视频这里只有精品 | 日韩一区二区不卡 | 国产视频二区三区 | 粗喘呻吟撞击猛烈疯狂 | 97伊人超碰| 国产精品成人免费精品自在线观看 | 亚洲清纯唯美 | 日韩国产精品一区二区 | 人人人爽 | 姐姐你真棒插曲快来救救我电影 | 欧美色图一区 | 免费av一区二区三区 | 视频一区二区欧美 | 浓精h攵女乱爱av | 国产在线播放一区二区三区 | 性色av网址 | 久草观看视频 | 激情五月综合色婷婷一区二区 | 国产三级在线免费 | 污视频网址 | 四虎视频在线观看 | 国产一区二区在线观看视频 | 污片在线看 | 成年人免费在线 | 亚洲激情视频网站 | 综合视频一区 | 久久视| 国产操人 | 日本做爰三级床戏 | 一起草国产| 夜夜嗨av一区二区三区网页 | 日批免费观看视频 | 韩国久久精品 | 特级毛片av | tube极品少妇videos | 成人国产视频在线观看 | 国产精品视频麻豆 | 一级 黄 色 片69 | 欧美日本二区 | 毛片xxx | 亚洲色图17p | 亚洲第一精品在线 | 第四色影音先锋 | 天天干天天添 | 欧美另类xxx | 成人靠逼视频 | 欧美激情黑白配 | 欧美日一本 | 男人天堂你懂的 | 亚洲丝袜在线视频 | 国产午夜在线一区二区三区 | 欧美丰满熟妇xxxx | 国产精品第1页 | 关之琳三级全黄做爰在线观看 | av免费影院 | 国产高清视频在线观看 | 韩国美女一区 | 黄色网视频 | 成人精品福利视频 | 亚洲国产精品电影 | 公交上高潮的丁芷晴 | 免费成人结看片 | 国产丰满美女做爰 | 日本一区二区成人 | jizzjizz中国精品麻豆 | 中文字幕影片免费在线观看 | 欧美激情一区二区三区 | 亚洲激情五月婷婷 | 色哟哟国产精品 | 天天操天天插 | 粉嫩av在线播放 | 国外成人免费视频 | 色婷婷精品国产一区二区三区 | 黄色工厂在线观看 | 一本一道久久a久久精品蜜桃 | 亚洲白浆 | 亚洲伦乱| 国产精品一页 | 色天天色| 亚洲人人夜夜澡人人爽 | 天天干夜夜爽 | 自拍偷拍第一页 | 国产精品不卡一区二区三区 | 亚洲色图国产精品 | 日本丰满大乳奶做爰 | 成人黄色大片在线观看 | 三上悠亚在线一区 | 蜜桃视频一区二区在线观看 | 免费毛片在线播放 | 草草福利视频 | 豆花视频在线播放 | 伊人久久大 | 性欧美xxxx |