1. 首頁
  2. 筆試

IT公司筆試面試題系列九

IT公司筆試面試題系列(九)

1.一個類有基類、內部有一個其他類的成員物件,建構函式的執行順序是怎樣的。

答:先執行基類的(如果基類當中有虛基類,要先執行虛基類的,其他基類則按照宣告派生類時的順序依次執行),再執行成員物件的,最後執行自己的。

2.在UML 中,聚合(aggregation)和組合(composition)有什麼區別

答案:聚合關係更強,類似於pages 和book 的關係;組合關係要弱,類似於books和bookshelf 的關係。

3.C#和C++除了語法上的差別以外,有什麼不同的地方?

答案:(C#我只是瞭解,不是很精通)

(1) c#有垃圾自動回收機制,程式設計師不用擔心物件的回收。(2)c#嚴禁使用指標,只能處理物件。如果希望使用指標,則僅可在unsafe 程式塊中能使用指標。(3)c#只能單繼承。(4)必須透過類名訪問靜態成員。不能像C++中那樣,透過物件訪問靜態成員。(5)在子類中覆蓋父類的虛擬函式時必須用關鍵字override,覆蓋父類的方法要用關鍵字new

4.ADO.net 和ADO 的區別?

答案:實際上除了“能夠讓應用程式處理儲存於DBMS 中的資料“這一基本相似點外,兩者沒有太多共同之處。但是ADO 使用OLE DB 介面並基於微軟的COM 技術,而ADO.NET 擁有自己的ADO.NET 介面並且基於微軟的.NET 體系架構。眾所周知.NET 體系不同於COM 體系,ADO.NET 介面也就完全不同於ADO和OLE DB 介面,這也就是說ADO.NET 和ADO是兩種資料訪問方式。ADO.net 提供對XML 的支援。

5.New 與malloc free 的區別

答案:用malloc 函式不能初始化物件,new 會呼叫物件的建構函式。Delete 會呼叫物件的destructor,而free 不會呼叫物件的destructor.

6.#define DOUBLE(x) x+x

i = 5*DOUBLE(10); i 是多少?正確的宣告是什麼?

答案:i 為60。正確的宣告是#define DOUBLE(x) (x+x)

7.有哪幾種情況只能用intialization list 而不能用assignment?

答案:當類中含有const、reference 成員變數;基類的建構函式都需要引數;類中含有其他類的成員物件,而該類的`建構函式都需要引數。

8.C++是不是型別安全的?

答案:不是。兩個不同型別的指標之間可以強制轉換。C#是型別安全的。

9.main 函式執行以前,還會執行什麼程式碼?

答案:全域性物件的建構函式會在main 函式之前執行。

10.比較一下C++中static_cast 和 dynamic_cast 的區別。

dynamic_casts在幫助你瀏覽繼承層次上是有限制的。它不能被用於缺乏虛擬函式的型別上,它被用於安全地沿著類的繼承關係向下進行型別轉換。如你想在沒有繼承關係的型別中進行轉換,你可能想到static_cast

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

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

12.類成員函式的過載、覆蓋和隱藏區別

答案:

成員函式被過載的特徵:

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

(2)函式名字相同;

(3)引數不同;

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

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

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

(2)函式名字相同;

(3)引數相同;

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

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

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

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

13.如何判斷一段程式是由C 編譯程式還是由C++編譯程式編譯的?

答案:

#ifdef __cplusplus

cout<<"c++";

#else

cout<<"c";

#endif

14.陣列a[N],存放了1至N-1個數,其中某個數重複一次。寫一個函式,找出被重複的數字.時間複雜度必須為o(N)函式原型:int do_dup(int a[],int N)

答案:方法1:如果數就是1-N-1,那麼求出a[N]的和,然後減去1-N-1就行了。(確定數字1-N)

S = N * (N-1) / 2;

int i;

int s = 0;

for(i=0;i{

s += a[i];

}

int res = s - S;

方法2.a[]中的某元素a[i]看做是pi[]陣列的下標,元素a[i]儲存到對應陣列下標pi[a[i]]的地址中

#include

#define N 10

void main()

{

int a[N]={1,2,3,4,5,6,7,7,8,9};

int pi[N]={0};

int key=0;

for(int i=0;i{ if(pi[a[i]]==0)

pi[a[i]]=a[i];

else

{ key=a[i];

break;

}

}

printf("多餘的數字是%d\n",key);

}

15.一語句實現x是否為2的若干次冪的判斷

位運算

int i = 512; cout << boolalpha << ((i & (i - 1)) ? false : true) << endl;

16.什麼是預編譯?何時需要預編譯?

1、總是使用不經常改動的大型程式碼體。

2、程式由多個模組組成,所有模組都使用一組標準的包含檔案和相同的編譯選項。在這種情況下,可以將所有包含檔案預編譯為一個預編譯頭。