程式設計師面試寶典 讀書筆記

2021-05-10 21:55:01 字數 2939 閱讀 1488

程式設計師面試寶典(第十章物件導向)

1. 面向技術的基本概念

物件,類和繼承

2.c++的空類預設產生哪些類成員?

預設建構函式,析構函式,拷貝建構函式和賦值函式。

3.structure是否可以擁有constructor和destructor及成員函式?如果可以,structure和class還有什麼區別?

區別是class中變數預設是private,struct中的變數預設是public。struct可以有構造,析構函式及繼承。c++中的struct和class其實意義是一樣的,struct關鍵字的唯一意義就是為了讓c++編譯器相容以前用c開發的專案。

4.哪一種成員變數可以在同乙個類的例項之間共享?

靜態成員變數。如果想限制對靜態成員變數的訪問,則必須把它們宣告為保護型或者私有型。如果把靜態成員資料設為私有,可以通過公有靜態成員函式訪問。

5.class a

or static const int size=0;

} 常量必須在建構函式的初始化列表裡面初始化或者設定成靜態變數。

6.析構函式可以是內聯函式嗎?

可以。#inlcude

using namespace std;

class a

~a();

};inline a: ~a()

int main ()

7.mfc類庫中,cobject的析構函式是虛擬的,有必要嗎?

class cbase

;class cchild : public cbase

; main()

如果cchild類的建構函式在堆中分配了記憶體,而其析構函式又不是virtual型的,那麼撤銷pbase時就不會呼叫cchild的析構函式,從而不會釋放其佔據的記憶體空間,造成記憶體洩漏。

8.析構函式可以為virtual型,構造韓式則不能,為什麼?

虛函式採用虛呼叫的方法。虛呼叫是一種可以在只有部分資訊的情況下工作的機制,特別允許我們呼叫乙個只知道介面而不知道其準確物件型別的函式。但是要建立乙個物件,是必要知道物件的準確型別,因此建構函式不能為虛。

9.如果虛函式非常有效,我們是否可以把每個函式都宣告為虛函式?

不行,虛函式是有代價的,每個虛函式物件都需維護乙個v表,因此在使用虛函式的時候都會產生乙個系統開銷。如果僅是乙個很小的類,且不想派生其他類,那麼沒有必要使用虛函式。

10.編寫string類的建構函式,析構函式和賦值函式。

class string

析構函式:

string :: ~string(void)

建構函式:

string:: string(const char *str==null)

else

}拷貝建構函式:

string:: string(const string &other)

賦值函式:

string & string :: opertate = (const string &other)

11.多型。

虛函式就是允許被其子類重新定義的成員函式。而子類重新定義父類虛函式的做法成為override。override是指子類重新定義父類的虛函式的做法,而overload是指允許存在多個同名函式,而這些函式的參數列不同,overload在編譯期間就已確定是,是靜態的,故其和多型無關。

而override,當子類重新定義了父類的虛函式後,父類指標根據賦給它的不同子類指標,動態地呼叫屬於子類的該函式,函式位址是在執行期間繫結的。

多型是為了實現介面重用。

程式設計師面試寶典(第十一章繼承與介面)

1. 輸出結果?

#include

using namespace std;

class a

};class b : public a

};int main()

2. 派生類的3種繼承方式。

公有繼承,私有繼承,保護繼承。

public:派生類的物件可以訪問基類中的公有成員,派生類的成員可以訪問基類的公有成員和保護成員。

private:基類成員對於派生類物件的可見性,基類的所有成員都是不可見的。在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。(c++預設的是私有繼承)

protected:同上,基類的公有成員和保護成員都作為派生類的保護成員,並且不能被這個派生類的子類所訪問。

3. 虛繼承

virtual告訴編譯器它不應當完成早繫結,相反,他應當自動安裝實現晚繫結所必需的所有機制。編譯器對每個包含虛函式的類建立乙個表(稱為vtable)。在vtable中編譯器放置特定類的虛函式位址,在每個帶有虛函式的類中,編譯器秘密地放置一指標,稱為vptr,指向這個物件的vtable。

通過基類指標做虛函式呼叫時,編譯器靜態的插入取得這個vptr,並在vtable表中查詢函式位址的**,這樣就能呼叫正確的函式使晚繫結發生。

4.什麼是虛繼承?它與一般的繼承有什麼不同?

虛擬繼承是多重繼承中特有的概念,為解決多重繼承而出現的。

class a;

class b: public virtual a;

class c: public virtual a;

class d: public b,public c;

5.多重繼承的優缺點?

多重繼承本身沒有神惡魔問題,如果運用得當可以事半功倍。不過多數系統的類層次往往有乙個公共的基類(如c#中的object)。這樣的結構如果使用多重繼承,將會出現菱形繼承,會使得類的訪問結果相當複雜。

但可以使用virtual繼承和loki庫中的多繼承框架來掩蓋這些複雜性。

6.如果鳥是可以飛的,那麼鴕鳥不是鳥類嗎?鴕鳥怎麼繼承鳥類?

如果一定要鴕鳥繼承鳥類,可以採用組合的辦法,把鳥類中可以被鴕鳥繼承的函式挑選出來。

#include

#include

using namespace std;

class bird

;class ostrich

; bird sleep() ;

程式設計師面試寶典筆記

1 答案為 a note1 求值順序是自右至左 輸出順序還是從左至右.note2 如果把printf d d n ptr,ptr 換成printf d d n ptr,ptr 結果為c,雖然求值是從右向左的,但是表示式中的 ptr與 ptr 不是兩個語句,所以ptr的值相同 2 int a 與 in...

程式設計師面試寶典

微軟公司讓應聘者發狂的創意測試 如果你有乙個許多部件可以拆卸的時鐘,你將它一塊塊拆開,但是沒有記住是怎樣拆的。然後你將各個零件重新組裝起來,最後發現有三個重要零件沒有放進去。這時你如何重新組裝這個時鐘?如果你需要學習一門新的計算機語言,你會怎樣做?假設由你負責設計比爾 蓋茨的衛生間。當然,錢不成問題...

程式設計師面試寶典題目總結

1.what will be the output of the following c code?include int main int argc,char argv int ptr arr ptr 123 printf d,d n ptr,ptr return 0 2.下面程式的結果是多少?i...