當前位置:學識中文吧 > 簡歷 > 求職簡歷 > 筆試題目 > c物件導向的筆試題
手機版

c物件導向的筆試題

來源:學識中文吧 閱讀:3.08W 次

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://www.xszwb.com/zh-tw/qzjlfanwen/bishi/5mweg2.html

Copyright © 2024. 學識中文吧 All right reserved.

文字美圖素材,版權屬於原作者。部分文章內容由網友提供推送時因種種原因未能與原作者聯絡上,若涉及版權問題,敬請原作者聯絡我們,立即處理。