C-面向對象程序設計項目教程完整版教學課件-整套教程電子講義(最全最新)_第1頁
C-面向對象程序設計項目教程完整版教學課件-整套教程電子講義(最全最新)_第2頁
C-面向對象程序設計項目教程完整版教學課件-整套教程電子講義(最全最新)_第3頁
C-面向對象程序設計項目教程完整版教學課件-整套教程電子講義(最全最新)_第4頁
C-面向對象程序設計項目教程完整版教學課件-整套教程電子講義(最全最新)_第5頁
已閱讀5頁,還剩584頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、項目一任務一 體會面向對象與面向過程的不同思維方式任務二 創建簡單的C+應用程序打開C+面向對象程序設計之門任務說明任務一 體會面向對象與面向過程的不同思維方式在本任務中我們來學習面向對象程序設計思想以及其與面向過程的不同。預備知識一、什么是面向對象的程序設計思想二、面向對象與面向過程比較一、什么是面向對象的程序設計思想其基本出發點是盡可能按照人類認識世界的方法和思維方式來分析和解決問題。客觀世界是由許多具體的事物或者事件、抽象的概念和規則等組成的,因此,人們研究的對象事、物、概念都統稱為“對象”。面向對象的設計方法是以對象作為最基本的元素,以對象作為分析問題、解決問題的核心。下面我們了解幾個

2、面向對象程序設計中涉及的基本概念。1對象2類3封裝4繼承5多態面向對象程序設計方法的優勢可以歸納為以下幾點:二、面向對象與面向過程比較(1)程序的開發效率高(2)程序代碼的可重用性高(3)程序易于維護任務實施 運用面向對象和面向過程兩種思想解決同一問題案例說明本任務中我們將分別使用面向過程和面向對象的程序設計方法設計兩個功能完全相同的程序(根據矩形的長和寬求其周長和面積),并結合任務內容說明兩種程序設計思想的異同。實施步驟1以面向過程的程序設計方式思考步驟1 以面向過程的思想來解決問題,步驟如下:(1)確定所求長方形的長和寬。(2)確定計算長方形的周長和面積的公式并計算。(3)輸出計算結果。步

3、驟2 根據解題思路編寫代碼,如【例1-1】所示。【例1-1】 以面向過程程序設計思想編碼。/1-1.cpp#include /包含頭文件iostream.husing namespace std;/使用標準命名空間void main()/主程序 int perimeter,area;/聲明周長與面積變量 int length=20,width=10;/聲明長、寬變量并賦初值 perimeter=2*(length+width);/求周長 area=length*width;/求面積 coutperimeter=perimeterendl;/輸出結果coutarea=areaendl;2以面向對

4、象的程序設計方式思考步驟1 以面向對象的思想來解決問題,步驟如下:(1)將長方形類的共性,即兩個基本屬性(長和寬)和兩個行為(求周長和求面積)抽取出來,設計一個長方形類。(2)根據長方形類創建一個對象。(3)通過調用對象的行為求出其周長和面積。步驟2 根據解題思路編寫代碼,如【例1-2】所示。【例1-2】 以面向對象程序設計思想編碼。/1-2.cpp#include /包含頭文件iostream.husing namespace std;/使用標準命名空間class Rectangle/定義長方形類public:Rectangle(float w=0,float l=0)width=w;len

5、gth=l;/定義構造函數,完成創建對象時的初始化工作,即為長和寬賦初值void GetArea()coutarea=width*length endl;/定義求面積方法void GetPerim()coutperimeter=2*(width+length)endl;/定義求周長方法private:float width,length; /外界不可訪問的私有成員;void main() Rectangle a(10,20);/定義長方形類的一個變量a,即實例化一個/特殊的長方形對象a,它的長是20,寬是10a.GetPerim();/調用a對象的兩個方法a.GetArea();任務二 創建簡

6、單的C+應用程序任務說明在本任務中我們來學習C+應用程序的結構、C+程序的開發過程以及C+開發環境Visual C+ 6.0的使用。預備知識一、認識C+程序二、C+程序的開發過程三、Visual C+ 6.0集成開發環境簡介四、Visual C+ 6.0的排錯與調試功能1一個C+程序一、認識C+程序#include /包含頭文件iostream.h#include /包含頭文件string.h,字符串using namespace std;/使用標準命名空間/=int main() string greeting=hello world!; /定義一個字符串對象變量,并賦初值couthello

7、 world!n; /在屏幕上輸出字符串“hello world!”并換行coutwelcome to C+!endl; /在屏幕上輸出“welcome to C+!”并換行coutgreetingendl; /在屏幕上輸出字符串變量greeting的內容并換行return 0;/程序結束2C+程序的構成(1)一個C+程序可以由一個或多個源程序單元構成,每個源程序單元可被看成一個文件。【例1-3】中的例子僅由一個源程序單元構成。(2)在一個源程序單元中,一般包括以下組成部分: 預處理命令。 全局聲明部分。 函數。3C+程序的書寫形式(1)C+的書寫格式比較自由,一行內可以寫幾個語句,一個語句也

