讀書筆記 C 語言設計與演化

2021-08-20 17:10:02 字數 3257 閱讀 4303

1、乙個好的語言工具的準則:

對程式組織的支援: 具備類分層結構,對併發的某種形式支援,對型別系統的強檢查

高效能:執行速度快,編譯整合程式簡單有效。

高度可移植,多平台可執行

2、c++的很多設計角色根源於坐著對強迫人按某種特定方式行事的極度厭惡。c++被有意設計成能夠支援各種各樣的風格,而不是強調一條真理路。

3、帶類的c:

基於cpre預處理器接受的為描述模組化和併發而做的一種c語言擴充語言。具有乙個關鍵性c++庫和能支援協程方式程式設計的作業系統。

根本目的是支援併發和simulaf風格的模擬。

帶類的c設計能允人們更好的去組織程式,計算仍然被看作是需要c語言解決的問題

設計時關注點:

在執行時間、**緊湊型和資料的緊湊型方面能夠與c相比美

避免帶類的c存在使用領域方面的限制。基本設想:帶類的c應該能用到c可以使用的一切地方。需要取得與c相當的執行效率。

執行時型別檢查由於會失掉c語言在執行時間和空間效率方面的最大又是故不提供。

關鍵決策:

1)帶類的c 遵循simula方式,讓程式設計師去描述型別

2)使用者定義型別的物件的表示作為類定義的一部分。

3)採用編譯時的訪問控制限制對實際表示的訪問。

4)對於函式成員要描述其完整的型別(返回型別 引數型別),編譯時靜態型別檢查需要對這種型別做規範檢查

5)函式定義通常和宣告分開,使得類的申明更像乙個介面,這意味著更容易進行分別編譯。

6)函式new()是建構函式,對編譯系統具有特殊意義,為類提供了建構函式一定會被呼叫的保證。

7)同時提供了指標和非指標型別

8)物件分配三種方式:棧、靜態物件、堆。提供new delete

執行時效率考量:

simula不提供類型別的區域性變數或全域性變數,所有物件只能通過new操作分配,低效。

帶類的c支援類型別的全域性和區域性變數。

引入內聯函式inline與越過類的訪問安全保護**有關,為避免函式呼叫開銷會將資料成員定位public並直接訪問,通過inline解決函式呼叫開銷。由此演變成一條c++設計規則:只提供乙個特徵是不夠的還必須以一種實際可以負擔得起的形式來提供他。

inline機制由程式設計師決定編譯程式應該讓哪些含守護成為inline方式原因:

b)c具有分別編譯機制,編譯程式直接認定的話需要提供全域性分析機制,而採用全域性分析無法適應很大的程式。

inline關鍵字只是一種提示,編譯器可以去做,但也會忽略他,這點在邏輯上是必須的,因為某人可能寫出遞迴函式,編譯時無法證明它不會導致乙個無窮遞迴,可能導致無窮編譯。

連線模型決策:

a)分別編譯應該能使用傳統c風格的連線程式

b)連線應該具有型別安全性

c)連線過程不應該要求各種形式的資料庫

d)很容易並且搞笑的與其他語言寫出的程式片段連線到一起。

c語言採用標頭檔案保證分別編譯的一致性,c++也這樣做

惟一定義規則:在c++中每個函式、變數、型別、常量都應該恰好有乙個定義。

c++只是乙個系統中的乙個語言而不是乙個完整的系統,c++應該扮演傳統程式語言的角色,不必去做那些語言不容易做的事情。這種做法也使得乙個c++程式偏短能夠呼叫其他語言,c++程式片段也溶氧可以被其他語言片段呼叫

帶類的c物件布局模型:

資料成員類似c結構體,成員函式做直接對映

this指標:引入時還沒有引用機制,this是從simula借用過來的術語。

simula提供了類,algol68提供了運算子過載 引用以及在塊裡任何地方宣告變數的能力  bcpl給出//注釋形式

c++設計中最關鍵的問題總是與型別、奇異性、訪問控制等有關

複製建構函式引入是為了解決賦值運算子方式複製存在初始化 而賦值的低效率問題。

c++的誕生:

