一道關於例項化順序的C 面試題

2021-05-28 02:23:08 字數 1685 閱讀 6570

最近找工作,面試了幾家公司,其中有一家公司的面試題給我印象很深,不久前在看過類似的題目,但這次的更複雜,題目如下:

public class basea 

public basea()

public virtual void myfun()

}public class baseb : basea

public baseb()

public new void myfun()

}static class program

}public class mytest

}

最後的問題是:請寫出main()方法中,a1-a5,b1-b5這十個類例項化的順序。(mytest類是我自己添的,方便檢視結果,原題是是例項化乙個object類。)

不知道園子裡有多少人能胸有成竹的寫出正確答案,反正我是答錯了,正確答案是:

b1    

b3    

b2    

a1    

a3    

a2    

a4    

b4    

b5

雖然題目沒做對了,但要知道自己為什麼會做錯,這樣才會有所提高,趁著端午的假期,我把這個面試題涉及到的知識點都梳理了一遍,要點如下:

內聯(inline)方式初始化字段。

型別構造器(靜態建構函式)的執行時間。

c#中基類和子類例項化的順序。

new修飾符的作用。

這個知識點在《clr via c#》書中有講到,所謂內聯方式,就是初始化欄位的一種簡化語法。來看示例**:

public class 

sometype

這種在類中宣告變數時進行賦值的方式就叫做內聯,大致等效於下面的**:

public class 

sometype

}

之所以說大致等效,因為兩者的執行順序上略有差異,編譯器會首先生成內聯方式的**,然後再呼叫建構函式。

比如,下面的**,最後m_x的結果就為10。

public class 

sometype

}

所謂型別構造器也就是我們熟知的靜態構造方法,在我們編寫的類中,都會有乙個預設的靜態無參構造方法,跟無參例項構造方法一樣是預設存在的。

每當我們對乙個類建立第乙個例項或訪問靜態欄位前,jit編譯器就會呼叫該類的靜態構造方法。當然,靜態變數也可以使用上面說的內聯方法進行賦值。

這裡可以看出,當第一次例項化某個類時,會首先呼叫該類的靜態構造方法。

這個知識點比較簡單,那就是在呼叫子類例項構造方法之前會呼叫基類的例項構造方法。從面試題的結果可以看出,基類的構造方法又比子類的靜態建構函式晚一些,此處因個人能力有限,我也沒辦法從更底層的角度去分析原理,只能暫且記住吧。

我看過不少關於new以修飾符的形式用在方法宣告中的題目,關於new的用法在msdn上也都查的到,官方說法是顯式隱藏從基類繼承的成員。

我個人的理解比較簡單:當子類中,乙個方法的簽名(指引數,方法名,返回值)與基類的乙個方法相同,通過加入new修飾符,可以讓子類不做更改的去使用該方法。

說到底,new修飾符就是讓兩個不相關的同名方法同時存在而已。(這裡同名指相同的方法簽名)

回頭想想,其實在我日常的專案開發中,多多少少都有涉及到這幾個問題,只是平時不注意,沒有深究吃透,寫此文也是勉勵自己以後要重視基礎,不再浮躁。

一道c 面試題

float a 1.0f cout int a endl cout int a endl int a 是什麼意思?cout boolalpha int a int a endl float b 0.0f cout int b endl cout int b endl cout boolalpha i...

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...