當前位置:萬佳範文網 >

求職簡歷 >筆試題目 >

c面向對象的筆試題

c面向對象的筆試題

C++由於過度的複雜性,以及與unix的文化相牴觸,在unix/linux領域受到很多著名人士(比如Linux之父linus torvalds與著名黑客Eric S. Raymond)的強烈批評與抵制。下面就由本站小編為大家介紹一下 c++面向對象的筆試題的文章,歡迎閲讀。

c面向對象的筆試題

c++面向對象的筆試題篇1

1. 重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區別?

常考的題目。從定義上來説:

重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。

重寫:是指子類重新定義父類虛函數的方法。

從實現原理上來説:

重載:編譯器根據函數不同的參數表,對同名函數的名稱做修飾,然後這些同名函數就成了不同的函數(至少對於編譯器來説是這樣的)。如,有兩個同名函數:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函數名稱可能是這樣的:int_func、str_func。對於這兩個函數的調用,在編譯期間就已經確定了,是靜態的。也就是説,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態無關!

重寫:和多態真正相關。當子類重新定義了父類的虛函數後,父類指針根據賦給它的不同的子類指針,動態的調用屬於子類的該函數,這樣的函數調用在編譯期間是無法確定的(因為只是把子類的指針賦值給父類指針,在編譯期間沒法根據父類指針知道具體是什麼類型的子類,調用的子類的虛函數的地址無法給出)。因此,這樣的函數地址是在運行期綁定的(晚綁定)。

2.類成員函數的重載、覆蓋和隱藏區別

答案:

成員函數被重載的特徵:

(1)相同的範圍(在同一個類中);

(2)函數名字相同;

(3)參數不同;

(4)virtual關鍵字可有可無。

覆蓋是指派生類函數覆蓋基類函數,特徵是:

(1)不同的範圍(分別位於派生類與基類);

(2)函數名字相同;

(3)參數相同;

(4)基類函數必須有virtual關鍵字。

“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:

(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。

(2)如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)

c++面向對象的筆試題篇2

1. 多態的作用?

主要是兩個:

1.隱藏實現細節,使得代碼能夠模塊化;擴展代碼模塊,實現代碼重用;

2.接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調用。

2. Ado與的相同與不同?

除了“能夠讓應用程序處理存儲於DBMS 中的數據“這一基本相似點外,兩者沒有太多共同之處。但是Ado使用OLE DB 接口並基於微軟的COM 技術,而 擁有自己的 接口並且基於微軟的 體系架構。眾所周知 體系不同於COM 體系, 接口也就完全不同於ADO和OLE DB 接口,這也就是説和ADO是兩種數據訪問方式。 提供對XML 的支持。

3. New delete與malloc free的聯繫與區別?

答案:都是在堆(heap)上進行動態的內存操作。用malloc函數需要指定內存分配的字節數並且不能初始化對象,new 會自動調用對象的構造函數。delete 會調用對象的destructor,而free 不會調用對象的destructor.

4. #defineDOUBLE(x) x+x,i = 5*DOUBLE(5); i 是多少?

答案:i 為30。宏定義展開,5 * 5 + 5.

5. 有哪幾種情況只能用initialize list而不能用assignment?

答案:當類中含有const、reference成員變量(因為這些只能在定義的時候賦值,後面不能修改);基類的構造函數都需要初始化表。

6 C++是不是類型安全的?

答案:不是。兩個不同類型的指針之間可以強制轉換(用reinterpret cast)。C#是類型安全的。

7. main函數執行以前,還會執行什麼代碼?

答案:全局對象的構造函數會在main 函數之前執行。

8. 描述內存分配方式以及它們的區別?

1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。

2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集。

3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員自己負責在何時用free 或delete 釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但問題也最多。

ct 和 class的區別

答案:struct 的成員默認是公有的,而類的成員默認是私有的。struct 和 class 在其他方面是功能相當的。

從感情上講,大多數的開發者感到類和結構有很大的差別。感覺上結構僅僅象一堆缺乏封裝和功能的開放的內存位,而類就象活的並且可靠的社會成員,它有智能服務,有牢固的封裝屏障和一個良好定義的接口。既然大多數人都這麼認為,那麼只有在你的類有很少的方法並且有公有數據(這種事情在良好設計的系統中是存在的!)時,你也許應該使用 struct 關鍵字,否則,你應該使用 class 關鍵字。

10.當一個類A中沒有生命任何成員變量與成員函數,這時sizeof(A)的值是多少,如果不是零,請解釋一下編譯器為什麼沒有讓它為零。(Autodesk)

答案:肯定不是零。舉個反例,如果是零的話,聲明一個class A[10]對象數組,而每一個對象佔用的空間是零,這時就沒辦法區分A[0],A[1]…了。

c++面向對象的筆試題篇3

1. 在8086彙編下,邏輯地址和物理地址是怎樣轉換的?(Intel)