帶類的c有助於一大類程式組織的比c語言好的多,而且沒有損失執行效率,也沒因為劇烈轉表而被保守組織認為不可行。

但制約他成功的是提供超越c的新功能集合太有限,實現是使用的預處理器技術。

c++目標:

1)使用者將是哪些人?

---從少部分人到大規模使用

2)他們將使用哪種型別的系統?

---使用的作業系統非常多,需要最強的可移植性和交叉編譯能力,不能對執行結果**的機器效能有任何假定。

3)我怎樣才能避免提供工具的工作?

----大規模使用時由支援組織來實現。

4)對以上問題將會怎樣影響語言的定義。

----不能帶有要求特別複雜的編譯系統或執行支援的特徵,必須能使用原來可用的連線程式,而且要求產生的**一開始應該是高效的。

c++引入了新的特徵 虛函式、函式名和運算子過載、引用、常量、使用者可控制的自由空間儲存區控制、改進的型別檢查

虛函式在c++的核心作用:

乙個抽象資料型別定義了乙個黑盒子,一旦定義好之後,他就不會實際的與程式其他部分產生互動作用了。沒有其他辦法能為某些新的使用者而調整她,除非是修改它的定義。這可能帶來很嚴重的靈活性問題。

物件導向程式設計就是要表達差異並從中普遍性處理中獲益。

物件布局模型:

類中定義的虛函式用指向函式的指標陣列儲存,對每個有虛函式的類都存在乙個這樣的虛函式表,每個類物件中都包含乙個隱式指標指向對應類的虛函式表.這種方式簡單且執行高效,缺點是更改乙個類的虛函式集合使用他的**都不許重新編譯。

虛函式只能被派生類中的函式覆蓋,該函式應該具有相同的名字相同的引數和返回型別,這樣就避免了任何形式的執行時引數型別檢查,也不需要在執行時儲存大量的型別資訊。後來對返回型別有所放鬆。

遮蔽的引入是是防止操作非預期以及執行時型別檢查

操作符過載=只能在成員函式中過載,原因是二義性。另外, (),->也必須是成員

引用的引進最初目的是解決運算子過載時大物件效率問題。

what is object-oriented programming:

重申c++的多范型性質的重要性,物件導向的程式設計是利用繼承機制的程式設計。資料抽象是使用使用者定義型別的程式設計。除了少許例外,物件導向的程式設計將能夠而且應該支援收據抽象。這些技術需要有效的正確支援。資料抽象從本質上需要在語言特徵的形式上得到支援。而物件導向的程式設計則更進一步的需要得到程式設計環境的支援。為了達到通用性,支援資料抽象或者物件導向程式設計的語言又必須有效的利用傳統硬體。

c++設計規則和原理:

一般性規則:

c++的發展必須由實際問題推動

不被牽扯到無益的讀完美的追求中

c++必須現在就是有用的

每個特徵必須存在一種合理的明顯實現方式

總提供一條轉變的痛苦

c++是一種語言 而不是乙個完整的系統

為每種應該支援的風格提供全面支援

不試圖去強迫人做什麼

C 系列文章之《C 語言設計與演化》讀書筆記

一直以為自己的c 水平還可以,但是感覺只停留在理論階段,實際遇到問題時還不知所措,進而藉此機會在好好學習一下。學習理論同時以實踐為主,結合自己工作經驗將容易出錯的地方記錄下來,供以後備查。學習計畫如下 a c 語言設計和演化 b accelerated c c c 語言程式設計 d c primer...

C語言讀書筆記

1.c語言中一共有32個關鍵字 分別是 auto int double long char short float unsigned signed sizeof extern static goto if else struct typedef union enum switch case brea...

C語言技巧(讀書筆記)

基礎 1 編寫能清晰表達設計思想和意圖的 2 利用注釋闡述和解釋 並進行總結。3 使用有意義且無歧義的命名方法。4 不要自己編寫庫函式已包括的函式,盡可能的使用標準庫c函式。5 讓程式自己檢查執行中的錯誤 編寫除錯 6 謹慎使用goto語句 7 不要修改那些風格差的 重寫他們!8 不要比較浮點數是否...