C 中必須知道的問題 轉

2021-06-28 07:43:16 字數 1830 閱讀 2675

1.靜態成員函式為什麼不能宣告為const

2.當乙個父類物件以其子類物件初始化時會發生什麼

3.乙個類的物件所佔記憶體是由什麼決定的

4.建構函式初始化列表的作用

5.為什麼最好不要在建構函式和析構函式中呼叫虛函式

6.虛函式表是怎麼回事

7.虛函式指標vptr存在於乙個物件的什麼位置,其作用是什麼

8.乙個string物件的資料成員佔多少記憶體

9.乙個空類的物件佔幾個位元組

10.通過指標訪問乙個物件的資料成員和通過物件直接訪問其資料成員有什麼區別

11.什麼時候會呼叫拷貝建構函式,什麼時候又會呼叫賦值運算子?

12.建構函式為什麼不能宣告為虛函式

答案:1.普通成員函式宣告為const是防止函式修改呼叫該成員函式的物件的資料成員,這個物件時通過this指標隱式傳遞給該函式的

,而靜態成員函式沒有this指標,所以就沒有這項功能,也就不需要宣告為const

2.子類物件的資料成員包含繼承自父類的資料成員和子類本省的資料成員兩部分,所以用子類物件賦值給父類物件時會發生切割行為,即初始化的父類只會存在子類物件的父類資料成員部分

3.乙個類的物件所佔記憶體是由其資料成員(包括繼承自父類的資料成員和自己本身的資料成員兩部分)加上其虛函式指標(如果存在虛函式)

4.使用初始化列表的建構函式顯式的初始化

類的成員;而沒使用初始化列表的建構函式是對類的成員賦值

,並沒有進行顯式的初始化

初始化列表的作用是初始化而不是賦值,免去了構造物件然後呼叫operator=的過程,所以效率更高一點(對於內建型別或者簡單型別這個並不明顯)

5. 例項化乙個派生類物件時,首先呼叫父類建構函式,此時派生類部分的成員變數還沒有初始化,如果虛函式下降到派生類級,會發生不可預知的行為

6.c++

中當乙個類中存在

virtual

函式(虛函式)或者它的父類中存在虛函式,那麼編譯器就會為這個類生成虛函式表(

virtual table

),虛函式表中存放著虛函式的位址,含有虛函式的類或者其子類的物件編譯器都為其加上乙個虛函式指標vptr,vptr在執行時指向對應的虛函式,從而實現多型

7.vptr一般的編譯器會將其放在物件所佔記憶體空間的最前面的部分,vptr的作用就是指向虛函式表存放的函式

8.要解答這個問題就要清楚string類的實現,乙個string物件的資料成員包括存放該string的位址的指標,還有該string的長度兩部分,即:4+strlen(str)+1

9.乙個空類為1個位元組,可能會因為編譯器不同而有所不同,這乙個位元組是為了定位這個空類的物件,反過來思考會比較容易理解,我們假設空類物件不佔記憶體,那麼系統怎麼區分這個空類的若干個物件呢?因為普通類(非空類)的物件都佔據一定的記憶體空間,所以系統可以唯一的確定他們並呼叫他們相應的成員函式,那麼為什麼是1個位元組,而不是2個,3個或者更多呢,當然是1個位元組就可以定位空類的物件了,多的話豈不是浪費

10.當要訪問的資料成員是從虛基類繼承過來時,通過指標不能確定這個指標具體指向哪個物件,訪問只能延遲到執行期間,而通過物件訪問,在編譯期間就已經確定了該資料成員相對於該物件的偏移,所以用物件訪問效率更高,如果不存在虛基類,那麼兩種方式完全一樣

11.在乙個新物件被建立時用另乙個物件初始化該物件一定會呼叫拷貝建構函式,因為新物件的建立一定會呼叫建構函式,如果不存在新物件的建立那麼就會呼叫賦值運算子

12.建構函式是分配記憶體的行為,虛函式需要通過虛函式表虛函式指標來呼叫,在建構函式之前,這些都還沒有初始化,所以也就無從呼叫,所以建構函式不能為虛函式(物件還沒例項化,記憶體中還沒有空間,哪來的虛表?沒有虛表哪來的虛函式?)

必須知道的設計模式

設計模式 design pattern 物件導向 設計模式 引言 設計模式是物件導向思想的集大成,gof在其經典著作中總結了23種設計模式,又可分為 建立型 結構型和行為型3個大類。對於軟體設計者來說,一般的過程就是在熟練掌握語言背景的基礎上,了解類庫的大致框架和常用的函式和介面等,然後多再在百般錘...

必須知道的UML知識

如果你確定兩件物件之間是is a的關係,那麼此時你應該使用繼承 比如菱形 圓形和方形都是形狀的一種,那麼他們都應該從形狀類繼承而不是聚合。如果你確定兩件物件之間是has a的關係,那麼此時你應該使用聚合 比如電腦是由顯示器 cpu 硬碟等組成的,那麼你應該把顯示器 cpu 硬碟這些類聚合成電腦類,而...

關於 SqlParameter 必須知道的!

有時候寫 sqlparameter 對映 new sqlparameter recordid sqldbtype.bigint,0,recordid 有時候發現加不加 都可以,但是今天突然發現,如果不加 相當的能坑人!有些地方不加 是無法通過ado.net的檢查的,可能會報 指定的引數名 recor...