答案:通用寄存器給出的地址,是段內偏移地址,相應段寄存器地址*10H+通用寄存器內地址,就得到了真正要訪問的地址。

2. 比較C++中的4種類型轉換方式?

請參考:,重點是static_cast, dynamic_cast和reinterpret_cast的區別和應用。

一、C 風格(C-style)強制轉型如下:

(T) expression // cast expression to be of type T

函數風格(Function-style)強制轉型使用這樣的語法:

T(expression) // cast expression to be of type T

這兩種形式之間沒有本質上的不同,它純粹就是一個把括號放在哪的問題。我把這兩種形式稱為舊風格(old-style)的強制轉型。

二、 C++的四種強制轉型形式:

C++ 同時提供了四種新的強制轉型形式(通常稱為新風格的或 C++ 風格的強制轉型):

const_cast(expression)

dynamic_cast(expression)

reinterpret_cast(expression)

static_cast(expression)

每一種適用於特定的目的:

dynamic_cast 主要用於執行“安全的向下轉型(safe downcasting)”,也就是説,要確定一個對象是否是一個繼承體系中的一個特定類型。它是唯一不能用舊風格語法執行的強制轉型,也是唯一可能有重大運行時代價的強制轉型。

static_cast 可以被用於強制隱型轉換(例如,non-const 對象轉型為 const 對象,int 轉型為 double,等等),它還可以用於很多這樣的轉換的反向轉換(例如,void* 指針轉型為有類型指針,基類指針轉型為派生類指針),但是它不能將一個const 對象轉型為 non-const 對象(只有const_cast 能做到),它最接近於C-style的轉換。

const_cast 一般用於強制消除對象的常量性。它是唯一能做到這一點的 C++ 風格的強制轉型。

reinterpret_cast 是特意用於底層的強制轉型,導致實現依賴(implementation-dependent)(就是説,不可移植)的結果,例如,將一個指針轉型為一個整數。這樣的強制轉型在底層代碼以外應該極為罕見。

舊風格的強制轉型依然合法,但是新的形式更可取。首先,在代碼中它們更容易識別(無論是人還是像 grep 這樣的工具都是如此),這樣就簡化了在代碼中尋找類型系統被破壞的地方的過程。第二,更精確地指定每一個強制轉型的目的,使得編譯器診斷使用錯誤成為可能。例如,如果你試圖使用一個 const_cast 以外的新風格強制轉型來消除常量性,你的代碼將無法編譯。

==

== dynamic_cast . static_cast

==

classB { ... };

class D : public B { ... };

voidf(B* pb)

{

D* pd1 = dynamic_cast(pb);

D* pd2 = static_cast(pb);

}

If pb really points to an object of type D, then pd1 and pd2 will get the same will also get the same value if pb == 0.

If pb points to an object of type B and not to the complete D class, then dynamic_cast will know enough to return zero. However, static_cast relies on the programmer’s assertion that pb points to an object of type D and simply returns a pointer to that supposed D object.

即dynamic_cast可用於繼承體系中的向下轉型,即將基類指針轉換為派生類指針,比static_cast更嚴格更安全。dynamic_cast在執行效率上比static_cast要差一些,但static_cast在更寬上範圍內可以完成映射,這種不加限制的映射伴隨着不安全性ic_cast覆蓋的變換類型除類層次的靜態導航以外,還包括無映射變換,窄化變換(這種變換會導致對象切片,丟失信息),用VOID*的強制變換,隱式類型變換等...

==

== static_cast . reinterpret_cast

==

reinterpret_cast是為了映射到一個完全不同類型的意思,這個關鍵詞在我們需要把類型映射回原有類型時用到它.我們映射到的類型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險的.(這句話是C++編程思想中的原話)

static_cast 和reinterpret_cast 操作符修改了操作數類型. 它們不是互逆的; static_cast 在編譯時使用類型信息執行轉換, 在轉換執行必要的檢測(諸如指針越界計算, 類型檢查). 其操作數相對是安全的. 另一方面,reinterpret_cast 僅僅是重新解釋了給出的對象的比特模型而沒有進行二進制轉換, 例子如下:

int n=9; double d=static_cast < double > (n);

上面的例子中, 我們將一個變量從 int 轉換到 double. 這些類型的二進制表達式是不同的. 要將整數 9 轉換到 雙精度整數9, static_cast 需要正確地為雙精度整數 d 補足比特位. 其結果為 9.0. 而reinterpret_cast的行為卻不同:

int n=9;

double d=reinterpret_cast (n);

這次, 結果有所不同. 在進行計算以後, d 包含無用值. 這是因為 reinterpret_cast 僅僅是複製 n 的比特位到 d, 沒有進行必要的分析。

標籤: 面向對象 筆試
  • 文章版權屬於文章作者所有,轉載請註明 https://wjfww.com/qiuzhi/bishi/qg7w3z.html
專題