C 面試中不怎麼注意和比較怪的一些問題

2021-05-24 12:16:53 字數 898 閱讀 9285

1.為什麼建構函式不能是虛函式?

答:首先,我們要了解虛函式表vtable和虛函式指標vptr,vtable是for類的,vptr是for物件的,是在建構函式被呼叫時才初始化,物件裡虛函式的呼叫都是依賴於vptr,如果有地方呼叫建構函式,一定發生在物件生成之前,這個時候連vptr都還沒有初始化呢,哪能夠呼叫虛函式。本身就是乙個矛盾的命題。

2.虛函式是什麼?多型有什麼用?

答:這2個問題本身就是乙個問題,多型是通過虛函式來實現的。

多型到底有用在做什麼呢?這也不是一兩句話可以概述。一些教程上都是通過類圖來表示,我自己是這樣理解的:在物件導向程式設計中,針對資料進行抽象和繼承,構成一定的類層次。例如類b和類c繼承自類a類,如果我們需要類b則寫針對類b的**,需要類c則寫針對類c的**,如果我們有100個派生類,就意味要寫很多**,我們每增加乙個類,就必須通知使用者,增加了類層次和使用者之間的耦合度,這樣使得**復用性差,不夠靈活。

而多型很好的解決了這一困境,例如如下**:

class a

virtual void foo();

class b : public a

virtual void foo();

void fun(a* a)

a->foo();

在fun這個函式裡,無論我傳a或b還是c型別物件,foo方法都可以被正確的執行,產生不同的效果。這種同乙個**產生不同效果的特點,我把它叫做「多型」。這樣就不需要寫n個類的**了,只需要用基類指標指向就可以了,從而提高了**復用性。

就其根本是因為虛函式呼叫的時候,能夠在執行時動態繫結該函式(這裡不多描述動態繫結),這是由編譯器來完成的工作,相當於它幫我們完成了型別識別,這麼好的事情何樂而不為呢。

無論我從類a再繼承多少個派生類,我不需要關心它是什麼類別,我的fun函式不用修改,從而提高了**的可復用性和可擴充套件性。

c 中sort和qsort的比較

例如 int cmp const void a,const void b int a 5 qsort a,5,sizeof int cmp void sort 待排序陣列首位址,待排序陣列結束位址,排序的方法 其中,排序的方法可以不寫,這樣預設為從小到大。例如 從小到大 bool cmp const...

C 中的define使用和注意

使用 define來定義符號。將符號用作傳遞給 if 指令的表示式時,該表示式的計算結果為true,如以下示例所示 define debug define指令不能用於宣告常量值 常量定義例 public const int value 213 c 中的常量最好定義為類或結構的靜態成員。如果具有多個此...

c 中結構體和類的比較

前幾天,有位同學問我它們用起來有什麼區別,當時也不大清楚,糊弄過去了,但是,人不能自欺欺人,不能連自己的無知也要糊弄!翻了下書,總結一下。區別 結構是一種用關鍵字struct宣告的自定義資料型別。與類相似,也可以包含建構函式,常數,字段,方法,屬性,索引器,運算子和巢狀型別等,不過,結構是值型別。1...