8、可以寫在多行。(2)在程序中添加必要的注釋,也是成為一個優秀程序員所必需的。編譯系統在編譯代碼時會將注釋內容忽略。一般情況下,內容較少的簡單注釋用“/”,而跨行的注釋則用“/*/”。二、C+程序的開發過程1編寫程序2編譯程序3連接目標文件4運行程序 總體而言,C+程序的整個開發過程可用圖所示的流程圖表示。其中,實線表示操作流程,虛線表示文件的輸入/輸出。三、Visual C+ 6.0集成開發環境簡介 本書選用了使用較為廣泛的Visual C+ 6.0作為C+程序的開發環境,圖所示為Visual C+ 6.0的集成開發環境界面。四、Visual C+ 6.0的排錯與調試功能第一步 設置斷點第二步

9、 開始調試程序第三步 單步運行 單步調試程序時,可以在Variables窗口和Watch窗口中察看變量值的變化,這兩個窗口的作用如下: 在Variables窗口中會自動顯示當前運行程序中所有變量的值。隨著單步調試的進行,我們會看到變量i的值逐漸遞增。 如果本地變量比較多,Variables窗口就會比較混亂,此時可以直接在代碼中選中需要監控的變量,將其拖放到Watch列表,該變量的值會被顯示出來。任務實施創建并運行自己的第一個C+程序單擊此處添加備注 編寫和調試一個簡單的C+程序,以熟悉Visual C+ 6.0的程序編寫、編譯、連接和調試方法。實施步驟1創建源程序 步驟1 啟動Visual C

10、+ 6.0,打開“文件”下拉菜單,選擇“新建”菜單項,將打開如圖所示的“新建”對話框。步驟2 如圖1-14所示,選擇“文件”選項卡,在左側文件類型列表中選擇“C+ Source File”選項,表示創建一個C+源程序。/實訓1-1#include using namespace std;int main()coutWelcome to C+ World!n;coutMy Friend!endl;return 0;2編譯連接將代碼輸入編輯區后,需要對程序進行編譯連接,以發現源程序中是否存在錯誤。步驟1 執行“組建”“編譯實訓1-1.cpp”菜單命令,系統將顯示圖所示對話框,詢問是否在創建源文件的

11、目錄下建立一個活動工程和一個工作空間。步驟2 單擊“是”按鈕,將創建一個與C+源程序同名的工作區(對應文件為“實訓1-1.dsw”)和一個工程(對應文件為“實訓1-1.dsp”),系統開始編譯。編譯結束后,將在輸出窗口輸出編譯信息,如圖所示。步驟3 編譯信息顯示“實訓1-1.obj - 0 error(s), 0 warning(s)”,表示編譯程序時沒有錯誤和警告。為此,繼續執行“組建”“組建實訓1-1.exe”菜單命令,對生成的目標程序進行連接,以生成可執行程序,如圖所示。3調試運行編譯連接通過后,執行“組建”“執行實訓1-1.exe”菜單命令,或者直接按【Ctrl+F5】組合鍵,運行生成

12、的程序,將出現圖所示畫面。結果正確無誤,按任意鍵返回。至此,一個完整的C+程序從建立到運行就完成了。項目拓展熟悉Visual C+工作區與工程的使用C+程序唯有放入某個工作區和工程,才能被編譯和連接。為了便于讀者更好地使用Visual C+,我們首先對工作區、工程等概念進行一些簡要說明。(1)在Visual C+中,工作區用來管理工程,而工程用來管理C+源程序(*.cpp)、C+頭文件(*.h)、資源文件等。因此,如果我們開發的程序比較龐大的話,應首先創建工作區,然后創建工程,最后利用工程管理C+源程序、頭文件等。(2)我們既可以為在工作區新建工程,或者在工程中新建C+程序、頭文件,也可以將現

13、有工程添加到工作區中,或者將現有C+源程序、頭文件等添加到工程中。(3)Visual C+的編譯是針對工程中的C+程序的,而連接是針對工程的。通過選擇“組建”菜單中的“組建”,可以對工程中的程序統一進行編譯和連接。(4)每個工作區和工程都與某個文件夾相對應,并且工作區文件的擴展名為.dsw,工程文件的擴展名為.dsp。(5)創建工程時,如果系統尚未創建工作區,則系統會自動創建一個與工程同名的工作區,并以此名稱在指定文件夾中創建一個新文件夾,以存放相關文件。(6)要想編輯C+源程序或頭文件等,最好打開工作區文件,如此一來,我們可以直接對C+源程序、頭文件等進行修改、編譯和連接。(7)如果創建的工

14、程是一個Win32 Console Application(Win32控制臺應用程序),則必須在工程中的某個C+程序中包含main()函數,以設置應用程序的入口。此外,每個工程中只能有一個main()函數,否則,將無法連接目標文件。Thank you!項目二任務一 熟悉C+與C在基本控制上的一些區別任務二 學習有關函數方面的區別任務三 掌握C+中關于引用的靈活運用任務四 掌握C+中管理動態內存空間的方法由C到C+ 用法更靈活、功能更強大任務說明預備知識任務一 熟悉C+與C在基本控制上的一些區別 在本任務中我們來學習C+與C在基本控制上的一些區別,主要包括輸入/輸出的實現、強制數據類型轉換方式以

15、及新增了bool類型。一、用I/O流實現輸入/輸出二、新增強制類型轉換方式三、新增bool類型一、用I/O流實現輸入/輸出 cin是輸入流對象,cout是輸出流對象,它們是在編譯系統中的輸入/輸出流庫中定義的,定義后系統會在內存中開辟一段緩沖區,用來暫存輸入/輸出流的數據。使用它們時必須將頭文件“iostream.h”加入到本文件中,即在程序的開頭使用預處理命令“#include ”。(一)輸入語句輸入語句的一般格式為:cin表達式1表達式2表達式n; 在使用cin語句時,通過鍵盤輸入的數據應與變量定義的數據類型一致,并且輸入數據的個數應與變量的個數相同。輸入完數據后鍵入回車,流提取操作符“”

16、便從輸入流中提取出由空格、制表符和換行符間隔開的數據賦給相應的變量。(二)輸出語句輸出語句的一般格式為:cout表達式1表達式2表達式nendl; endl是C+中行結束符,只能用于輸出流中,其作用是在執行換行操作的同時,將緩沖區內已有的數據全部輸出,并清空緩沖區。(三)輸入/輸出的格式控制常用的輸入/輸出流格式控制符如表所示。二、新增強制類型轉換方式強制轉換數據類型的一般形式為:(類型名)變量 和 (類型名)(表達式)也可以寫成類型名(變量) 和 類型名(表達式) 例如,下面將變量a強制轉換成int型,將m與n的和強制轉換成double型,將8與3取余的結果強制轉換成char型。int(a)

17、double(m+n)char(8%3) 當進行強制數據類型轉換的對象是一個包含多項的表達式時,必須將表達式用括號括起。例如,將7/4的結果強制轉換成double型,應該寫成double(7/4) 此時由于7和4均為整型,故7/4的結果為整型1,強制轉換為雙精度型數據后,結果仍為1,而寫成(double)7/4 則表示將7的數據類型強制轉換為double型,再與4求商,結果是雙精度型數據1.75。三、新增bool類型 bool(布爾型,也稱邏輯型)只有兩個值,即整數0(表示邏輯假)和1(表示邏輯真)。在C+語言中還定義了這兩個布爾型常量所對應的符號常量false和true,false的值為0,

18、表示邏輯假,true的值為1,表示邏輯真。 由于邏輯值是整數0和1,所以它也能夠像其他整數一樣出現在表達式里,參與各種整數運算。【例2-3】 布爾常量應用示例。#include using namespace std; int main() cout布爾類型的符號常量true對應的邏輯值是:trueendl;cout布爾類型的符號常量false對應的邏輯值是:falseendl;return 0;程序運行結果如圖所示。任務實施輸出楊輝三角案例說明楊輝三角是一個由數字排列成的三角形數表,如圖所示。 它描述的是兩個未知數和的冪次方運算后的系數問題。例如,(xy)2x22xyy2,這樣系數就是1,2

19、,1,這就是楊輝三角的其中一行。依次下去,(xy)3、(xy)4等的運算結果的各項系數就構成了楊輝三角的其他各行。編寫程序,根據輸入的行數(小于14)輸出楊輝三角。案例分析楊輝三角每行的數字是有一定規律的:每一行數字的個數等于所在的行數,每行的第一個數字均為1,其后數字為:前面數字(數字所在行號(自1起)數字所在行中的序號(自0起)/數字所在行中的序號。為了使輸出的數字排列成如圖所示的金字塔形狀,需控制各行數字之間空格的個數。每行第一個數字之前空格的個數依次遞減2,兩個數字之間的空格個數有三種情況:如果輸出的數字是一個一位數,則在該數字后輸出3個空格;如果輸出的數字是一個兩位數,則在該數字后輸

20、出2個空格;如果輸出的數字是一個三位數,則在該數字后輸出1個空格。根據以上規律,我們可以利用循環嵌套結構逐行逐個輸出數字和空格。由于確定了行數,循環的次數也就跟著確定了,故我們使用的是for循環。實施步驟步驟1 在Visual C+中新建一個C+ 源文件,根據分析編寫代碼如下:#include void main() int n,r,c,m,j=0;coutm;while (m=14)/如果連續三次輸入的數字不符合要求,則退出程序 if (j=2) cout你的錯誤輸入已達3次,你無權再輸入!endl;return;cout你輸入的行數超出范圍,請重新輸入!endl;coutm;j+;/累計輸

21、入次數for (n=0;n=m-1;n+)/逐行輸出數字和空格 for(r=1;r15-n;r+)/*輸出第一個數字之前的空格,為了打印出金字塔形狀,要保證各行依次遞減2個空格*/cout ;c=1;/第一個數字總為1coutc ;/輸出第一個數字以及3個空格for(r=1;r=n;r+)/輸出各行的其他數字和空格 c=c*(n-r+1)/r;/計算應輸出數字if(c100)/根據數值大小確定數字后面的空格個數if(c10)coutc ;/一位數的后面輸出3個空格elsecoutc ;/兩位數的后面輸出2個空格elsecoutc ;/三位數的后面輸出1個空格coutendl;步驟2 經編譯、連

