第一篇:面向對象程序設計教程 答案
面向對象程序設計教程(C++語言描述)題解與課程設計指導
第1章
面向對象程序設計概論
一、名詞解釋 抽象封裝消息 【問題解答】
面向對象方法中的抽象是指對具體問題(對象)進行概括,抽出一類對象的公共性質并加以描述的過程。
面向對象方法中的封裝就是把抽象出來的對象的屬性和行為結合成一個獨立的單位,并盡可能隱蔽對象的內部細節。
消息是面向對象程序設計用來描述對象之間通信的機制。一個消息就是一個對象要求另一個對象實施某種操作的一個請求。
二、填空題(1)目前有面向過程的結構化程序設計方法和面向對象的程序設計方法兩種重要的程序設計方法。
(2)結構化程序設計方法中的模塊由順序、選擇和循環3種基本結構組成。(3)在結構化程序設計方法中,程序可表示為程序=數據結構+算法; 而面向對象的程序設計方法,程序可表示為程序=對象+消息。(4)結構化程序設計方法中的基本模塊是過程; 而面向對象程序設計方法中的基本模塊是類。
(5)面向對象程序設計方法具有抽象性、封裝性、繼承性和多態性等特點。
三、選擇題(至少選一個,可以多選)
(1)面向對象程序設計著重于(B)的設計。A.對象B.類C.算法D.數據(2)面向對象程序設計中,把對象的屬性和行為組織在同一個模塊內的機制叫做(C)。
A.抽象 B.繼承 C.封裝 D.多態
(3)在面向對象程序設計中,類通過(D)與外界發生關系。A.對象 B.類 C.消息 D.接口
(4)面向對象程序設計中,對象與對象之間的通信機制是(C)。A.對象 B.類 C.消息 D.接口
(5)關于C++與C語言的關系的描述中,(D)是錯誤的。A.C語言是C++的一個子集 B.C語言與C++是兼容的
C.C++對C語言進行了一些改進 D.C++和C語言都是面向對象的
【結果分析】
C語言是面向過程的。C++語言是一種經過改進的更為優化的C語言,是一種混合型語言,既面向過程也面向對象。
(6)面向對象的程序設計將數據結構與(A)放在一起,作為一個相互依存、不可分割的整體來處理。A.算法 B.信息 C.數據隱藏 D.數據抽象(7)下面(A)不是面向對象系統所包含的要素。
A.重載 B.對象 C.類 D.繼承 【結果分析】
面向對象=對象+類+繼承+消息+多態(8)下面說法正確的是(BC)。
A.將數據結構和算法置于同一個函數內,即為數據封裝 B.一個類通過繼承可以獲得另一個類的特性
C.面向對象要求程序員集中于事物的本質特征,用抽象的觀點看待程序 D.同一消息為不同的對象接受時,產生的行為是一樣的,這稱為一致性 【結果分析】
面向對象程序設計方法具有抽象性、封裝性、繼承性和多態性等特點。將數據結構和算法置于同一個類內,即為數據封裝。同一消息為不同的對象接受時,產生的行為可能是不一樣的,這稱為多態性。(9)下面說法正確的是(AD)。
A.對象是計算機內存中的一塊區域,它可以存放代碼和數據 B.對象實際是功能相對獨立的一段程序
C.各個對象間的數據可以共享是對象的一大優點
D.在面向對象的程序中,對象之間只能通過消息相互通信 【結果分析】
對象是計算機內存中的一塊區域。在對象中,不但存有數據,而且存有代碼,使得每個對象在功能上相互之間保持相對獨立。對象之間存在各種聯系,但它們之間只能通過消息進行通信。
四、判斷題
(1)在高級程序設計語言中,一般用類來實現對象,類是具有相同屬性和行為的一組對象的集合,它是創建對象的模板。(√)
(2)C++語言只支持面向對象技術的抽象性、封裝性、繼承性等特性,而不支持多態性。(×)【結果分析】
C++語言不僅支持面向對象技術的抽象性、封裝性、繼承性等特性,而且支持多態性。
(3)面向對象程序設計中的消息應該包含“如何做”的信息。(×)【結果分析】
消息是面向對象程序設計用來描述對象之間通信的機制。向對象“發送消息”只需告訴對象做什么,對象根據這個消息決定如何做。(4)一個消息只能產生特定的響應效果。(×)【結果分析】
當一個對象發出消息時,由于接收對象的類型可能不同,所以,它們可能做出不同的反應。這樣,一個消息可以產生不同的響應效果,這種現象叫做多態。(5)類的設計和類的繼承機制實現了軟件模塊的可重用性。(√)(6)C++語言和Java語言均不是一個純正的面向對象的程序設計的語言。(×)【結果分析】
Java語言是一個純正的面向對象的程序設計語言。(7)學習C++語言是學習面向對象的程序設計方法的唯一途徑。(×)【結果分析】
程序設計方法是獨立于具體程序設計語言的一種技術,學習C++語言是學習面向對象程序設計方法的重要途徑之一。
(8)在C++語言中,類是支持數據封裝的工具。(√)
五、簡答題
(1)什么是結構化程序設計方法?它有哪些優點和缺點? 【問題解答】
結構化程序設計方法著眼于系統要實現的功能,從系統的輸入輸出出發,分析系統要做哪些事情,進而考慮如何做這些事情,自頂向下地對系統的功能進行分解,來建立系統的功能結構和相應的程序模塊結構,有效地將一個較復雜的程序系統設計任務分解成許多易于控制和處理的子任務,便于開發和維護。隨著程序規模與復雜性的增長,這種面向過程的結構化程序設計方法存在明顯的不足之處。首先是數據安全性問題。由于數據被每個模塊所共用,因此是不安全的,一旦出錯,很難查明原因。其次是可維護性及可重用性差。它把數據結構和算法分離為相互獨立的實體,一旦數據結構需要改變時,常常要涉及整個程序,修改工作量極大并容易產生新的錯誤。每一種相對于老問題的新方法都要帶來額外的開銷。另外,圖形用戶界面的應用程序,很難用過程來描述和實現,開發和維護也都很困難。
(2)什么是面向對象程序設計方法?它有哪些優點? 【問題解答】
面向對象的程序設計方法中,將程序設計為一組相互協作的對象而不是一組相互協作的函數。在程序中,屬性用數據表示,用來描述對象靜態特征; 行為用程序代碼實現,用來描述對象動態特征。可見,在面向對象的程序設計方法中,對象是數據結構和算法的封裝體。對象之間存在各種聯系,它們之間通過消息進行通信。程序可表示為:
程序=對象+消息
在面向對象程序設計中應著重于類的設計。類正是面向對象語言的基本程序模塊,通過類的設計來完成實體的建模任務。類通過一個簡單的外部接口與外界發生關系。一個類中的操作不會處理到另一個類中的數據,這樣程序模塊的獨立性、數據的安全性就有了良好的保障。程序的執行取決于事件發生的順序,由順序產生的消息來驅動程序的執行。不必預先確定消息產生的順序,更符合客觀世界的實際。并且面向對象程序設計方法提供了軟件重用、解決大問題和復雜問題的有效途徑,具有抽象性、封裝性、繼承性和多態性等特點。
(3)結構化程序設計方法與面向對象程序設計方法在對待數據結構和算法關系上有 什么不同? 【問題解答】
結構化程序設計方法中,把數據結構和算法分離為相互獨立的實體; 而在面向對象程序設計中,數據結構和算法封裝在一起,結合成一個獨立的單位,即對象,并盡可能隱蔽對象的內部細節。對象的私有屬性只能由這個對象的行為來讀取和修改,與外部的聯系通過公有行為充當外部接口。第 2 章
從C到C++
面向對象程序設計教程(C++語言描述)題解與課程設計指導
第2章 從C到 C++
一、名詞解釋
引用內聯函數重載函數 【問題解答】
所謂引用就是給對象取一個別名,使用該別名可以存取該對象。換句話說是使新對象和原對象共用一個地址。
內聯函數是使用inline關鍵字聲明的函數。
重載函數指在同一個作用域內名字相同而參數不同的函數。重載函數通常用來對具有相似行為而數據類型或數據個數不同的操作提供—個通用的名稱。
二、填空題
(1)一般情況下,用C++語言編寫的程序是由函數加上類組成的。(2)C++有兩種注釋符號,一種是//,另一種是 /*??*/。
(3)使用C++風格的輸入輸出,在程序中必須包含頭文件“iostream”。(4)cin是預定義的標準輸入流對象,>>是輸入操作符,也稱提取運算符。(5)cout是預定義的標準輸出流對象,<<是輸出操作符,也稱插入運算符。(6)指針的值是它所指向那個對象的地址值。指針的類型是它所指向對象的類型。指針的內容便是它所指向對象的值。
(7)C++使用運算符&來定義一個引用,對引用的存取都是對它所引用的對象的存取。(8)當一個函數調用出現在函數定義之前時,必須先用函數原型對函數進行聲明。
(9)C++有值傳遞和引用傳遞兩種參數傳遞機制。(10)使用關鍵字inline聲明的函數稱為內聯函數。(11)運算符new用于進行動態內存分配,運算符delete用于釋放動態分配的內存。
(12)下面程序的輸出結果為x=10,y=10;
x=100,y=100。
#include
using namespace std;
int main()
{
int x=10,&y=x;
cout<<“x=”< int *p=&y; *p=100; cout<<“x=”< return 0; } 三、選擇題(至少選一個,可以多選) (1)在整型指針變量p2、p3的定義中,錯誤的是(A)。A.int p1,*p2,p3;B.int*p2,p1,*p3;C.int p1,*p2=&p1,*p3;D.int*p2,p1,*p3=&p1;【結果分析】 指針定義的具體格式如下所示: <類型> *<指針名1>,*<指針名2>,?; (2)若有定義“double xx=3.14,*pp=&xx; ”,則*pp等價于(A.&xxB.*xxC.3.14D.xx 【結果分析】 pp指向xx所在的內存單元,這樣*pp和xx等價。(3)下面對引用的描述中(C)是錯誤的。A.引用是某個變量或對象的別名 B.建立引用時,要對它初始化)。C C.對引用初始化可以使用任意類型的變量 D.引用與其代表的對象具有相同的地址 【結果分析】 所謂引用就是給對象取一個別名,使用該別名可以存取該對象,所以對引用初始化必須使用同類型的變量。 (4)函數沒有返回值的時候,應該選擇(A)的函數類型。A.void B.int C.不確定 D.float(5)在函數的定義格式中,下面各組成部分中,(D)是可以省略的。A.函數名 B.函數體 C.返回值類型 D.函數參數 【結果分析】 函數的定義可以缺省形式參數,此時稱為無參函數。 (6)對重載的函數來說,下面敘述不正確的是(D)。A.參數的類型不同 B.參數的順序不同 C.參數的個數不同 D.參數的個數、類型、順序都相同,但函數的返回值類型不同 【結果分析】 對重載的函數來說,編譯系統將根據函數參數的類型和個數來判斷使用哪一個函數,所以重載函數參數的個數、類型、順序不能都相同。 (7)下列有關設置函數參數默認值的描述中,(D)是正確的。A.對設置函數參數默認值的順序沒有任何規定 B.函數具有一個參數時不能設置默認值 C.默認參數要設置在函數的原型中,而不能設置在函數的定義語句中 D.設置默認參數可使用表達式,但表達式中不可用局部變量 【結果分析】 在C++中,在函數原型中可以為一個或多個參數指定默認值。對函數參數設置默認值要注意以下幾點。◆若沒有聲明函數原型,參數的默認值可在函數定義的頭部進行設置,否則必須在函數原型中進行設置。 ◆在一個指定了默認值的參數右邊不能出現沒有指定默認值的參數。◆設置默認參數可使用表達式,但表達式中不可用局部變量。(8)下面說法正確的是(BC)。A.所有的函數都可以說明為內聯函數 B.具有循環語句、switch語句的函數不能說明為內聯函數 C.使用內聯函數,可以加快程序執行的速度,但會增加程序代碼的大小 D.使用內聯函數,可以減小程序代碼大小,但使程序執行的速度減慢 【結果分析】 內聯函數主要是解決程序的運行效率問題。在程序編譯時,編譯系統將程序中出現內聯函數調用的地方用函數體進行替換,進而減少了程序運行的時間,但會增加程序代碼的大小。它是以空間換取時間,因此內聯函數適用于功能不太復雜,但要求被頻繁調用的函數。 (9)一個函數功能不太復雜,但要求被頻繁調用,應選用(A)。A.內聯函數 B.重載函數 C.遞歸函數 D.嵌套函數(10)C++對C語言做了很多改進,下列描述中使得C語言發生了質變,即從面向過程變成面向對象的是(D)。A.增加了一些新的運算符 B.允許函數重載,并允許設置默認參數 C.規定函數說明必須用原型 D.引進了類和對象的概念 【結果分析】 面向對象=對象+類+繼承+消息+多態 四、判斷題 (1)C++程序中,不得使用沒有定義或說明的變量。(√)(2)使用const說明常量時,可以不必指出類型。(×)【結果分析】 如果用const 定義的是一個整型常量,則類型說明符int可以省略。(3)引用被創建時可以用任意變量進行初始化。(×)【結果分析】 對引用初始化必須使用同類型的變量。 (4)一個返回引用的調用函數可以作為左值。(√)(5)函數可以沒有參數,也可以沒有返回值。(√)(6)沒有參數的兩個函數是不能重載的。(√)(7)函數可設置默認參數,但不允許將一個函數的所有參數都設置為默認參數。(×) 【結果分析】 函數可設置默認參數,且允許將一個函數的所有參數都設置為默認參數。(8)運算符new分配的空間由運算符delete釋放。(√) 五、簡答題 (1)名字空間的用途是什么? 【問題解答】 名字空間用來防止命名的沖突。(2)引用有何用處? 【問題解答】 除了獨立引用外,在C++程序中,引用的主要用途是用作函數參數和函數的返回值。 (3)比較值調用和引用調用的相同點與不同點。【問題解答】 在值調用機制中,作為實參的表達式的值被復制到由對應的形參名所標識的一個對象中,作為形參的初始值。函數體對形參的訪問、修改都是在這個標識對象上操作的,與實參無關,即數據的傳遞是單向的。 使用引用作函數的形參時,調用函數的實參要用變量名。實參傳遞給形參,相當于在被調用函數中使用了實參的別名。于是,在被調用函數中對形參的操作實質是對實參的直接操作,即數據的傳遞是雙向的。(4)內聯函數有什么作用?它有哪些特點? 【問題解答】 內聯函數是使用inline關鍵字聲明的函數。在程序編譯時,編譯系統將程序中出現內聯函數調用的地方用函數體進行替換,進而減少了程序運行的時間。使用內聯函數應注意以下幾點。◆遞歸函數不能定義為內聯函數。 ◆內聯函數一般適合于不含有switch和while等復雜的結構且只有1~5條語句的小函數,否則編譯系統將該函數視為普通函數。 ◆內聯函數只能先定義后使用,否則編譯系統也將該函數視為普通函數。◆對內聯函數也不能進行異常接口聲明。(5)函數原型中的參數名與函數定義中的參數名以及函數調用中的參數名必須一致嗎? 【問題解答】 不必一致。所有的參數是根據位置和類型而不是名字來區分的。(6)重載函數時通過什么來區分? 【問題解答】 編譯系統將根據函數參數的類型和個數來判斷使用哪一個函數。 六、程序分析題(寫出程序的輸出結果,并分析結果) #include using namespace std; int main() { int num=50; int& ref=num; ref=ref+10; cout<<“num=”< num=num+40; cout<<“ref=”< return 0;} 【輸出結果】 num=60 ref=100 【問題分析】 本題主要考查引用的含義。【結果分析】 程序首先定義一個int類型的對象num,并給它賦初始值50。然后又定義了一個int類型的引用ref,并將它和num相聯系。這樣,無論是對num還是對ref進行操作,實際上都是對那個一開始放著50的物理單元的內容進行操作。 七、程序設計題 寫出一個完整的C++程序,使用系統函數pow(x,y)計算xy的值,注意包含頭文件cmath。【問題分析】 本題主要考查簡單的輸入輸出和標準庫函數的調用方法。【解題思路】 ① 由于要用到系統函數pow(x,y),所以要包含頭文件cmath。 ② 要計算xy的值,首先必須知道x和y的值。為了程序的通用性,最好通過交互的方式輸入x和y的值。【參考程序】 // xt2_1.cpp #include #include using namespace std; int main() { float x,y; cout<<“please input 2 floats to x,y:”; cin>>x>>y; float z=pow(x,y); cout<<“pow(”< return 0;} 【輸出結果】 please input 2 floats to x,y:3.1 2 pow(3.1,2)=9.61 第 3 章 類與對象 面向對象程序設計教程(C++語言描述)題解與課程設計指導 第3章 類 與 對 象 一、填空題(1)類定義中關鍵字private、public和protected以后的成員的訪問權限分別是私有、公有和保護。如果沒有使用關鍵字,則所有成員默認定義為private權限。具有public訪問權限的數據成員才能被不屬于該類的函數所直接訪問。(2)定義成員函數時,運算符“∷”是作用域運算符,“MyClass∷”用于表明其后的成員函數是在“MyClass類”中說明的。 (3)在程序運行時,通過為對象分配內存來創建對象。在創建對象時,使用類作為樣板,故稱對象為類的實例。 (4)假定Dc是一個類,則執行“Dc a[10],b(2)”語句時,系統自動調用該類構造函數的次數為11。【結果分析】 創建10個數組元素需調用構造函數10次,創建對象b需調用構造函數1次,所以系統自動調用該類構造函數的總次數為11。 (5)對于任意一個類,析構函數的個數最多為1個。 (6)delete運算符通常用于實現釋放該類對象中指針成員所指向的動態存儲空間的任務。(7)C++程序的內存格局通常分為4個區: 數據區、代碼區、棧區和堆區。(8)數據定義為全局變量,破壞了數據的 封裝性; 較好的解決辦法是將所要共享的數據定義為類的 靜態成員。 (9)靜態數據成員和靜態成員函數可由 任意訪問權限許可的函數訪問。(10)友元函數和 友元類統稱為友元。(11)友元的正確使用能提高程序的效率,但破壞了類的封裝性和數據的隱蔽性。(12)若需要把一個類A定義為一個類B的友元類,則應在類B的定義中加入一條語句: friend class A。 二、選擇題(至少選一個,可以多選)(1)以下不屬于類訪問權限的是(B)。A.public B.staticC.protectedD.private 【結果分析】 類的訪問權限有public、protected 和private。(2)有關類的說法不正確的是(BC)。A.類是一種用戶自定義的數據類型 B.只有類的成員函數才能訪問類的私有數據成員 C.在類中,如不做權限說明,所有的數據成員都是公有的 D.在類中,如不做權限說明,所有的數據成員都是私有的 【結果分析】 類是一種用戶自定義的數據類型,類中成員均具有一種訪問權限。關鍵字public、protected 和private以后的成員的訪問權限分別是公有、保護和私有的,所有成員默認定義為private的。 私有成員是被隱藏的數據,只有該類的成員函數或友元函數才可以訪問它。(3)在類定義的外部,可以被任意函數訪問的成員有(C)。A.所有類成員 B.private或protected的類成員 C.public的類成員 D.public或private的類成員 【結果分析】 類是一種用戶自定義的數據類型,類中成員均具有一種訪問權限。公有成員定義了類的外部接口。私有成員是被隱藏的數據,只有該類的成員函數或友元函數才可以引用它。保護成員具有公有成員和私有成員的雙重性質,可以被該類或派生類的成員函數或友元函數引用。可見在類定義的外部,可以被任意函數訪問的成員是public的類成員。 (4)關于類和對象的說法(C)是錯誤的。A.對象是類的一個實例 B.任何一個對象只能屬于一個具體的類 C.一個類只能有一個對象 D.類與對象的關系和數據類型與變量的關系相似 【結果分析】 C++語言的類就是一種用戶自己定義的數據類型,類和對象的關系就相當于基本數據類型與它的變量的關系,所以任何一個對象只能屬于一個具體的類,但一個類可以有多個對象。(5)設MClass是一個類,dd是它的一個對象,pp是指向dd的指針,cc是dd的引用,則對成員的訪問,對象dd可以通過(B)進行,指針pp可以通過(D)進行,引用cc可以通過(B)進行。 A.∷ B..C.& D.->(6)關于成員函數的說法中不正確的是(C)。A.成員函數可以無返回值 B.成員函數可以重載 C.成員函數一定是內聯函數 D.成員函數可以設定參數的默認值 【結果分析】 與普通函數不同的是,成員函數是屬于某個類的。成員函數的實現,可以放在類體內,也可以放在類體外。在類體外實現的成員函數不再是內聯函數。(7)下面對構造函數的不正確描述是(B)。A.系統可以提供默認的構造函數 B.構造函數可以有參數,所以也可以有返回值 C.構造函數可以重載 D.構造函數可以設置默認參數 【結果分析】 構造函數不能指定返回類型,即使是void類型也不可以,當然不可能有返回值。(8)假定A是一個類,那么執行語句“A a,b(3),*p; ”調用了(B)次構造函數。 A.1 B.2 C.3 D.4 【結果分析】 聲明指針是不會調用構造函數的。 (9)下面對析構函數的正確描述是(AC)。A.系統可以提供默認的析構函數 B.析構函數必須由用戶定義 C.析構函數沒有參數 D.析構函數可以設置默認參數 【結果分析】 析構函數的作用是在對象消失時執行一項清理任務。如果一個類中沒有定義析構函數,系統將自動生成一個默認析構函數。析構函數沒有參數,當然不可能設置默認參數。 (10)類的析構函數是(D)時被調用的。 A.類創建 B.創建對象 C.引用對象 D.釋放對象 (11)創建一個類的對象時,系統自動調用(B); 撤銷對象時,系統自動調用(C)。 A.成員函數 B.構造函數 C.析構函數 D.復制構造函數(12)通常拷貝構造函數的參數是(C)。 A.某個對象名 B.某個對象的成員名 C.某個對象的引用名 D.某個對象的指針名(13)關于this指針的說法正確的是(B)。 A.this指針必須顯式說明B.當創建一個對象后,this指針就指向該對象 C.成員函數擁有this指針D.靜態成員函數擁有this指針。【結果分析】 this指針是由C++編譯器自動產生且較常用的一個隱含對象指針,它不能被顯式聲明。當創建一個對象時,this指針就初始化指向該對象。但只有非靜態成員函數才擁有this指針,并通過該指針來處理對象。(14)下列關于子對象的描述中,(B)是錯誤的。A.子對象是類的一種數據成員,它是另一個類的對象 B.子對象可以是自身類的對象 C.對子對象的初始化要包含在該類的構造函數中 D.一個類中能含有多個子對象作其成員 【結果分析】 子對象不可以是自身類的對象。 (15)對new運算符的下列描述中,(B)是錯誤的。A.它可以動態創建對象和對象數組 B.用它創建對象數組時必須指定初始值 C.用它創建對象時要調用構造函數 D.用它創建的對象數組可以使用運算符delete來一次釋放 【結果分析】 使用運算符new創建對象數組的格式如下: new <類型說明符> [<算術表達式>] 其中,<算術表達式>給出數組的大小,后面不能再跟構造函數參數,所以用它創建對象數組時不能指定初始值。 (16)對delete運算符的下列描述中,(D)是錯誤的。A.用它可以釋放用new運算符創建的對象和對象數組 B.用它釋放一個對象時,它作用于一個new所返回的指針 C.用它釋放一個對象數組時,它作用的指針名前須加下標運算符[ ] D.用它可一次釋放用new運算符創建的多個對象 【結果分析】 用delete一次只能釋放用new創建的1個對象,但可釋放一個對象數組。(17)關于靜態數據成員,下面敘述不正確的是(C)。A.使用靜態數據成員,實際上是為了消除全局變量 B.可以使用“對象名.靜態成員”或者“類名∷靜態成員”來訪問靜態數據成員 C.靜態數據成員只能在靜態成員函數中引用 D.所有對象的靜態數據成員占用同一內存單元 【結果分析】 靜態數據成員可以在靜態成員函數中引用,也可以在非靜態成員函數中引用。(18)對靜態數據成員的不正確描述是(CD)。A.靜態成員不屬于對象,是類的共享成員 B.靜態數據成員要在類外定義和初始化 C.調用靜態成員函數時要通過類或對象激活,所以靜態成員函數擁有this指針 D.只有靜態成員函數可以操作靜態數據成員 【結果分析】 this指針是一個局部量,局部于某個對象,而靜態成員函數是屬于整個類而不是某個對象,它沒有this指針。靜態成員函數和非靜態成員函數均可操作靜態數據成員。 (19)下面的選項中,靜態成員函數不能直接訪問的是(D)。A.靜態數據成員 B.靜態成員函數 C.類以外的函數和數據 D.非靜態數據成員 【結果分析】 由于靜態成員函數沒有this指針,它只能直接訪問該類的靜態數據成員、靜態成員函數和類以外的函數和數據,訪問類中的非靜態數據成員必須通過參數傳遞方式得到對象名,然后通過對象名來訪問。 (20)在類的定義中,引入友元的原因是(A)。 A.提高效率 B.深化使用類的封裝性 C.提高程序的可讀性 D.提高數據的隱蔽性 【結果分析】 友元的作用主要是為了提高效率和方便編程,但友元破壞了類的封裝性和隱蔽性,使用時要權衡利弊。 (21)友元類的聲明方法是(A)。 A.friend class<類名>; B.youyuan class<類名>; C.class friend<類名>; D.friends class<類名>;(22)下面對友元的錯誤描述是(D)。A.關鍵字friend用于聲明友元 B.一個類中的成員函數可以是另一個類的友元 C.友元函數訪問對象的成員不受訪問特性影響 D.友元函數通過this指針訪問對象成員 【結果分析】 友元函數是一個放在類中的普通函數,它沒有this指針。(23)下面選項中,(C)不是類的成員函數。 A.構造函數 B.析構函數 C.友元函數 D.拷貝構造函數 三、簡答題 (1)類與對象有什么關系? 【問題解答】 類是一種用戶自己定義的數據類型,和其他數據類型不同的是,組成這種類型的不僅可以有數據,而且可以有對數據進行操作的函數。程序員可以使用這個新類型在程序中聲明新的變量,具有類類型的變量稱為對象。創建對象時,類被用做樣板,對象稱為類的實例。 (2)類定義的一般形式是什么?其成員有哪幾種訪問權限? 【問題解答】 定義類一般形式為: class類名{ public: <公有數據和函數> protected: <保護數據和函數> private: <私有數據和函數> }; 訪問權限共有3種: 分別是公有(public)、保護(protected)和私有(private)。(3)類的實例化是指創建類的對象還是定義類? 【問題解答】 指創建類的對象。 (4)什么是this指針?它的主要作用是什么? 【問題解答】 this指針是C++語言為成員函數提供的一個隱含對象指針,它不能被顯式聲明。this指針是一個局部量,局部于某個對象。不同的對象調用同一個成員函數時,編譯器根據this指針來確定應該引用哪一個對象的數據成員。(5)什么叫做拷貝構造函數?拷貝構造函數何時被調用? 【問題解答】 拷貝構造函數是一種特殊的構造函數,它的作用是用一個已經存在的對象去初始化另一個對象。為了保證所引用的對象不被修改,通常把引用參數聲明為const參數。 在以下3種情況下,拷貝構造函數都會被自動調用: ◆當用類的一個對象去初始化該類的另一個對象時; ◆當函數的形參是類的對象,進行形參和實參結合時; ◆當函數的返回值是類的對象,函數執行完成返回調用者時。 四、程序分析題(寫出程序的輸出結果,并分析結果)(1) #include using namespace std; class Test { private: int num;public: Test();// 默認構造函數 Test(int n);// 帶一個參數構造函數 }; Test∷Test() { cout<<“Init defa”< num=0;} Test∷Test(int n) { cout<<“Init”<<“ ”< num=n;} int main() { Test x[2];// 語句1 Test y(15);// 語句2 return 0;} 【輸出結果】 Init defa Init defa Init 15 【問題分析】 本題主要考查構造函數的調用時機和構造函數的匹配問題。【要點提示】 構造函數在創建對象時被自動調用,具體調用哪個構造函數將由編譯系統根據重載函數的匹配原則來確定。【結果分析】 ① 程序聲明了2個對象x和y,類中有2個構造函數。 ② 程序首先執行語句1,創建對象x,調用默認構造函數。由于對象x是對象數組,每個數組元素被創建時都要調用構造函數,所以默認構造函數被調用了2次,輸出第1、2行結果。程序接著執行語句2,創建對象y,調用帶一個參數的構造函數,輸出第3行結果。(2) #include using namespace std; class Xx { private: int num; public: Xx(int x){num=x;} // 構造函數 ~Xx(){cout<<“dst ”< }; int main() { Xx w(5);// 語句1 cout<<“Exit main”< return 0;} 【輸出結果】 Exit main dst 5 【問題分析】 本題主要考查析構函數的調用時機。【要點提示】 析構函數在釋放對象時被自動調用。【結果分析】 ① 程序聲明了一個對象w。 ② 程序首先執行語句1,創建對象w,調用構造函數,num得到初值5。程序接著執行語句2,輸出第1行結果。當程序結束時,釋放對象w,析構函數被調用,輸出第2行結果。 (3)將例3.10中的Whole類如下修改,其他部分不變,寫出輸出結果。 class Whole { public: Whole(int i);// Whole的有參構造函數 Whole(){};// Whole的無參構造函數 ~Whole();// Whole的析構函數 private: Part p1;// 子對象1 Part p2;// 子對象2 Part p3;// 子對象3 };Whole∷Whole(int i):p2(i),p1() { cout<<“Constructor of Whole”< Whole∷~Whole() { cout<<“Destructor of Whole”< 【輸出結果】 Default constructor of Part Constructor of Part,3 Default constructor of Part Constructor of Whole Destructor of Whole Destructor of Part,0 Destructor of Part,3 Destructor of Part,0 【問題分析】 本題主要考查子對象初始化的方法和含有子對象時構造函數和析構函數的調用順序。 【要點提示】 ◆當建立X類的對象時,先調用子對象的構造函數,初始化子對象,然后才執行X類的構造函數,初始化X類中的其他成員。 ◆對子對象構造函數的調用順序取決于這些子對象在類中的說明順序,與它們在成員初始化列表中給出的順序無關。 ◆如果X類的構造函數沒有給出成員初始化列表,表明子對象將使用默認構造函數進行初始化。◆析構函數的調用順序與構造函數的調用順序正好相反。【結果分析】 程序的Whole類中出現了類Part的3個對象p1、p2和p3,作為該類的數據成員,則p1、p2和p3被稱為子對象。當建立Whole類的對象w時,子對象p1、p2和p3被建立,相應的構造函數被執行。由于p1在Whole類中先說明,所以先執行它所使用的構造函數,即類Part的默認構造函數,接著p2執行它所使用的有參構造函數,緊接著初始化p3,由于Whole類構造函數的成員初始化列表中沒有子對象p3進行初始化的選項,所以執行類Part的默認構造函數,當所有子對象被構造完之后,對象w的構造函數才被執行,從而得到前4行輸出結果,而后4行是執行相應析構函數的輸出結果。(4) #include using namespace std; class Book { public: Book(int w); static int sumnum; private: int num;}; Book∷Book(int w) { num=w; sumnum-=w;} int Book∷sumnum=120;// 語句1 int main() { Book b1(20);// 語句2 Book b2(70);// 語句3 cout< return 0;} 【輸出結果】 【問題分析】 本題主要考查“在類的范圍內所有對象共享靜態成員的數據”的含義。【結果分析】 程序中語句1對靜態成員sumnum進行初始化,sumnum得到初值120。執行語句2時,調用構造函數,sumnum變為100。接著語句3,再調用構造函數,sumnum變為30。 五、程序設計題 (1)聲明一個Circle類,有數據成員radius(半徑)、成員函數area(),計算圓的面積,構造一個Circle的對象進行測試。【問題分析】 本題主要考查類定義的形式、對象成員訪問和對象初始化的方法。要求理解類和構造函數的真正含義,特別注意如何將客觀事物的屬性和行為抽象為類的成員。【解題思路】 ① 題目中已給出了類的基本部分,需要增加一個構造函數來初始化數據成員radius。 ② 為了程序的通用性,圓的半徑由鍵盤輸入。【參考程序】 // xt3_1.cpp #include 面向對象程序設計教程(C++語言描述)題解 第1章 面向對象程序設計概論 一、名詞解釋 抽象 封裝 消息 【問題解答】 面向對象方法中的抽象是指對具體問題(對象)進行概括,抽出一類對象的公共性質并加以描述的過程。 面向對象方法中的封裝就是把抽象出來的對象的屬性和行為結合成一個獨立的單位,并盡可能隱蔽對象的內部細節。 消息是面向對象程序設計用來描述對象之間通信的機制。一個消息就是一個對象要求另一個對象實施某種操作的一個請求。 二、填空題 (1)目前有面向過程的結構化程序設計方法和面向對象的程序設計方法兩種重要的程序設計方法。(2)結構化程序設計方法中的模塊由順序、選擇和循環3種基本結構組成。 (3)在結構化程序設計方法中,程序可表示為程序=數據結構+算法; 而面向對象的程序設計方法,程序可表示為程序=對象+消息。 (4)結構化程序設計方法中的基本模塊是過程; 而面向對象程序設計方法中的基本模塊是類。(5)面向對象程序設計方法具有抽象性、封裝性、繼承性和多態性等特點。 三、選擇題(至少選一個,可以多選) (1)面向對象程序設計著重于(B)的設計。 A.對象B.類C.算法D.數據 (2)面向對象程序設計中,把對象的屬性和行為組織在同一個模塊內的機制叫做(C)。 A.抽象 B.繼承 C.封裝 D.多態(3)在面向對象程序設計中,類通過(D)與外界發生關系。 A.對象 B.類 C.消息 D.接口(4)面向對象程序設計中,對象與對象之間的通信機制是(C)。 A.對象 B.類 C.消息 D.接口(5)關于C++與C語言的關系的描述中,(D)是錯誤的。 A.C語言是C++的一個子集 B.C語言與C++是兼容的 C.C++對C語言進行了一些改進 D.C++和C語言都是面向對象的 【結果分析】 C語言是面向過程的。C++語言是一種經過改進的更為優化的C語言,是一種混合型語言,既面向過程也面向對象。 (6)面向對象的程序設計將數據結構與(A)放在一起,作為一個相互依存、不可分割的整體來處理。 A.算法 B.信息 C.數據隱藏 D.數據抽象(7)下面(A)不是面向對象系統所包含的要素。 A.重載 B.對象 C.類 D.繼承 【結果分析】 面向對象=對象+類+繼承+消息+多態(8)下面說法正確的是(BC)。 A.將數據結構和算法臵于同一個函數內,即為數據封裝 B.一個類通過繼承可以獲得另一個類的特性 C.面向對象要求程序員集中于事物的本質特征,用抽象的觀點看待程序 D.同一消息為不同的對象接受時,產生的行為是一樣的,這稱為一致性 【結果分析】 面向對象程序設計方法具有抽象性、封裝性、繼承性和多態性等特點。將數據結構和算法臵于同一個類內,即為數據封裝。同一消息為不同的對象接受時,產生的行為可能是不一樣的,這稱為多態性。(9)下面說法正確的是(AD)。 A.對象是計算機內存中的一塊區域,它可以存放代碼和數據 B.對象實際是功能相對獨立的一段程序 C.各個對象間的數據可以共享是對象的一大優點 D.在面向對象的程序中,對象之間只能通過消息相互通信 【結果分析】 對象是計算機內存中的一塊區域。在對象中,不但存有數據,而且存有代碼,使得每個對象在功能上相互之間保持相對獨立。對象之間存在各種聯系,但它們之間只能通過消息進行通信。 四、判斷題 (1)在高級程序設計語言中,一般用類來實現對象,類是具有相同屬性和行為的一組對象的集合,它是創建對象的模板。(√)(2)C++語言只支持面向對象技術的抽象性、封裝性、繼承性等特性,而不支持多態性。(×)【結果分析】 C++語言不僅支持面向對象技術的抽象性、封裝性、繼承性等特性,而且支持多態性。 (3)面向對象程序設計中的消息應該包含“如何做”的信息。(×)【結果分析】 消息是面向對象程序設計用來描述對象之間通信的機制。向對象“發送消息”只需告訴對象做什么,對象根據這個消息決定如何做。 (4)一個消息只能產生特定的響應效果。(×)【結果分析】 當一個對象發出消息時,由于接收對象的類型可能不同,所以,它們可能做出不同的反應。這樣,一個消息可以產生不同的響應效果,這種現象叫做多態。 (5)類的設計和類的繼承機制實現了軟件模塊的可重用性。(√) (6)C++語言和Java語言均不是一個純正的面向對象的程序設計的語言。(×)【結果分析】 Java語言是一個純正的面向對象的程序設計語言。(7)學習C++語言是學習面向對象的程序設計方法的唯一途徑。(×)【結果分析】 程序設計方法是獨立于具體程序設計語言的一種技術,學習C++語言是學習面向對象程序設計方法的重要途徑之一。 (8)在C++語言中,類是支持數據封裝的工具。(√) 五、簡答題 (1)什么是結構化程序設計方法?它有哪些優點和缺點? 【問題解答】 結構化程序設計方法著眼于系統要實現的功能,從系統的輸入輸出出發,分析系統要做哪些事情,進而考慮如何做這些事情,自頂向下地對系統的功能進行分解,來建立系統的功能結構和相應的程序模塊結構,有效地將一個較復雜的程序系統設計任務分解成許多易于控制和處理的子任務,便于開發和維護。 隨著程序規模與復雜性的增長,這種面向過程的結構化程序設計方法存在明顯的不足之處。首先是數據安全性問題。由于數據被每個模塊所共用,因此是不安全的,一旦出錯,很難查明原因。其次是可 維護性及可重用性差。它把數據結構和算法分離為相互獨立的實體,一旦數據結構需要改變時,常常要涉及整個程序,修改工作量極大并容易產生新的錯誤。每一種相對于老問題的新方法都要帶來額外的開銷。另外,圖形用戶界面的應用程序,很難用過程來描述和實現,開發和維護也都很困難。(2)什么是面向對象程序設計方法?它有哪些優點? 【問題解答】 面向對象的程序設計方法中,將程序設計為一組相互協作的對象而不是一組相互協作的函數。在程序中,屬性用數據表示,用來描述對象靜態特征; 行為用程序代碼實現,用來描述對象動態特征。可見,在面向對象的程序設計方法中,對象是數據結構和算法的封裝體。對象之間存在各種聯系,它們之間通過消息進行通信。程序可表示為: 程序=對象+消息 在面向對象程序設計中應著重于類的設計。類正是面向對象語言的基本程序模塊,通過類的設計來完成實體的建模任務。類通過一個簡單的外部接口與外界發生關系。一個類中的操作不會處理到另一個類中的數據,這樣程序模塊的獨立性、數據的安全性就有了良好的保障。程序的執行取決于事件發生的順序,由順序產生的消息來驅動程序的執行。不必預先確定消息產生的順序,更符合客觀世界的實際。并且面向對象程序設計方法提供了軟件重用、解決大問題和復雜問題的有效途徑,具有抽象性、封裝性、繼承性和多態性等特點。 (3)結構化程序設計方法與面向對象程序設計方法在對待數據結構和算法關系上有 什么不同? 【問題解答】 結構化程序設計方法中,把數據結構和算法分離為相互獨立的實體; 而在面向對象程序設計中,數據結構和算法封裝在一起,結合成一個獨立的單位,即對象,并盡可能隱蔽對象的內部細節。對象的私有屬性只能由這個對象的行為來讀取和修改,與外部的聯系通過公有行為充當外部接口。 第2章 從C到C++ 一、名詞解釋 引用內聯函數重載函數 【問題解答】 所謂引用就是給對象取一個別名,使用該別名可以存取該對象。換句話說是使新對象和原對象共用一個地址。 內聯函數是使用inline關鍵字聲明的函數。重載函數指在同一個作用域內名字相同而參數不同的函數。重載函數通常用來對具有相似行為而數據類型或數據個數不同的操作提供—個通用的名稱。 二、填空題 (1)一般情況下,用C++語言編寫的程序是由函數加上類組成的。 (2)C++有兩種注釋符號,一種是//,另一種是 /*……*/。 (3)使用C++風格的輸入輸出,在程序中必須包含頭文件“iostream”。 (4)cin是預定義的標準輸入流對象,>>是輸入操作符,也稱提取運算符。 (5)cout是預定義的標準輸出流對象,<<是輸出操作符,也稱插入運算符。 (6)指針的值是它所指向那個對象的地址值。指針的類型是它所指向對象的類型。指針的內容便是它所指向對象的值。 (7)C++使用運算符 & 來定義一個引用,對引用的存取都是對它所引用的對象的存取。(8)當一個函數調用出現在函數定義之前時,必須先用函數原型對函數進行聲明。 (9)C++有值傳遞和引用傳遞兩種參數傳遞機制。 (10)使用關鍵字inline聲明的函數稱為內聯函數。 (11)運算符new用于進行動態內存分配,運算符delete用于釋放動態分配的內存。(12)下面程序的輸出結果為x=10,y=10; x=100,y=100。#include int *p=&y;*p=100; cout<<“x=”< 三、選擇題(至少選一個,可以多選)(1)在整型指針變量p2、p3的定義中,錯誤的是(A)。 A.int p1,*p2,p3;B.int*p2,p1,*p3;C.int p1,*p2=&p1,*p3;D.int*p2,p1,*p3=&p1;【結果分析】 指針定義的具體格式如下所示: <類型> *<指針名1>,*<指針名2>,…;(2)若有定義“double xx=3.14,*pp=&xx; ”,則*pp等價于(C)。A.&xxB.*xxC.3.14D.xx 【結果分析】 pp指向xx所在的內存單元,這樣*pp和xx等價。(3)下面對引用的描述中(C)是錯誤的。A.引用是某個變量或對象的別名 B.建立引用時,要對它初始化 C.對引用初始化可以使用任意類型的變量 D.引用與其代表的對象具有相同的地址 【結果分析】 所謂引用就是給對象取一個別名,使用該別名可以存取該對象,所以對引用初始化必須使用同類型的變量。 (4)函數沒有返回值的時候,應該選擇(A)的函數類型。 A.void B.int C.不確定 D.float(5)在函數的定義格式中,下面各組成部分中,(D)是可以省略的。 A.函數名 B.函數體 C.返回值類型 D.函數參數 【結果分析】 函數的定義可以缺省形式參數,此時稱為無參函數。 (6)對重載的函數來說,下面敘述不正確的是(D)。 A.參數的類型不同 B.參數的順序不同 C.參數的個數不同 D.參數的個數、類型、順序都相同,但函數的返回值類型不同 【結果分析】 對重載的函數來說,編譯系統將根據函數參數的類型和個數來判斷使用哪一個函數,所以重載函數參數的個數、類型、順序不能都相同。 (7)下列有關設臵函數參數默認值的描述中,(D)是正確的。 A.對設臵函數參數默認值的順序沒有任何規定 B.函數具有一個參數時不能設臵默認值 C.默認參數要設臵在函數的原型中,而不能設臵在函數的定義語句中 D.設臵默認參數可使用表達式,但表達式中不可用局部變量 【結果分析】 在C++中,在函數原型中可以為一個或多個參數指定默認值。對函數參數設臵默認值要注意以下幾點。 ◆若沒有聲明函數原型,參數的默認值可在函數定義的頭部進行設臵,否則必須在函數原型中進行設臵。 ◆在一個指定了默認值的參數右邊不能出現沒有指定默認值的參數。 ◆設臵默認參數可使用表達式,但表達式中不可用局部變量。 (8)下面說法正確的是(BC)。A.所有的函數都可以說明為內聯函數 B.具有循環語句、switch語句的函數不能說明為內聯函數 C.使用內聯函數,可以加快程序執行的速度,但會增加程序代碼的大小 D.使用內聯函數,可以減小程序代碼大小,但使程序執行的速度減慢 【結果分析】 內聯函數主要是解決程序的運行效率問題。在程序編譯時,編譯系統將程序中出現內聯函數調用的地方用函數體進行替換,進而減少了程序運行的時間,但會增加程序代碼的大小。它是以空間換取時間,因此內聯函數適用于功能不太復雜,但要求被頻繁調用的函數。 (9)一個函數功能不太復雜,但要求被頻繁調用,應選用(A)。 A.內聯函數 B.重載函數 C.遞歸函數 D.嵌套函數 (10)C++對C語言做了很多改進,下列描述中 使得C語言發生了質變,即從面向過程變成面向對象的是(D)。A.增加了一些新的運算符 B.允許函數重載,并允許設臵默認參數 C.規定函數說明必須用原型 D.引進了類和對象的概念 【結果分析】 面向對象=對象+類+繼承+消息+多態 四、判斷題 (1)C++程序中,不得使用沒有定義或說明的變量。(√) (2)使用const說明常量時,可以不必指出類型。(×)【結果分析】 如果用const 定義的是一個整型常量,則類型說明符int可以省略。 (3)引用被創建時可以用任意變量進行初始化。(×)【結果分析】 對引用初始化必須使用同類型的變量。 (4)一個返回引用的調用函數可以作為左值。(√) (5)函數可以沒有參數,也可以沒有返回值。(√) (6)沒有參數的兩個函數是不能重載的。(√)(7)函數可設臵默認參數,但不允許將一個函數的所有參數都設臵為默認參數。(×)【結果分析】 函數可設臵默認參數,且允許將一個函數的所有參數都設臵為默認參數。 (8)運算符new分配的空間由運算符delete釋放。(√) 五、簡答題 (1)名字空間的用途是什么? 【問題解答】 名字空間用來防止命名的沖突。(2)引用有何用處? 【問題解答】 除了獨立引用外,在C++程序中,引用的主要用途是用作函數參數和函數的返回值。 (3)比較值調用和引用調用的相同點與不同點。【問題解答】 在值調用機制中,作為實參的表達式的值被復制到由對應的形參名所標識的一個對象中,作為形參的初始值。函數體對形參的訪問、修改都是在這個標識對象上操作的,與實參無關,即數據的傳遞是單向的。 使用引用作函數的形參時,調用函數的實參要用變量名。實參傳遞給形參,相當于在被調用函數中使用了實參的別名。于是,在被調用函數中對形參的操作實質是對實參的直接操作,即數據的傳遞是雙向的。 (4)內聯函數有什么作用?它有哪些特點? 【問題解答】 內聯函數是使用inline關鍵字聲明的函數。在程序編譯時,編譯系統將程序中出現內聯函數調用的地方用函數體進行替換,進而減少了程序運行的時間。 使用內聯函數應注意以下幾點。◆遞歸函數不能定義為內聯函數。 ◆內聯函數一般適合于不含有switch和while等復雜的結構且只有1~5條語句的小函數,否則編譯系統將該函數視為普通函數。 ◆內聯函數只能先定義后使用,否則編譯系統也將該函數視為普通函數。 ◆對內聯函數也不能進行異常接口聲明。(5)函數原型中的參數名與函數定義中的參數名以及函數調用中的參數名必須一致嗎? 【問題解答】 不必一致。所有的參數是根據位臵和類型而不是名字來區分的。 (6)重載函數時通過什么來區分? 【問題解答】 編譯系統將根據函數參數的類型和個數來判斷使用哪一個函數。 六、程序分析題(寫出程序的輸出結果,并分析結果) #include 【輸出結果】 num=60 ref=100 【問題分析】 本題主要考查引用的含義。【結果分析】 程序首先定義一個int類型的對象num,并給它賦初始值50。然后又定義了一個int類型的引用ref,并將它和num相聯系。這樣,無論是對num還是對ref進行操作,實際上都是對那個一開始放著50的物理單元的內容進行操作。 七、程序設計題 寫出一個完整的C++程序,使用系統函數pow(x,y)計算xy的值,注意包含頭文件cmath。【問題分析】 本題主要考查簡單的輸入輸出和標準庫函數的調用方法。【解題思路】 ① 由于要用到系統函數pow(x,y),所以要包含頭文件cmath。 ② 要計算xy的值,首先必須知道x和y的值。為了程序的通用性,最好通過交互的方式輸入x和y的值。【參考程序】 // xt2_1.cpp #include cout<<“please input 2 floats to x,y:”;cin>>x>>y; float z=pow(x,y); cout<<“pow(”< please input 2 floats to x,y:3.1 2 pow(3.1,2)=9.61 第3章 類 與 對 象 一、填空題 (1)類定義中關鍵字private、public和protected以后的成員的訪問權限分別是私有、公有和保護。如果沒有使用關鍵字,則所有成員默認定義為private權限。具有public訪問權限的數據成員才能被不屬于該類的函數所直接訪問。(2)定義成員函數時,運算符“∷”是作用域運算符,“MyClass∷”用于表明其后的成員函數是在“MyClass類”中說明的。 (3)在程序運行時,通過為對象分配內存來創建對象。在創建對象時,使用類作為樣板,故稱對象為類的實例。 (4)假定Dc是一個類,則執行“Dc a[10],b(2)”語句時,系統自動調用該類構造函數的次數為11。【結果分析】 創建10個數組元素需調用構造函數10次,創建對象b需調用構造函數1次,所以系統自動調用該類構造函數的總次數為11。 (5)對于任意一個類,析構函數的個數最多為1個。 (6)delete運算符通常用于實現釋放該類對象中指針成員所指向的動態存儲空間的任務。(7)C++程序的內存格局通常分為4個區: 數據區、代碼區、棧區和堆區。 (8)數據定義為全局變量,破壞了數據的 封裝性; 較好的解決辦法是將所要共享的數據定義為類的 靜態成員。 (9)靜態數據成員和靜態成員函數可由 任意訪問權限許可的函數訪問。 (10)友元函數和 友元類統稱為友元。(11)友元的正確使用能提高程序的效率,但破壞了類的封裝性和數據的隱蔽性。 (12)若需要把一個類A定義為一個類B的友元類,則應在類B的定義中加入一條語句: friend class A。 二、選擇題(至少選一個,可以多選)(1)以下不屬于類訪問權限的是(B)。A.public B.staticC.protectedD.private 【結果分析】 類的訪問權限有public、protected 和private。(2)有關類的說法不正確的是(BC)。A.類是一種用戶自定義的數據類型 B.只有類的成員函數才能訪問類的私有數據成員 C.在類中,如不做權限說明,所有的數據成員都是公有的 D.在類中,如不做權限說明,所有的數據成員都是私有的 【結果分析】 類是一種用戶自定義的數據類型,類中成員均具有一種訪問權限。關鍵字public、protected 和private以后的成員的訪問權限分別是公有、保護和私有的,所有成員默認定義為private的。私有成員是被隱藏的數據,只有該類的成員函數或友元函數才可以訪問它。 (3)在類定義的外部,可以被任意函數訪問的成員有(C)。 A.所有類成員 B.private或protected的類成員 C.public的類成員 D.public或private的類成員 【結果分析】 類是一種用戶自定義的數據類型,類中成員均具有一種訪問權限。公有成員定義了類的外部接口。私有成員是被隱藏的數據,只有該類的成員函數或友元函數才可以引用它。保護成員具有公有成員和私有成員的雙重性質,可以被該類或派生類的成員函數或友元函數引用。可見在類定義的外部,可以被任意函數訪問的成員是public的類成員。(4)關于類和對象的說法(C)是錯誤的。A.對象是類的一個實例 B.任何一個對象只能屬于一個具體的類 C.一個類只能有一個對象 D.類與對象的關系和數據類型與變量的關系相似 【結果分析】 C++語言的類就是一種用戶自己定義的數據類型,類和對象的關系就相當于基本數據類型與它的變量的關系,所以任何一個對象只能屬于一個具體的類,但一個類可以有多個對象。 (5)設MClass是一個類,dd是它的一個對象,pp是指向dd的指針,cc是dd的引用,則對成員的訪問,對象dd可以通過(B)進行,指針pp可以通過(D)進行,引用cc可以通過(B)進行。 A.∷ B..C.& D.-> (6)關于成員函數的說法中不正確的是(C)。A.成員函數可以無返回值 B.成員函數可以重載 C.成員函數一定是內聯函數 D.成員函數可以設定參數的默認值 【結果分析】 與普通函數不同的是,成員函數是屬于某個類的。成員函數的實現,可以放在類體內,也可以放在類體外。在類體外實現的成員函數不再是內聯函數。(7)下面對構造函數的不正確描述是(B)。A.系統可以提供默認的構造函數 B.構造函數可以有參數,所以也可以有返回值 C.構造函數可以重載 D.構造函數可以設臵默認參數 【結果分析】 構造函數不能指定返回類型,即使是void類型也不可以,當然不可能有返回值。 (8)假定A是一個類,那么執行語句“A a,b(3),*p; ”調用了(B)次構造函數。A.1 B.2 C.3 D.4 【結果分析】 聲明指針是不會調用構造函數的。 (9)下面對析構函數的正確描述是(AC)。A.系統可以提供默認的析構函數 B.析構函數必須由用戶定義 C.析構函數沒有參數 D.析構函數可以設臵默認參數 【結果分析】 析構函數的作用是在對象消失時執行一項清理任務。如果一個類中沒有定義析構函數,系統將自動生成一個默認析構函數。析構函數沒有參數,當然不可能設臵默認參數。 (10)類的析構函數是(D)時被調用的。A.類創建 B.創建對象 C.引用對象 D.釋放對象 (11)創建一個類的對象時,系統自動調用(B); 撤銷對象時,系統自動調用(C)。 A.成員函數 B.構造函數 C.析構函數 D.復制構造函數 (12)通常拷貝構造函數的參數是(C)。A.某個對象名 B.某個對象的成員名 C.某個對象的引用名 D.某個對象的指針名 (13)關于this指針的說法正確的是(B)。 A.this指針必須顯式說明B.當創建一個對象后,this指針就指向該對象 C.成員函數擁有this指針D.靜態成員函數擁有this指針。【結果分析】 this指針是由C++編譯器自動產生且較常用的一個隱含對象指針,它不能被顯式聲明。當創建一個對象時,this指針就初始化指向該對象。但只有非靜態成員函數才擁有this指針,并通過該指針來處理對象。 (14)下列關于子對象的描述中,(B)是錯誤的。 A.子對象是類的一種數據成員,它是另一個類的對象 B.子對象可以是自身類的對象 C.對子對象的初始化要包含在該類的構造函數中 D.一個類中能含有多個子對象作其成員 【結果分析】 子對象不可以是自身類的對象。 (15)對new運算符的下列描述中,(B)是錯誤的。 A.它可以動態創建對象和對象數組 B.用它創建對象數組時必須指定初始值 C.用它創建對象時要調用構造函數 D.用它創建的對象數組可以使用運算符delete來一次釋放 【結果分析】 使用運算符new創建對象數組的格式如下: new <類型說明符> [<算術表達式>] 其中,<算術表達式>給出數組的大小,后面不能再跟構造函數參數,所以用它創建對象數組時不能指 定初始值。 (16)對delete運算符的下列描述中,(D)是錯誤的。 A.用它可以釋放用new運算符創建的對象和對象數組 B.用它釋放一個對象時,它作用于一個new所返回的指針 C.用它釋放一個對象數組時,它作用的指針名前須加下標運算符[ ] D.用它可一次釋放用new運算符創建的多個對象 【結果分析】 用delete一次只能釋放用new創建的1個對象,但可釋放一個對象數組。 (17)關于靜態數據成員,下面敘述不正確的是(C)。 A.使用靜態數據成員,實際上是為了消除全局變量 B.可以使用“對象名.靜態成員”或者“類名∷靜態成員”來訪問靜態數據成員 C.靜態數據成員只能在靜態成員函數中引用 D.所有對象的靜態數據成員占用同一內存單元 【結果分析】 靜態數據成員可以在靜態成員函數中引用,也可以在非靜態成員函數中引用。 (18)對靜態數據成員的不正確描述是(CD)。A.靜態成員不屬于對象,是類的共享成員 B.靜態數據成員要在類外定義和初始化 C.調用靜態成員函數時要通過類或對象激活,所以靜態成員函數擁有this指針 D.只有靜態成員函數可以操作靜態數據成員 【結果分析】 this指針是一個局部量,局部于某個對象,而靜態成員函數是屬于整個類而不是某個對象,它沒有this指針。靜態成員函數和非靜態成員函數均可操作靜態數據成員。 (19)下面的選項中,靜態成員函數不能直接訪問的是(D)。 A.靜態數據成員 B.靜態成員函數 C.類以外的函數和數據 D.非靜態數據成員 【結果分析】 由于靜態成員函數沒有this指針,它只能直接訪問該類的靜態數據成員、靜態成員函數和類以外的函數和數據,訪問類中的非靜態數據成員必須通過參數傳遞方式得到對象名,然后通過對象名來訪問。 (20)在類的定義中,引入友元的原因是(A)。A.提高效率 B.深化使用類的封裝性 C.提高程序的可讀性 D.提高數據的隱蔽性 【結果分析】 友元的作用主要是為了提高效率和方便編程,但友元破壞了類的封裝性和隱蔽性,使用時要權衡利 弊。 (21)友元類的聲明方法是(A)。 A.friend class<類名>; B.youyuan class<類名>; C.class friend<類名>; D.friends class<類名>; (22)下面對友元的錯誤描述是(D)。A.關鍵字friend用于聲明友元 B.一個類中的成員函數可以是另一個類的友元 C.友元函數訪問對象的成員不受訪問特性影響 D.友元函數通過this指針訪問對象成員 【結果分析】 友元函數是一個放在類中的普通函數,它沒有this指針。 (23)下面選項中,(C)不是類的成員函數。A.構造函數 B.析構函數 C.友元函數 D.拷貝構造函數 三、簡答題 (1)類與對象有什么關系? 【問題解答】 類是一種用戶自己定義的數據類型,和其他數據類型不同的是,組成這種類型的不僅可以有數據,而且可以有對數據進行操作的函數。程序員可以使用這個新類型在程序中聲明新的變量,具有類類型的變量稱為對象。創建對象時,類被用做樣板,對象稱為類的實例。 (2)類定義的一般形式是什么?其成員有哪幾種訪問權限? 【問題解答】 定義類一般形式為: class類名{ public: <公有數據和函數> protected: <保護數據和函數> private: <私有數據和函數> }; 訪問權限共有3種: 分別是公有(public)、保護(protected)和私有(private)。 (3)類的實例化是指創建類的對象還是定義類? 【問題解答】 指創建類的對象。 (4)什么是this指針?它的主要作用是什么? 【問題解答】 this指針是C++語言為成員函數提供的一個隱含對象指針,它不能被顯式聲明。this指針是一個局部量,局部于某個對象。不同的對象調用同一個成員函數時,編譯器根據this指針來確定應該引用哪一個對象的數據成員。 (5)什么叫做拷貝構造函數?拷貝構造函數何時被調用? 【問題解答】 拷貝構造函數是一種特殊的構造函數,它的作用是用一個已經存在的對象去初始化另一個對象。為了保證所引用的對象不被修改,通常把引用參數聲明為const參數。 在以下3種情況下,拷貝構造函數都會被自動調用: ◆當用類的一個對象去初始化該類的另一個對象時; ◆當函數的形參是類的對象,進行形參和實參結合時; ◆當函數的返回值是類的對象,函數執行完成返回調用者時。 四、程序分析題(寫出程序的輸出結果,并分析結果)(1) #include using namespace std; class Test { private: int num; public: Test();// 默認構造函數 Test(int n);// 帶一個參數構造函數 }; Test∷Test() { cout<<“Init defa”< Test∷Test(int n) { cout<<“Init”<<“ ”< int main() { Test x[2];// 語句1 Test y(15);// 語句2 return 0;} 【輸出結果】 Init defa Init defa Init 15 【問題分析】 本題主要考查構造函數的調用時機和構造函數的匹配問題。【要點提示】 構造函數在創建對象時被自動調用,具體調用哪個構造函數將由編譯系統根據重載函數的匹配原則來確定。【結果分析】 ① 程序聲明了2個對象x和y,類中有2個構造函數。 ② 程序首先執行語句1,創建對象x,調用默認構造函數。由于對象x是對象數組,每個數組元素被創建時都要調用構造函數,所以默認構造函數被調用了2次,輸出第1、2行結果。程序接著執行語句2,創建對象y,調用帶一個參數的構造函數,輸出第3行結果。(2) #include using namespace std;class Xx { private: int num;public: Xx(int x){num=x;} // 構造函數 ~Xx(){cout<<“dst ”< }; int main() { Xx w(5);// 語句1 cout<<“Exit main”< return 0;} 【輸出結果】 Exit main dst 5 【問題分析】 本題主要考查析構函數的調用時機。【要點提示】 析構函數在釋放對象時被自動調用。【結果分析】 ① 程序聲明了一個對象w。 ② 程序首先執行語句1,創建對象w,調用構造函數,num得到初值5。程序接著執行語句2,輸出第1行結果。當程序結束時,釋放對象w,析構函數被調用,輸出第2行結果。 (3)將例3.10中的Whole類如下修改,其他部分不變,寫出輸出結果。 class Whole { public: Whole(int i);// Whole的有參構造函數 Whole(){};// Whole的無參構造函數 ~Whole();// Whole的析構函數 private: Part p1;// 子對象1 Part p2;// 子對象2 Part p3;// 子對象3 }; Whole∷Whole(int i):p2(i),p1(){ cout<<“Constructor of Whole”< Whole∷~Whole() { cout<<“Destructor of Whole”< 【輸出結果】 Default constructor of Part Constructor of Part,3 Default constructor of Part Constructor of Whole Destructor of Whole Destructor of Part,0 Destructor of Part,3 Destructor of Part,0 【問題分析】 本題主要考查子對象初始化的方法和含有子對象時構造函數和析構函數的調用順序。【要點提示】 ◆當建立X類的對象時,先調用子對象的構造函數,初始化子對象,然后才執行X類的構造函數,初始化X類中的其他成員。 ◆對子對象構造函數的調用順序取決于這些子對象在類中的說明順序,與它們在成員初始化列表中給出的順序無關。 ◆如果X類的構造函數沒有給出成員初始化列表,表明子對象將使用默認構造函數進行初始化。◆析構函數的調用順序與構造函數的調用順序正好相反。【結果分析】 程序的Whole類中出現了類Part的3個對象p1、p2和p3,作為該類的數據成員,則p1、p2和p3被稱為子對象。當建立Whole類的對象w時,子對象p1、p2和p3被建立,相應的構造函數被執行。由于p1在Whole類中先說明,所以先執行它所使用的構造函數,即類Part的默認構造函數,接著p2執行它所使用的有參構造函數,緊接著初始化p3,由于Whole類構造函數的成員初始化列表中沒有子對象p3進行初始化的選項,所以執行類Part的默認構造函數,當所有子對象被構造完之后,對象w的構造函數才被執行,從而得到前4行輸出結果,而后4行是執行相應析構函數的輸出結果。(4) #include using namespace std; class Book { public: Book(int w); static int sumnum; private: int num;}; Book∷Book(int w) { num=w; sumnum-=w;} int Book∷sumnum=120;// 語句1 int main() { Book b1(20);// 語句2 Book b2(70);// 語句3 cout< return 0;} 【輸出結果】 【問題分析】 本題主要考查“在類的范圍內所有對象共享靜態成員的數據”的含義。【結果分析】 程序中語句1對靜態成員sumnum進行初始化,sumnum得到初值120。執行語句2時,調用構造函數,sumnum變為100。接著語句3,再調用構造函數,sumnum變為30。 五、程序設計題 (1)聲明一個Circle類,有數據成員radius(半 徑)、成員函數area(),計算圓的面積,構造一個Circle的對象進行測試。【問題分析】 本題主要考查類定義的形式、對象成員訪問和對象初始化的方法。要求理解類和構造函數的真正含義,特別注意如何將客觀事物的屬性和行為抽象為類的成員。【解題思路】 ① 題目中已給出了類的基本部分,需要增加一個構造函數來初始化數據成員radius。 ② 為了程序的通用性,圓的半徑由鍵盤輸入。【參考程序】 // xt3_1.cpp #include 《面向對象程序設計》教學大綱 課程名稱:信息內容安全 課程代碼:042504 總 學 時:64 學 分:2 課程類型:專業必修課 適用專業: 信息安全專業 制 訂 人:徐雪飛 審 定 人:肖 文 制訂日期:2015年3月 《面向對象程序設計》教學大綱 一、課程性質、目的和任務 C#語言是.NET平臺上的核心開發語言,具有簡單易學、類型安全、完全面向對象等特性,是一門面向現代軟件工程的主流程序設計語言。本課程系統地介紹C#語言的結構化設計、面向對象、泛型、商業開發等功能要素,使學生在掌握程序設計的基本方法和技巧,培養利用計算機解決實際問題的能力,以滿足專業課應用和繼續學習的需要。 二、教學基本要求 通過學習本課程,要求學生能夠熟悉C#語言的語法和類型系統,掌握面向對象程序設計和泛型程序設計的基本方法,并具有商業應用開發的基本能力,能靈活地使用C#語言及Visual Studio.NET開發環境解決一般性編程問題。 三、教學內容 1、緒論(教學2學時,上機2學時) 教學內容: (1).NET技術和框架結構簡介(2)C#語言概貌 (3)面向對象的基本概念 教學目的:使學生對.NET平臺和C#有一個綜合性的了解。 2、C#語法基礎(教學6學時,上機4學時) 教學內容:(1)數據類型(2)值和方法(3)表達式(4)控制語句 教學目的:使學生基本掌握C#語言的類型系統和基本語法結構。 3、類和繼承(教學4學時,上機4學時) 教學內容: (1)類的數據成員和各種函數成員(2)繼承和多態(3).NET常用類型(4)接口與實現 教學目的:使學生進一步掌握類型的定義和使用方法,掌握.NET類庫中一些典型類的用法;深入理解繼承和多態性的概念,從而掌握面向對象軟件可重用性的關鍵技術。 4、Windows窗體界面(教學2學時,上機2學時) 教學內容: (1)Windows Form編程技術(2)WPF編程技術 (3)繪圖、動畫和媒體 教學目的:使學生掌握Windows程序界面設計的基本要素,能夠使用Windows Form和WPF編程技術開發交互式圖形界面應用程序。 5、泛型(教學4學時,上機2學時) 教學內容: (1)泛型的定義與使用(2)元組和可空類型的用法(3)泛型集合與循環遍歷 (4)匿名方法和Lambda表達式 教學目的:使學生掌握泛型程序設計的基本概念,能夠利用類型抽象和操作抽象開發出高可適的軟件程序。 6、異常處理(教學1學時) 教學內容: (1)C#異常處理結構 (2)主動引發異常和自定義異常 教學目的:使學生能夠通過異常處理來提高程序可靠性。 7、文件操作(教學1學時,上機1學時) 教學內容: (1)驅動器、目錄和文件(2)文件流和數據流 教學目的:使學生掌握在C#程序中進行磁盤文件存取的基本技術。 8、數據庫訪問(教學2學時,上機1學時) 教學內容: (1)ADO.NET聯機數據訪問(2)ADO.NET脫機數據訪問 教學目的:使學生掌握C#程序中進行數據庫存取的基本技術。 9、綜合練習(教學2學時,上機8學時)教學內容: (1)進程和線程 (2)ASP.NET網絡程序設計 (3)采用案例驅動的方式,綜合運用C#編程技術開發較為完整的軟件程序。教學目的:提高學生軟件設計的綜合能力。 五、教學方法與手段 講授法、討論法、多媒體教學、實驗教學。 六、考核方式 考試成績占70%,平時成績占30%。閉卷考試。 七、推薦教材和教學參考書 教 材:《C#程序設計基礎》第3版,鄭宇軍,石海鶴,王衛紅,清華大學出版社,2014年。參考書: 1、《C#應用開發與實踐》,曾憲權、李梅蓮 等,清華大學出版社,2015年 2、《C#編程實戰寶典》,付強、丁寧 等,清華大學出版社,2014年。 面向對象程序設計(專業限選課)Object-Oriented Programming 【課程編號】XZ26175 【學分數】3 【學時數】60=38+22 【課程類別】專業限選 【編寫日期】2010.3.30 【先修課程】C語言程序設計、計算機應用基礎 【適用專業】通信工程 一、教學目的、任務 通過學習,使學生深刻理解和領會面向對象的基本思想和基本特征,掌握面向對象程序設計語言C++語言的基本概念、基本語法以及面向對象程序設計的基本方法;使學生養成面向對象的編程思維習慣。 二、課程教學的基本要求 1.理解面向對象的基本概念和使用面向對象技術進行程序設計的基本思想 2.能比較熟練地用C++語言進行一般面向對象的程序設計 3.初步掌握面向對象編程環境Visual C++的使用 三、教學內容和學時分配(2 + 5 + 14 + 9 + 12 + 7 + 6 + 5 = 60)第一章 面向對象程序設計概述 2 學時(課堂講授學時2)主要內容: 1.什么是面向對象程序設計 2.對象與類 3.封裝 4.繼承性 5.多態性 6.面向對象程序設計的語言 教學要求: 了解什么是面向對象程序設計;掌握對象和類的基本概念;理解面向對象程序設計的基本特征。其它教學環節: 安排課外了解面向對象程序設計方面的基本概念。第二章 C++概述 5學時(課堂講授學時2+課程實驗學時3)主要內容: 1.C++的起源和特點 2.C++源程序的構成 3.C++在非面向對象方面的一些特性 教學要求: cin和cout的使用;new和delete的運算符的使用;函數的重載;帶缺省參數的函數;引用; VC++的使用。其它教學環節: 實驗1: C++程序設計基礎練習。實驗目的和要求: 1.掌握C++程序的基本格式和規范,學會編寫簡單的C++程序。2.掌握C++程序結構的特點。 3.熟悉C++程序基本的輸入輸出操作。 4.掌握C++數據類型常量和變量以及修飾符的使用方法。5.熟悉作用域運算符的功能和基本使用方法。6.掌握C++內存的動態分配和釋放方法。7.理解引用的概念,掌握引用的使用方法。 第三章 類和對象 14學時(課堂講授學時8+課程實驗學時6)主要內容: 1.類與對象的基本概念 2.構造函數與析構函數 3.對象數組與對象指針 4.向函數傳遞對象 5.靜態成員 6.友元 7.類對象作為成員 8.常類型 教學要求: 類的聲明;對象定義;對象的成員的訪問。訪問屬性的理解和運用;構造函數和析構函數的定義;對象數組的定義和使用;this的指針的理解和使用;類的成員類型為其他類時如何理解和使用;靜態成員的理解和運用。提供友元機制的目的;友元聲明方法;提供常類型機制的目的;各種不同的常類型運作方式。其它教學環節: 實驗2:類和對象。實驗目的和要求: 1.掌握類、類的數據成員、類的成員函數的定義方式。2.理解類成員的訪問控制方式。 3.掌握對象的定義和操作對象的方法。 4.理解構造函數和析構函數的定義與執行過程。5.掌握重載構造函數的方法。6.了解拷貝構造函數的方法。實驗3:對象數組和對象指針。實驗目的和要求: 1.掌握對象數組的定義和使用方法。 2.理解對象指針的概念,學會用指針引用對象。3.了解this指針的工作方式。 4.掌握靜態數據成員和靜態成員函數的基本使用方法。5.理解友元與友元函數的作用,掌握其使用方法。 第四章 派生類和繼承 9學時(課堂講授學時6+課程實驗學時3)主要內容: 1.派生類的概念 2.派生類的構造函數和析構函數 3.基類成員的訪問 4.多重繼承 5.賦值兼容規則 教學要求: 基類和派生類的基本概念;繼承成員的訪問規則;派生類構造函數和析構函數的運行規則;多重繼承的基本概念;多重繼承中同名二義性如何消除;引入虛基類的目的;繼承類和派生類之間相互賦值規則用。 其它教學環節: 實驗4:派生類與繼承。實驗目的和要求: 1.理解類的繼承的概念,能夠定義和使用類的繼承關系。2.掌握派生類的聲明和定義方法。 3.掌握公有派生和私有派生的訪問特性。4.學習虛基類在解決問題中的作用。 第五章 多態性 12學時(課堂講授學時8+課程實驗學時4)主要內容: 1.編譯時的多態性與運行時的多態性 2.函數重載 3.運算符重載 4.類型轉換 5.虛函數 教學要求: 多態的基本概念;實現運算符重載的方法(成員函數);實現運算符重載的方法(友元函數);靜態聯編和動態聯編的基本概念;虛函數的作用;虛函數的運用。其它教學環節: 實驗5:虛函數和多態性。實驗目的和要求: 1.理解編譯時的多態性和運行時的多態性。2.掌握運算符重載的基本方法。3.掌握虛函數的定義和使用方法。 第六章 模板 7學時(課堂講授學時4+課程實驗學時3)主要內容: 1.模板的概念 2.函數模板與模板函數 3.類模板和模板類 教學要求: 模板的基本概念;為什么要使用模板;函數模板和模板函數的基本概念;函數模板的聲明和使用;類模板和模板類的基本概念。其它教學環節: 實驗6:函數模板與類模板。實驗目的和要求: 1.掌握函數模板及其聲明方法。2.掌握模板函數及其生成方法。3.學習類模板的聲明與使用方法。 第七章 C++的I/O流類庫 6學時(課堂講授學時3+課程實驗學時3)主要內容: 1.C++建立類類庫的目的 2.預定義類型的輸入輸出 3.用戶自定義類型的輸入和輸出 教學要求: 掌握在各種情況下的<<和>>運算符的重載。其它教學環節: 實驗7:I/O流類庫。實驗目的和要求: 1.掌握流及流類庫的作用。 2.掌握流類庫中常用的類及其成員函數的使用方法。3.掌握重載“<<”和“>>”的方法。 4.掌握控制輸出寬度的函數width和setw。 5.掌握函數setosflags和resetiosflags設置和恢復對齊方式、精度、大小寫等。 研究教學內容 5學時(課程講解和討論學時) 程序綜合設計:按照面向對象程序開發的原則和方法,利用一個實例來講解面向對象程序設計的整個過程,然后要求學生根據自己的開發經驗進行分組討論,從而幫助學生進一步理解和熟悉面向對象程序設計方法。 四、教學重點、難點及教學方法 重點:類和對象的基本概念;對象定義;對象的成員的訪問。訪問屬性的理解和運用;構造函數和析構函數的定義;對象數組的定義和使用;this的指針的理解和使用。基類和派生類的基本概念;繼承成員的訪問規則;派生類構造函數和析構函數的運行規則。多態的基本概念;函數的重載。 難點:多重繼承;虛函數;模板。 教學方法:課堂授課采用多媒體教學和分組討論的方法,實驗采用任務驅動方式。通過未來愿景描述和學以致用的方法來提高學生的學習興趣,通過分組交流和師生積極互動的方式提高學生學習本門課程的學習能力。 五、考核方式及成績評定方式:考試 六、教材及參考書目 推薦教材: [1] 《C++面向對象程序設計》,陳維興,林小茶,清華大學出版社,第2版,2004 參考書: [1] 《C++面向對象程序設計習題解析與上機指導》,陳維興,清華大學出版社,2003 [2] 《C++程序設計基礎》,周靄如,電子工業出版社,2003 [3] 《C++語言程序設計》,鄭莉,清華大學出版社,2005 修(制)訂人: 審核人: 2010年 3 月30 日 《面向對象程序設計》教學大綱 課程名稱:面向對象程序設計 英文名稱:Object Oriented Programming)學分:2 總學時:36 實驗(上機)學時: 8 開課專業:電子商務專業 一、本課程的性質、目的和培養目標 面向對象程序設計是電子商務專業的限定選修課程。面向對象程序設計是當今最為流行的程序設計方法,本課程以C++語言為核心,全面概述面向對象程序設計的基本概念和基本技術。主要內容包括:理解和掌握面向對象程序設計的基本思想和技術,掌握C++中的引用和函數重載、類與對象、靜態成員與友元、運算符重載、繼承與派生類、多態與虛函數等重要概念和技術。通過教學要求學生基本掌握面向對象的程序設計方法,認識C++是如何支持面向對象程序設計的,培養、訓練學生運用面向對象技術進行程序設計的能力。 二、預修課程 計算機語言與程序設計 三、課程內容及學時分配 第一章 從C語言到C++語言 1.C++語言出現的歷史背景(OOP思想概述)2.C++中的注釋、常量和輸入輸出 3.C++中的變量定義與作用域 4.C++中的函數 5.C++中的指針與引用 本章學時數:4,本章習題數:4 第二章 類與對象 1.類 2.對象 3.構造函數和析構函數 4.對象及其應用 5.對象的生存期 6.再論程序結構 7.面向對象程序設計 本章學時數:6,本章習題數:6 第三章 靜態成員與友元 1.拷貝構造函數 2.靜態數據成員 3.靜態成員函數 4.友元函數 本章學時數:6,本章習題數:6 第四章 運算符重載 1.運算符重載的概念 2.運算符重載舉例 本章學時數:4,本章習題數:4 第五章 繼承與多態 1.繼承的概念 2.單繼承 3.多態與虛函數 4.類的分解(類的層次設計)5.抽象類與純虛函數 本章學時數:6,本章習題數:6 第六章 I/O流庫簡介 1.C++流庫的結構 2.輸入與輸出 3.格式控制 4.文件 本章學時數:2,本章習題數:2 四、實驗(上機)內容和建議學時分配 實驗1(4學時) 要求:定義類,該類至少應包括靜態數據成員和靜態成員函數,要求通過本實驗掌握定義類的基本方法。實驗2(4學時) 要求:通過本實驗掌握函數重載、友元函數、繼承、虛函數等的基本使用方法。 五、教材和參考書目 1.《C++語言基礎教程》,呂鳳翥編著,清華大學出版社,1999 2.《C++程序設計教程》,錢 能主編,清華大學出版社,1999 3.《The C++ Programming Language》(Third Edition),Bjarne Stroustrup,Addison-Wesley,1997 六、課外學習要求 要求課前預習下一次課的講課內容,課后復習本次課的講課內容并通過相應的作業加以消化。 七、考核方式 本課程采用閉卷書面考試方式為主,其中期終考試占80%,期中10%,平時作業、上機及出勤率10%。第二篇:面向對象程序設計教程(C++語言描述)題解
第三篇:《面向對象程序設計》教學大綱
第四篇:面向對象程序設計教學大綱
第五篇:《面向對象程序設計》教學大綱