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

2021-06-14 07:50:09 字數 3072 閱讀 9369

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

c++語言設計和演化

b)accelerated c++ c)

c++語言程式設計

d)c++ primer e)

深度探索c++物件模型 f)

effective c++中文版

g)more effective c++中文版

h)c++沉思錄

i)c++標準庫原始碼分析

其中前5本比較偏理論一些,後邊主要偏實踐。由於之前一定c++基礎,再次學習關注點主要包括基礎理論、應用價值、應用場景並且積累一定量c++**。本文是針對《c++語言設計和演化》的讀書筆記以及自己的感悟。

學習語言就像是做研究一樣,知道問題產生的背景、有什麼解決方案、文獻如何解決、結論是什麼以及後續有什麼展望。

c++就是在c語言基礎上,參照simulator進行設計,從帶類的c成長為現在標準版c++。

另外學習c++也要像做研究似的,先了解c++的設計和演化,再去運用去解決問題,最後發現問題去改進。乙個成功產品的誕生源於乙個人的知識面,以及舉一反三的能力:

學習歷史、哲學、文學都會對研究產生影響,就能決定某個人的傾向;例如追求完美的賈伯斯不會因為家裡空曠去買不完美的家具;實用主義者不會設計完全完美理想的系統。

這是一本講述如果從c演化成c++的以及為什麼會引進一些機制

c++的演化歷程

繼承關係物件布局模型

虛函式關係物件布局模型 引用

學習一門語言包括c++,最根本的是學習程式設計和設計技術而不是語言的細節。

第一部分主要介紹了c++的發展史,c-帶類的c-c++;c++語言特性上的取捨;c++的發展等。

第二部分介紹引入到c++中的一些特性。 a)

儲存控制 b)

過載 l空指標:在c++中用null匹配,應該算是乙個巨集定義

l物件的複製控制:主要是控制複製建構函式和賦值操作符

l前置++和後置++的過載 l

bool型別

c)多重繼承 l

記憶體物件布局

l可以通過基類名加上::來訪問基類函式

l多重繼承初始化的問題

l沒有介紹最終採用哪種方式實現d)類

e)強制

lreinterpret_cast(e)主要是對指標的乙個重新解釋,是不安全的。

lconst_cast(e)在const或者volatile之間進行轉換 f)

模版 g)名字空間 h)

c預處理器

1、乙個c++物件可以存在於棧空間、堆上或者靜態區域,對於乙個應用而言堆、棧和靜態空間是多大呢?

在linux系統下new出來的記憶體使用的是堆空間,其他變數的定義均是存放在棧空間上。系統中有專門引數控制棧空間大小,一般為8m,可以自己改變。

如果設定不當回導致棧溢位(什麼情況下會出現呢?留給讀者)

2、類的成員函式式inline的嗎?可以指定為inline嗎?

· 類成員函式預設在類內定義是inline,類外是outline,虛函式例外

3、友元函式是怎麼回事?

· 友元函式和友元類可以通過friend class a.friend +函式宣告,可以用於訪問類內的私有成員和保護成員

· 友元函式:整個函式內宣告和定義的類變數均可以訪問

· 友元性質是需要指定的,沒有對稱性和傳遞性

4、每個帶有虛函式的類都有乙個虛函式表,如何確定該虛函式表的大小呢?

· · 一般虛函式表會放在變數的第乙個位置,並且每乙個虛函式表都會有乙個結束識別符號,進行資料的遍歷獲取虛函式表的大小

· 上面只是對單一繼承的情況

· 對於多重繼承,每個例項會有多個虛函式表,需要進一步了解物件的記憶體布局。

5、操作符過載時為什麼一般將其定義為友元函式呢?

6、c++的放置語法是怎麼回事呢?應用場景是什麼呢?

· 一般來說new和delete的耗時比較大,我們可以事先宣告一段記憶體,用於儲存物件

· 可以通過c++中的放置語法來分配一塊預先定義好的記憶體

7、函式引數裡面省略號(...)使用場景以及方法?

· 首先需要引用標頭檔案,然後利用va_list型別和va_start、va_arg、va_end 3個巨集讀取傳遞到函式中的引數值。

· type va_arg( va_list arg_ptr, type );void va_end( va_list arg_ptr );void va_start( va_list arg_ptr, prev_param );

· 【va_start函式將引數arg_ptr設定為可變引數列表的第乙個引數。引數arg_ptr的型別必須為va_list。引數prev_param是在可變引數列表之前的那乙個引數。(也就是說在ansi c 中,如果乙個函式有可變引數,那麼在該可變引數前必須有乙個明確定義的引數,否則無法呼叫函式va_start,例如函式int add(int i,...)是合法的,而函式int add(...)是不合法的。)】

· 【va_arg函式將返回arg_ptr所指位置的值,並將arg_ptr指向下乙個引數】

8、虛函式的問題,在建構函式中呼叫虛函式和其他函式中呼叫虛函式的區別。

· 建構函式可以呼叫虛函式,但是只會呼叫本身的函式定義,不會產生多型

· 原因是:派生類的虛指標還沒有被初始化;具體解析

o  構造派生類時,要先初始化基類,此時基類的呼叫只會找到本身的函式定義

o  然後才會初始化派生類的虛指標

o  產生多型。

9、虛函式表

· 虛函式表是類的屬性

· 虛函式表在編譯的時候生成,和**一樣存放在唯讀區域

· 虛函式指標在物件初始化的時候賦值

· 虛函式指標一般位於類的前4個位元組

本書主要是介紹c++語言演化過程中,各類特性的產生背景以及簡單的實現策略。一旦乙個語言產生,後續的維護和優化都要向前相容保證其可用。在實際做系統時,後期的開發均要保證前期功能的可用,不可能因為要新增乙個功能就要去改動之前可用的功能,從另外乙個側面也體現了系統設計的重要性。

C語言系列文章之typedef

typedef 應該算是很熟悉的關鍵字了,但是我也只是簡單使用罷了,為了比較系統的講述這一小節,特地上網搜了一下。好了,現在正式開始講解。typedef 關鍵字可以用於給資料型別定義乙個別名,比如說你本名叫關谷神奇,我嫌棄這個名字太長了,所以給你取乙個別名,叫關谷,以後我叫關谷的時候你就知道在叫你了...

C語言系列文章之enum

列舉,顧名思義,就是把乙個個可能的值列舉出來,它們占用的空間是同乙個。這個功能和 define 有些相似,但又不完全一樣,define 是專業替換戶,列舉可能的值只是它的其中一種運用方式罷了 關於 define,可以檢視 define 小節 怎麼理解呢?就比如乙個玻璃瓶,你規定只能用它裝水 飲料 酒...

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

1 乙個好的語言工具的準則 對程式組織的支援 具備類分層結構,對併發的某種形式支援,對型別系統的強檢查 高效能 執行速度快,編譯整合程式簡單有效。高度可移植,多平台可執行 2 c 的很多設計角色根源於坐著對強迫人按某種特定方式行事的極度厭惡。c 被有意設計成能夠支援各種各樣的風格,而不是強調一條真理...