22、接后,程序運行結果如圖所示。任務二 學習有關函數方面的區別任務說明在本任務中,我們來學習C+語言與C語言在函數語法和使用方面的區別。預備知識一、局部變量隨用隨定義二、作用域限定符:擴大全局變量的可見范圍三、形式參數可帶有默認值四、內聯函數 在C+中,允許變量定義語句在程序中的任何地方,只要在是使用它之前就可以;而C語言中,必須要在函數開頭部分。另外,C+允許重復定義變量,C語言標準中是不允許的。通常情況下,如果全局變量與局部變量同名,局部變量在其作用域內具有較高的優先權,將會屏蔽全局變量。在C+中,可以通過作用域限定符“:”訪問被屏蔽的全局變量。二、作用域限定符:擴大全局變量的可見范圍一、局部

23、變量隨用隨定義【例2-4】 使用作用域限定符: 訪問被屏蔽的全局變量。#include using namespace std;int v1=80;int main() int v1=8; coutv1; coutn您輸入的v1值是v1endl;coutn全局變量v1的值是:v1endl;return 0;程序運行結果如圖所示。三、形式參數可帶有默認值通常情況下,在調用函數時要為函數的每個形參賦予一個相應的實參值。但有時在主調函數中沒有給出實參,或者多次調用同一函數使用同樣的實參時,給形參設置一個默認值,被調函數就可以按指定的默認值來執行。函數形參的默認值可以在函數原型的聲明中或函數定義中指定

