?? c++面試題-4.txt
字號:
1、 標準建模語言UML的重要內容可以由哪五類圖(共9種圖形)來定義,并簡要說明這些圖所描述的對象。
標準建模語言UML的重要內容可以由下列五類圖(共9種圖形)來定義:
·第一類是用例圖,從用戶角度描述系統功能,并指出各功能的操作者。
·第二類是靜態圖(Static diagram),包括類圖、對象圖和包圖。其中類圖描述系統中類的靜態結構。不僅定義系統中的類,表示類之間的聯系如關聯、依賴、聚合等,也包括類的內部結構(類的屬性和操作)。類圖描述的是一種靜態關系,在系統的整個生命周期都是有效的。對象圖是類圖的實例,幾乎使用與類圖完全相同的標識。他們的不同點在于對象圖顯示類的多個對象實例,而不是實際的類。一個對象圖是類圖的一個實例。由于對象存在生命周期,因此對象圖只能在系統某一時間段存在。包由包或類組成,表示包與包之間的關系。包圖用于描述系統的分層結構。
·第三類是行為圖(Behavior diagram),描述系統的動態模型和組成對象間的交互關系。其中狀態圖描述類的對象所有可能的狀態以及事件發生時狀態的轉移條件。通常,狀態圖是對類圖的補充。在實用上并不需要為所有的類畫狀態圖,僅為那些有多個狀態其行為受外界環境的影響并且發生改變的類畫狀態圖。而活動圖描述滿足用例要求所要進行的活動以及活動間的約束關系,有利于識別并行活動。
·第四類是交互圖(Interactive diagram),描述對象間的交互關系。其中順序圖顯示對象之間的動態合作關系,它強調對象之間消息發送的順序,同時顯示對象之間的交互;合作圖描述對象間的協作關系,合作圖跟順序圖相似,顯示對象間的動態合作關系。除顯示信息交換外,合作圖還顯示對象以及它們之間的關系。如果強調時間和順序,則使用順序圖;如果強調上下級關系,則選擇合作圖。這兩種圖合稱為交互圖。
·第五類是實現圖( Implementation diagram )。其中構件圖描述代碼部件的物理結構及各部件之間的依賴關系。一個部件可能是一個資源代碼部件、一個二進制部件或一個可執行部件。它包含邏輯類或實現類的有關信息。部件圖有助于分析和理解部件之間的相互影響程度。
2、 什么是虛擬函式、虛擬繼承?
3、 你在使用面向對象程序設計語言(例如C++, smalltalk等)和可重用的對象類庫上有何經驗?實際效果如何?有什么優缺點?
4、 引用和指針之間有什么區別?
引用是一個別名,而指針是一個保存地址的變量。引用不能為空也不能賦值。
5、 什么是函數重載?
函數重載是指用同一個函數名寫多個函數的能力,這些函數根據參數的數目、類型加以區別。
6、 C++與其它傳統編程語言相比有何特點?
7、 簡要說明如何繪制UML活動圖。
UML 活動圖記錄了單個操作或方法的邏輯,單個用戶案例,或者單個業務流程的邏輯。要創建一個 UML 活動圖,您需要反復執行下列步驟。
第一步,定義活動圖的范圍首先應該定義您要對什么建模。單個用戶案例力?一個用戶案例的一部分?一個包含多個用戶案例的商務流程?一個類的單個方法?一旦您定義了您所作圖的范圍,您應該在其頂部,用一個標注添加標簽,指明該圖的標題和唯一的標示符。您有可能也想要包括該圖的時間甚至作者名。
第二步,添加起始和結束點每個活動圖有一個起始點和結束點,因此您也要馬上添加它們。在 《UML 精粹》(UML Distilled) (參見參考資料),Fowler 和 Scott 認為結束點是可選的。有時候一個活動只是一個簡單的結束,如果是這種情況,指明其唯一的轉變是到一個結束點也是無害的。這樣,當其他人閱讀您的圖時,他或她知道您已經考慮了如何退出這些活動。
第三步,添加活動如果您正對一個用戶案例建模,對每個角色(actor)所發出的主要步驟引入一個活動(該活動可能包括起始步驟,加上對起始步驟系統響應的任何步驟)。如果您正對一個高層的商務流程建模,對每個主要流程引入一個活動,通常為一個用戶案例或用戶案例包。最后,如果您正對一個方法建模,那么對此引入一個活動是很常見的。
第四步,添加活動間的轉變我的風格總是應該退出一個活動,即使它是轉變到一個結束點。一旦一個活動有多個轉變時,您必需對每個轉變加以相應標示。
第五步,添加決策點有時候,您所建模的邏輯需要做出一個決策。有可能是需要檢查某些事務或比較某些事務。要注意的是,使用決策點是可選的。例如,在圖 1 中,我可以只是簡單地將"接受"和"拒絕"兩個轉變直接接到"在大學報名(Enroll in University)"活動。
第六步,找出可并行活動之處當兩個活動間沒有直接的聯系,而且它們都必需在第三個活動開始前結束,那它們是可以并行運行的。在圖 1 中,您看到是有可能"參加簡要介紹(attend overview)"和"報名研討班(enroll in seminars)"可以按任意次序進行,但是它們都得在您結束整個流程前完成。
8、 為什么有些類成員函數在類聲明中定義而有一些則不是呢?
在聲明中定義成員函數的實現是按內嵌方式進行的。一般來講,只有當函數特別簡單才這么做。注意,即使函數是在類聲明之外聲明的,你也可以用關鍵字inline使成員函數變成內嵌的。
9、 面向對象分析和設計的階段有哪些?
概念化、分析、設計、實現、測試、發行(謹供參考)
10、 為什么要費力地生成抽象數據類型――為什么不把它設為非抽象的數據類型和避免創建這種類型的對象呢?
C++中很多約定的目的是為了便于使編譯器找到錯誤,以避免你向用戶提供的代碼中產生運行時錯誤。把一個類抽象化――即給它提供純虛函數――會使編譯器把從這種抽象類型創建的任何對象標記為錯誤。
11、 什么是多態性?多態性是如何實現的?
函數多態性是指用多個含義重載一個函數的能力,即允許創建多個名稱相同的函數。
可通過改變同名函數變元的類型或個數來實現。
12、 查錯:下面這段代碼有什么錯誤?
class Shape()
{
public:
Shape();
virtual ~Shape();
virtual Shape(const Shape&);
}
不能聲明一個副本構造函數為虛擬。
13、查錯:下面的代碼有什么錯?
int main()
{
int SomeVariable = 5;
count <<"SomeVariable:"<<SomeVariable<<"\n;"
int * pVar = &SomeVariable;
pVar = 9;
count <<"SomeVariable:"<<*pVar<<"\n";
return 0;
}
程序編寫者的意圖是將9賦值給pVar所指的變量,不幸的是9卻賦成了pVar的值,因為遺漏了間接訪問運算符(*),如果用pVar來賦值的話導致災難性錯誤。
14、查錯:下面的程序有什么錯誤?并修改。
# include <iostream.h>
int * FuncOne();
int main()
{
int * pint = FuncOne();
cout <<"the value of pInt back in main is:"<< * pint << endl
return 0;
}
int * FuncOne()
{
int * pint = new int(5);
count <<"the value of pInt in FuncOne is:"<<* pint<<endl;
return pint;
}
內存泄漏。
修改:
# include <iostream.h>
int FuncOne();
int main()
{
int theint = FuncOne();
cout <<"the value of pInt back in main is:"<<theint << endl;
return 0;
}
int FuncOne()
{
int * pint = new int(5);
cout <<"the value of pInt in FuncOne is:"<<* pint<<endl;
int temp = *pint;
delete pint;
return temp;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -