c 學習總結一

2021-08-11 16:56:11 字數 2520 閱讀 1821

詳見:

靜態常量與非靜態常量的區別

在建立物件的時候,需要每個成員變數(非靜態)開闢記憶體空間,類變數(靜態變數)則是在類載入的時候就建立好了。

用static修飾過的常量會存到常量池裡面。存入的方式是:先到常量池裡面尋找,看是否該常量已經存在,如果存在返回該常量的引用,不存在就在常量池裡面新建乙個常量,返回引用。如果沒有修飾,就屬於物件的屬性,絕大多是物件是存在中,也就是如果多個物件存在同樣乙個常量,在堆中會為每乙個物件的該常量分配儲存空間。由此可以看出,static修飾後的作用就是減少記憶體的消耗,常量的儲存位置發生了變化。在下圖中靜態常量儲存在唯讀的**和資料區也就是全域性靜態區。

編譯器:靜態

執行期:動態

繼承關係:在執行狀態下是不能改變的,可能會產生組合**的情況。

所以組合由於繼承(大結構)。

動態繫結:執行時刻才確定。

純虛類,抽象類,介面類,抽象出統一的介面。

一旦乙個基類的某個成員函式被定義為虛函式,不論在派生類中是否宣告virtual,派生類的對應成員數均為虛函式。

虛函式有以下幾點限制:

靜態成員不能是虛函式:靜態成員是屬於類的不是屬於某個物件的,不依賴與物件所以不可以通過物件去識別,也就不能夠作為虛函式。

只有類的成員函式才能是靜態函式。顯然

建構函式不能是靜態函式:為什麼?

為什麼呢?

1.我覺得 首先派生類的物件構造的時候必須先層層呼叫基類的建構函式再呼叫派生類自己的建構函式, 如果建構函式為虛函式 在用基類指標指向派生類的物件的時候, 將會先呼叫的是派生類的建構函式 而不會再呼叫基類的建構函式, 這會導致構造出來的預設基類成員變數 。

2.在定義類時,只是通知編譯器需要準備多大的記憶體空間,並沒有為它分配記憶體空間只有用類建立了物件後,才會真正占用記憶體空間。也就是說類的定義時並不會產生任何實際變數以及空間 這只是一段**。在用到類去例項化物件的時候,編譯器才會根據從類定義裡知道的需要分配多大的記憶體空間去給例項化物件分配記憶體空間。虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的

問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化, 也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。析構函式往往可以是虛函式:我們往往通過基類的指標來銷毀物件。這時候如果析構函式不是虛函式,就不能正確識別物件型別從而不能正確呼叫析構函式。因為派生類物件消亡的時候,先會呼叫派生類的析構函式,再會層層往上呼叫基類的析構函式(先構造的後析構),如果用基類的指標來析構派生類物件,如果析構函式不是虛函式,那麼呼叫的將是基類的析構函式(因為此時的指標或者引用是基類的以此識別),將不會呼叫派生類的析構函式,那麼只會析構派生類物件中屬於基類的部分而屬於派生類的部分沒辦法正常析構!反過來將析構函式設定為虛函式將呼叫的是派生類的析構函式,而派生類的析構函式一旦呼叫就會層層往上呼叫基類的析構函式所以此時該物件才能正常析構!(個人理解寫的囉嗦哈)

虛函式是不能內聯的:顯然內聯函式不能為虛函式,原因在於虛表機制需要乙個真正的函式位址,而內聯函式展開以後,就不是乙個函式,而是一段簡單的**(多數c++物件模型使用虛表實現多型,對此標準提供支援),可能有些內聯函式會無法內聯展開,而編譯成為函式。但是有些情況下即使虛函式是內聯函式仍然正確的動態繫結!原因是:即使虛函式被宣告為內聯函式,編譯器遇到這種情況根本不會把這樣的函式內聯展開,而是當做普通函式來處理

對介面程式設計,不對實現程式設計:用抽象類純虛類去抽象公共的基礎的介面,不對具體實現去程式設計。

封裝變化:這個地方到底需不需要封裝起來,要不要用抽象的形式,具體是需求功能所決定的,我們要做的是在最重要的變化點,需要動態擴充套件的地方去封裝,以應對以後未知的變化。

在策略模式(strategy pattern)中,乙個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。

在策略模式中,我們建立表示各種策略的物件和乙個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。

如果在乙個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓乙個物件在許多行為中選擇一種行為。 2、乙個系統需要動態地在幾種演算法中選擇一種。 3、如果乙個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。

這裡是乙個例子用於理解:

還有關於 vs2015執行結果視窗一閃即過的問題:

C 學習總結一

1.ifstream in a.txt a.for int a in a.流一次讀入乙個字元 b.for string str getline in str 流一次讀入一行 2.char的運算與int可是為一樣 3.char char串 和字串陣列型別不同,但是操作上基本一樣,都表示c 串的啟示位址...

C 學習,總結一

接連幾天的陰雨天氣,現在感覺很悶熱,悶熱的讓人難受。不過現在正處於伏天,這樣的天氣也是正常的。今天學習了什麼新東西呢?來總結一下吧,一是加深一下印象,二是留下一段記憶。一 dll的匯出方式。這裡只把 貼出來了。extern declspec dllexport void msgbox wchar t...

C 模板學習總結(一)

最近公司接到乙個平台專案,平台中涉及到c 11和較多模板方面的 發現同事對c 模板部分的理解幾乎為零,也沒有人了解c 11的語法,所以做了幾次培訓,剛開始在c 11部分的講解尚可,模板部分的培訓效果可以說是一塌糊塗,幾乎沒有人能聽懂我在說什麼,兩次以後參加的人也是寥寥無幾了,事後總結了一下,感覺模板...