24、。例如:float area(float r=2.5);指定r的默認值為2.5,在調用此函數時可以不必給出實參的值,即等價于調用area(2.5)。如果函數中有多個形參,可以為每個形參指定一個默認值,也可以只對部分形參指定默認值,指定默認值必須按照從右到左的順序進行。即為某個參數指定默認值時,其后的參數都必須指定默認值,否則已設默認值將被忽略。例如:void f1(double a,float b=2.5,int c=1);/正確void f2(double a,float b=2.5,int c);/*不正確。由于c未指定默認值,故b的默認值無效*/為函數中的形參設置了默認值后,實參的個數可

25、以與形參的個數不同。在進行函數調用時,實參與形參按照從左到右的順序進行匹配,沒有給出實參的,該形參就取指定的默認值。例如:int sum(int a,int b, int c=5,int d=6);在此函數原型中指定了形參c和d的默認值分別為5和6,若調用語句為:sum(3,2,1);則等價于執行語句:sum(3,2,1,6);四、內聯函數定義內聯函數的格式為:inline 函數類型 函數名(形參列表) 函數體 ;一般只將規模很小(一般為5個語句以下)且使用頻繁的函數聲明為內聯函數,并且內聯函數內不能包括循環語句和switch語句。【例2-6】 內聯函數應用示例。#include inline

26、 int sum(int x,int y,int z);/對函數sum原型的聲明,聲明為內聯函數void main() int a,b,c,s;coutabc;s=sum(a,b,c); /求三個數的和coutsum is sendl;int sum(int x,int y,int z)/定義內聯函數sum return x+y+z; 程序運行結果如圖所示。任務實施漢諾塔問題求解案例說明已知臺上有3根標號為A、B、C的柱子,在A柱子上放著若干個盤子,每一個都比下面的略小一些。現要把A柱子上的盤子全部移到C柱子上,要求是:一次只能移動一個盤子,移動過程中大盤子不能放在小盤子上面。編寫程序,輸入A

27、柱子上盤子的數量,輸出將盤子從A柱子移動到C柱子上時移動的步驟。案例分析漢諾塔問題是典型的遞歸調用問題。當n1時,直接將盤子從A移動到C即可。將n(n1)個盤子從A柱移動到C柱可以分為三個步驟: 將n-1個盤子借助C柱子移到B柱子; 將最后一個盤子從A柱子移到C柱子; 將n-1個盤子從B借助A移到C。計算移動次數的公式為2m-1,其中m是盤子總數。實施步驟步驟1 在Visual C+中新建一個C+ 源文件,根據分析編寫代碼如下:#includevoid move(char one,char anoth) /將一個柱子上的盤子移動到另一個柱子 coutone anothendl; void ha

28、noi(int n,char no1,char no2,char no3)/求解漢諾塔問題 if (n=1) move(no1,no3);/只有一個盤子時,從A移動到Celse hanoi(n-1,no1,no3,no2);/將n-1個盤子借助C從A移動到Bmove(no1,no3);/將最后一個盤子從A移動到Chanoi(n-1,no2,no1,no3);/將n-1個盤子借助A從B移動到Cint times(int n)/計算移動次數 int i,times=1;for(i=1;i=n;i+)times*=2;return times-1;void main() int m;coutm;co

29、ut當有m個盤子時,移動步驟依次為:endl;hanoi(m,A,B,C);cout移動次數為times(m)次endl;步驟2 經編譯、連接后,程序運行結果如圖所示。任務三 掌握C+中關于引用的靈活運用任務說明引用是C+對C的一個重要擴充,在本任務中我們就來學習引用。一、引用的概念及使用預備知識二、引用作為形式參數三、引用與指針的區別四、引用作為返回值一、引用的概念及使用引用是指為變量起一個別名,聲明引用型變量的一般形式為:數據類型 &引用名變量名;例如,假設有一個變量a,若給它起一個別名b,就可以這樣來聲明:int a;int &b=a;/聲明b是a的引用聲明引用時,b和a表示相同的變量,

30、它們具有相同的地址。換句話說,對b進行操作也就是對a進行操作。在聲明一個引用型變量時,必須同時對其進行初始化。以下語句是不合法的:int a;int &b;b=a;【例2-7】 引用的簡單應用。#include void main() int a=10;int &b=a;/聲明b是a的引用a=a*a;couta bendl;b=b/2;coutb aendl;程序運行結果如圖所示。二、引用作為形式參數在C語言中我們已經學了函數參數傳遞的兩種方式:值傳遞和地址傳遞。將引用作為函數的參數時,參數的傳遞方式為引用傳遞。引用傳遞實際上傳遞的是變量的地址,這種方式節省了大量存儲空間,從而能夠提高程序的執

31、行效率。下面我們通過【例2-8】來比較值傳遞、地址傳遞和引用傳遞這三種傳遞方式。【例2-8】 引用作為函數參數的應用示例。要求實現兩個整型數據的交換。#includevoid swap1(int x,int y)/參數的值傳遞 int temp;temp=x;x=y;y=temp;void swap2(int *x,int *y)/參數的地址傳遞 int temp;temp=*x;*x=*y;*y=temp;void swap3(int &x,int &y)/參數的引用傳遞 int temp;temp=x;x=y;y=temp;void main( ) int a,b;coutab;/輸入a、

32、b兩變量的值swap1(a,b);cout值傳遞的結果:a bendl;swap2(&a,&b);cout地址傳遞的結果:a bendl;swap3(a,b);cout引用傳遞的結果:a bendl;程序運行結果如圖所示。三、引用與指針的區別 引用是一個變量的別名,本身不單獨分配自己的內存空間,而指針有自己的內存空間。 引用訪問一個變量是直接訪問,而指針是間接訪問。 引用在開始的時候就綁定到了一個內存空間,所以開始必須賦初值,而指針可以先定義后賦值。【例2-9】 引用與指針對比應用示例。#includevoid main( ) int i = 3,j = 4; couti=ij=jendl;i

33、nt &x = i;/定義引用couti=i;j=j;x=xendl;couti的地址&i;j的地址&j;x的地址&xendl;x = j;couti=i;j=j;x=xendl;couti的地址&i;j的地址&j;x的地址&xendl;程序運行結果如圖所示。int *y;/定義指針couty的地址¥dl;y = &j;couti=i;j=j;y=yendl;couti的地址&i;j的地址&j;y的地址¥dl;四、引用作為返回值以引用返回函數值時,定義函數時需要在函數名前加&,定義函數的格式一般如下:類型標識符 &函數名(形參列表及類型說明)函數體1通過引用返回函數值的最大好處是,

34、在內存中不產生被返回值的副本。【例2-10】 定義兩個函數:一個以變量方式返回函數值,一個以引用方式返回函數值。#includefloat temp;/定義全局變量tempfloat fn1(float r);/聲明函數fn1float &fn2(float r);/聲明函數fn2float fn1(float r)/定義函數fn1,以返回值的方法返回函數值 temp=r*r*3.14; return temp;float &fn2(float r)/定義函數fn2,以引用方式返回函數值 temp=r*r*3.14; return temp;void main()/主函數 float a=fn

35、1(10.0); float b=fn2(10.0); coutaendlbendl;程序運行結果如圖所示。從上圖中我們可以看出,兩種方式的運行結果是相同的,但是它們在內存中的活動情況卻是不相同的,下面我們對照圖示進行說明。函數fn1()是一般的函數返回值方式:返回全局變量temp值時,C+創建臨時變量并將temp的值314復制給該臨時變量,返回到主函數后,賦值語句a=fnl(10.0)把臨時變量的值314復制給a,其內存情況如圖所示。函數fn2()以引用方式返回返回值,不產生副本,所以,直接將變量temp返回給主函數,這樣避免了臨時變量的產生。這種方式提高了程序執行效率和空間利用率,其內存情

36、況如圖所示。2返回引用的函數可以作為左值。下面我們通過一個案例來了解這種使用方法。【例2-11】 將返回引用的函數值作為賦值表達式的左值。#include int &put(int n);int vals10;int error=-1;void main() put(0)=10; /以put(0)函數值作為左值,等價于vals0=10; put(9)=20; /以put(9)函數值作為左值,等價于vals9=20; coutvals0endl; coutvals9=0 & n=9 ) return valsn; else coutsubscript error; return error; 程

37、序運行結果如圖所示。引用作為返回值時,要注意以下兩點:(1)不能返回局部變量的引用(2)不能返回函數內部new分配的內存的引用案例說明任務實施通過引用操作數組創建兩個數組,輸入數組元素后將數組值輸出,然后將兩數組合并為一個數組并輸出。實施步驟步驟1 在Visual C+中新建一個C+ 源文件,編寫代碼如下:#include#include#include#define LIST_INIT_SIZE 100/ 數組初始化元素個數#define LISTINCREMENT 10/ 數組元素個數遞增長度#define Status int#define ElemType int#define OK

38、1#define ERROR 0#define OVERFLOW -2typedef struct ElemType *elem;int length;/ 數組中實際存放的元素個數int listsize;/ 數組長度,可容納的最大元素個數 SqList ;Status InitList_Sq(SqList &L) / 構造一個空的數組L L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType); if (!L.elem) return ERROR;/ 存儲分配失敗 L.length = 0;/ 數組實際長度為0 L.listsiz

39、e = LIST_INIT_SIZE;/ 初始存儲容量 return OK;Status InputList_Sq(SqList &L) / 向數組L中輸入n個元素 int i; printf(nInput %d numbers:,L.length); for(i=0;iL.length;i+) scanf(%d,&L.elemi); printf(nInput Success!:); return OK;Status OutputList_Sq(SqList L) / 輸出數組L中的所有元素 int i; printf(nThere Are %d numbers :, L.length);

40、for(i=0;i L.length;i+) printf(%d , L.elemi); printf(nOutput Success!:); return OK;void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) / 歸并La和Lb得到新的順序線性表Lc ElemType *pa,*pb,*pc,*pa_last,*pb_last; pa = La.elem; pb = Lb.elem; Lc.listsize = Lc.length = La.length+Lb.length; pc = Lc.elem = (ElemType *)mal

41、loc(Lc.listsize*sizeof(ElemType); if (!Lc.elem) exit(OVERFLOW);/ 存儲分配失敗 pa_last = La.elem+La.length-1; pb_last = Lb.elem+Lb.length-1; while (pa = pa_last & pb = pb_last) / 歸并 if (*pa = *pb) *pc+ = *pa+; else *pc+ = *pb+; while (pa = pa_last) *pc+ = *pa+;/ 插入La的剩余元素 while (pb = pb_last) *pc+ = *pb+;/

42、 插入Lb的剩余元素 void main()/ 主函數 SqList La,Lb,Lc; InitList_Sq(La); InitList_Sq(Lb); InitList_Sq(Lc);La.length=5;Lb.length=4;printf(nInput array A); InputList_Sq(La); / 輸入數組La OutputList_Sq(La); printf(nInput array B); InputList_Sq(Lb); / 輸入數組Lb OutputList_Sq(Lb); MergeList_Sq(La,Lb,Lc); / 將數組La與Lb合并 prin

43、tf(nC=merge(A,B):); OutputList_Sq(Lc);步驟2 經編譯、連接后,程序運行結果如圖所示。任務四 掌握C+中管理動態內存空間的方法任務說明在本任務中我們來學習使用C+應用程序的結構、C+程序的開發過程、C+開發環境Visual C+ 6.0的使用。預備知識在C+語言中,new和delete可用來實現動態內存空間的管理。一、用new申請動態內存空間二、用delete釋放動態內存空間new運算符的操作數是一個數據類型,其作用是為變量分配內存空間,并返回指向該變量的指針。new運算符使用的一般格式為:一、用new申請動態內存空間指針變量new 數據類型 (初值)其中,

44、初值也可以不給出。例如:int *p;/定義了一個指向整型變量的指針p=new int(5);/*為一個整型變量分配內存空間,p指向該變量的首地址,將該整型變量初始化為5*/new運算符還可以為多個變量分配存儲空間。例如:int *p;/定義了一個指向整型變量的指針p=new int 8;/*為8個整型變量分配內存空間,p指向第一個整型變量的首地址*/for(int i=0;i8;i+)/為p指向的8個整型變量賦值pi=i;二、用delete釋放動態內存空間當new分配的空間使用完之后,必須用delete運算符釋放這些空間。delete運算符的一般格式為:delete 指針變量其中,指針變量是

45、指用new運算符申請分配的內存地址。當用delete釋放為多個變量分配的地址時,其格式為:delete 指針變量其中中不需要填寫變量的個數。例如:int *p=new int a8;delete p;任務實施new、delete的基本使用方法案例說明在本任務中,我們使用new和delete操作符對內存進行一些基本操作。實施步驟步驟1 在Visual C+中新建一個C+ 源文件,編寫代碼如下:#include using namespace std;int main ( ) /基本數據類型 int *i = new int; /沒有初始值 int *j = new int(100); /初始值為

46、100 float *f = new float(3.1415f); /初始值為3.1415 cout i = *i endl; cout j = *j endl; cout f = *f endl; /數組 int *iArr = new int3;for (int k=0; k3; k+) iArrk = (k+1)*10; cout k : iArrk endl; /釋放內存 delete i; delete j; delete f; delete iArr;/釋放數組空間 return 0;步驟2 編譯、連接程序,程序運行結果如圖所示。Thank you!項目三任務一 初識類與對象任務

47、二 深入學習類與對象的相關知識類與對象 抽象與實體的完美結合任務說明預備知識任務一 初識類與對象類(Class)是具有相同屬性和行為的一組對象的集合,是對屬于該類的全部對象的統一抽象描述。類是面向對象中最為重要的概念之一,利用類可以實現數據的封裝、隱藏、繼承和派生,C+中許多復雜的程序都是用類來實現的。使用類時,用戶不需要了解類的具體實現,只需要通過外部接口,以特定的訪問權限來使用類的成員即可。一、類的聲明及類成員的訪問二、類成員函數的定義三、對象成員的定義與引用四、構造函數與析構函數一、類的聲明及類成員的訪問類也是一種數據類型,與結構體類型不同的是,類中除了包含數據以外,還包含對這些數據操作

48、的函數,它將數據和操作封裝在一起。聲明類的一般形式為:class 類名public:公有數據成員;公有成員函數;private:私有數據成員;私有成員函數;protected:保護數據成員;保護成員函數;9; 二、類成員函數的定義C+中,類成員的訪問屬性有以下三種:(1)public(公有的)公有的成員用public來聲明,這類成員既可以被本類中的成員函數引用,也可以被任何外部函數引用。它是類與外界的接口。(2)private(私有的)私有的成員用private來聲明,這類成員只能被本類中的成員函數所引用。(3)protected(保護的)受保護的成員用protected來聲明,這類成員只能被

49、本類及本類的派生類中成員函數引用(本書將在項目四中詳細講述類的繼承與派生)。三、對象成員的定義與引用在類的聲明中聲明了類的數據成員和成員函數的原型之后,還要通過對類的成員函數進行定義來實現成員函數的功能,即成員函數的實現。成員函數的定義方法有以下3種。(1)在類內直接定義成員函數C+中可以直接將成員函數定義在類的內部。(2)在類外定義成員函數在類外定義成員函數的一般形式為:返回類型 類名:成員函數名(參數列表)函數體 “:”為作用域限定符,用來標識該成員函數所屬的類。(3)在類外定義成內聯函數在類外定義成內聯函數的一般形式為:inline 返回類型 類名:成員函數名(參數列表)函數體 【例3-

50、1】 聲明一個時鐘類,定義該類中的幾個成員函數。#includeclass Clock/定義時鐘類Clock public:/公有成員void SetTime(int h=0,int m=0,int s=0);/成員函數void ShowTime()/在類內定義成員函數ShowTime()couthour:minute:secondendl;private:/私有成員int hour,minute,second; ; /數據成員void Clock:SetTime(int h,int m,int s)/在類外定義成員函數SetTime() hour=h;minute=m;second=s;vo

51、id main()/主函數 Clock myClock;/定義對象myClockcoutfirst time set and output:endl;myClock.SetTime();/調用成員函數myClock.ShowTime();coutsecond time set and output:endl;myClock.SetTime(8,30,45);myClock.ShowTime();程序運行結果如圖所示。四、構造函數與析構函數(一)構造函數1構造函數概述構造函數是一種特殊的成員函數,它的主要功能是為對象分配存儲空間,以及為類的成員變量賦初值。構造函數可以在類中定義,也可以在類中聲明

52、、在類外定義。定義構造函數的一般形式為:類名: 構造函數名(參數列表) 函數體 構造函數名必須與類名相同,構造函數可以有任意類型的參數,但不能有任何返回值和返回類型。構造函數不需要用戶來調用,而是在創建對象時自動被調用,且只調用一次。如果是在類中定義,則省略類名和作用域限定符。如果在定義類時沒有定義任何構造函數,編譯系統會自動為這個類生成一個默認的構造函數。這個默認的構造函數沒有參數且函數體是空的,它不執行任何初始化操作。【例3-2】 定義一個復數類的構造函數。#include class Complex/類Complex的聲明public:/定義共有成員Complex()/在類內定義構造函數

53、 cout不帶參數的構造函數被調用!endl;real=0;imag=0; void show()/定義成員函數 cout(real,imag); private:/定義私有成員double real,imag;void main() Complex com;/創建一個對象com.show();/調用成員函數show 程序運行結果如圖所示。2帶參數的構造函數對于不帶參數的構造函數,當定義該類的對象時,所有對象都具有相同的初值。但在實際應用中,用戶往往希望對不同的對象賦予不同的初值,這時就需要使用帶參數的構造函數。定義對象的一般形式為:類名 對象名(實參1,實參2,實參n)【例3-3】 在【例3

54、-2】基礎上添加帶參數的構造函數。#include class Complex/類的聲明 public:/定義公有成員Complex();/聲明無參數的構造函數Complex(double,double);/聲明帶參數的構造函數void show()/定義公有成員函數cout(real,imag)endl;private:/定義私有成員double real,imag;Complex:Complex() /定義無參數的構造函數 cout不帶參數的構造函數被調用!endl;real=0;imag=0; Complex:Complex(double r,double i)/定義帶參數的構造函數co

55、ut帶參數的構造函數被調用!endl;real=r;imag=i;void main() Complex com;/定義對象com,調用無參數的構造函數com.show();/調用對象的公有成員函數Complex com1(3,4);/定義對象com1,調用帶參數的構造函數com1.show();/調用對象的公有成員函數Complex com2(1,2);/定義對象com2,調用帶參數的構造函數com2.show();/調用對象的公有成員函數 程序運行結果如圖所示。3帶默認參數的構造函數當構造函數帶有參數時,可以通過實參將值傳遞給形參,也可以為構造函數的參數指定默認值。如果用戶在定義對象時沒有

56、指定實參值,編譯系統就使用默認參數值來初始化數據成員。【例3-4】 帶默認參數的構造函數應用示例。#include class Complex/類的聲明 public:/定義公有成員Complex(double=0.0,double=0.0);/聲明帶默認參數的構造函數void show()/定義公有成員函數cout(real,imag)endl;private:/定義私有成員double real,imag;Complex:Complex(double r,double i)/定義帶參數的構造函數 cout帶默認參數的構造函數被調用!endl;real=r;imag=i; void main

57、() Complex com;/定義對象com,調用帶默認參數的構造函數com.show();/調用對象的公有成員函數Complex com1(3); /定義對象com1,調用帶參數的構造函數com1.show();/調用對象的公有成員函數Complex com2(1,2);/定義對象com2,調用帶參數的構造函數com2.show();/調用對象的公有成員函數程序運行結果如圖所示。4帶參數初始化表的構造函數構造函數除了可以在函數體中使用賦值語句實現對數據成員的初始化,還可以通過參數初始化表來實現。帶參數初始化表的構造函數的一般形式為:類名:構造函數名(參數列表):參數初始化表 函數體 其中,

58、參數初始化表的一般形式為:參數名1(初值1), 參數名2(初值2), , 參數名n(初值n)【例3-5】 帶參數初始化表的構造函數應用示例。#include class Complex/類的聲明public:/定義公有成員Complex();/聲明不帶參數的構造函數Complex(double r,double i);/聲明帶參數的構造函數void show()/定義公有成員函數cout(real,imag)endl;private:/定義私有成員double real,imag;Complex:Complex():real(0),imag(0)/定義帶參數初始化表的構造函數 cout帶參數初

59、始化表的構造函數被調用!endl; Complex:Complex(double r,double i):real(r),imag(i)/定義帶參數初始化表的構造函數 cout帶參數初始化表的構造函數被調用!endl; void main() Complex com;/定義對象com,調用無參數的構造函數com.show();/調用對象的公有成員函數Complex com1(1,2);/定義對象com1,調用帶參數的構造函數com1.show();/調用對象的公有成員函數 程序運行結果如圖所示。5構造函數的重載在一個類中可以定義多個構造函數,這些構造函數的名字相同,而參數的個數或參數的類型不同

60、,程序將根據參數自動調用該類中對應的構造函數,從而對對象使用不同的初始化方法,增加程序設計的靈活性。這就是構造函數的重載。【例3-6】 重載構造函數應用示例。#include class Complex/類的聲明 public:/定義公有成員Complex();/聲明不帶參數的構造函數Complex(int,int);/聲明帶參數的構造函數Complex(double,double);/構造函數的重載void show()/公有成員函數 cout(real,imag)endl; private:/定義私有成員double real,imag;Complex:Complex()/定義不帶參數的構

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論