面向?qū)ο蟪绦蛟O(shè)計(jì)C++教學(xué)課件匯總完整版電子教案全書課件(最新)_第1頁
面向?qū)ο蟪绦蛟O(shè)計(jì)C++教學(xué)課件匯總完整版電子教案全書課件(最新)_第2頁
面向?qū)ο蟪绦蛟O(shè)計(jì)C++教學(xué)課件匯總完整版電子教案全書課件(最新)_第3頁
面向?qū)ο蟪绦蛟O(shè)計(jì)C++教學(xué)課件匯總完整版電子教案全書課件(最新)_第4頁
面向?qū)ο蟪绦蛟O(shè)計(jì)C++教學(xué)課件匯總完整版電子教案全書課件(最新)_第5頁
已閱讀5頁,還剩865頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、面向?qū)ο蟪绦蛟O(shè)計(jì)C+面向?qū)ο蟪绦蛟O(shè)計(jì)C+C+C對C語言功能的增強(qiáng)增加了面對對象的機(jī)制程序設(shè)計(jì)方法面對對象程序設(shè)計(jì)面向過程程序設(shè)計(jì)目錄1234面向?qū)ο蟪绦蛟O(shè)計(jì)概述5C+基礎(chǔ)知識類和對象繼承與組合多態(tài)性與虛函數(shù)目錄6789面向?qū)ο蟮耐讌f(xié)10運(yùn)算符重載模板輸入輸出流異常處理本課程學(xué)習(xí)目標(biāo)理解面向?qū)ο缶幊痰幕舅枷胝莆彰嫦驅(qū)ο缶幊痰幕痉椒ㄕ莆誄+面向?qū)ο缶幊碳夹g(shù),學(xué)會(huì)利用C+語言進(jìn)行一般面向?qū)ο蟪绦虻脑O(shè)計(jì),解決一般應(yīng)用問題,并為后續(xù)專業(yè)課程(VC、Java)的學(xué)習(xí)奠定程序設(shè)計(jì)基礎(chǔ)。學(xué)習(xí)方法: 1.抓好三個(gè)環(huán)節(jié):課前、課上、課后 2.多編程、多上機(jī):課堂紀(jì)律:面向?qū)ο蟪绦蛟O(shè)計(jì)C+第1章 面向?qū)ο蟪绦蛟O(shè)

2、計(jì)概述本章從一個(gè)小型的學(xué)生信息管理系統(tǒng)的面向過程程序設(shè)計(jì)出發(fā),討論了傳統(tǒng)的面向過程程序設(shè)計(jì)方法的不足,進(jìn)而引出面向?qū)ο蟪绦蛟O(shè)計(jì)方法,介紹面向?qū)ο蟪绦蛟O(shè)計(jì)的編程思想,面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念,面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn)。最后簡單介紹面向?qū)ο蟮能浖_發(fā)。本章內(nèi)容簡介第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述本章學(xué)習(xí)目標(biāo)1. 了解傳統(tǒng)的面向過程程序設(shè)計(jì)方法的不足2. 理解面向?qū)ο蟪绦蛟O(shè)計(jì)的編程思想3. 理解并掌握面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念4. 領(lǐng)會(huì)面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn)5. 了解面向?qū)ο蟮能浖_發(fā)過程第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向過程程序設(shè)計(jì)的基本思想: 功能分解、逐步求精、模塊化、結(jié)構(gòu)化。 1.1 面向過程程序

3、設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述【例1-1】運(yùn)用面向過程程序設(shè)計(jì)方法設(shè)計(jì)一個(gè)小型的學(xué)生信息管理系統(tǒng)。該系統(tǒng)要管理的學(xué)生信息包括:學(xué)號(Num)、姓名(Name) 、性別(Sex) 、出生日期(Birthday) 、三門課成績英語(English) 、數(shù)據(jù)結(jié)構(gòu)(DataStructure) 、C+程序設(shè)計(jì)(CPlusPlus) 、總成績(Sum) 、平均成績(Average) ,學(xué)生信息表如表1-1所示。1.1 面向過程程序設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述學(xué)號姓名性別出生日期英語成績數(shù)據(jù)結(jié)構(gòu)成績C+成績總成績平均成績20070202001鄧光輝男89-02-0587889026588.32007

4、0202002杜麗麗女90-09-2079807523478.020070202003姜志遠(yuǎn)男90-11-0868847022274.020070202004張大偉男88-08-0570678221973.0表1-1 學(xué)生信息表 第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述該學(xué)生信息管理系統(tǒng)要具有如下功能:(1)顯示學(xué)生信息:顯示全部學(xué)生的信息。(2)查詢學(xué)生信息:按學(xué)號或姓名查詢學(xué)生信息, 查詢結(jié)果直接顯示在屏幕上。(3)添加學(xué)生信息:對學(xué)生信息進(jìn)行添加。(4)修改學(xué)生信息:按學(xué)號修改學(xué)生信息。1.1 面向過程程序設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述該學(xué)生信息管理系統(tǒng)要具有如下功能:(5)刪除學(xué)生信息:按學(xué)號刪

5、除學(xué)生信息。(6)統(tǒng)計(jì)學(xué)生成績:統(tǒng)計(jì)每個(gè)學(xué)生的總成績和平均成績,或統(tǒng)計(jì)所有學(xué)生某一門課的總成績和平均成績。(7)學(xué)生信息排序:按學(xué)號、總成績或某一門課成績排序。(8)備份學(xué)生信息:把所有學(xué)生信息備份一份。1.1 面向過程程序設(shè)計(jì)實(shí)現(xiàn)該系統(tǒng)的C程序框架/*學(xué)生信息管理系統(tǒng)C語言源代碼student.c*/#include /*包含輸入/輸出頭文件*/#include /*包含字符串處理頭文件*/typedef struct /*用于存放生日信息的結(jié)構(gòu)體*/ int year; int month; int day;Date;實(shí)現(xiàn)該系統(tǒng)的C程序框架typedef struct /*用于存放學(xué)生信息

6、的結(jié)構(gòu)體*/ char Num15; char Name10; char Sex; float English; /*英語課成績*/ float DataStructure; /*數(shù)據(jù)結(jié)構(gòu)課成績*/ float CPlusPlus; /*C+課成績*/ float Sum, Average; /*總成績、平均成績*/Student; 實(shí)現(xiàn)該系統(tǒng)的C程序框架/*用于存放讀入內(nèi)存中的所有學(xué)生信息的全局?jǐn)?shù)組*/Student stud100; int count=0; /*存放實(shí)際學(xué)生人數(shù)的全局變量*/ /*各自定義函數(shù)原型聲明*/void ReadData(); /*讀取學(xué)生信息到全局?jǐn)?shù)組stud

7、中*/void Display(); /*顯示學(xué)生信息*/void Search(); /*查詢學(xué)生信息*/void SearchNum(); /*按學(xué)號查詢學(xué)生信息*/void SearchName(); /*按姓名查詢學(xué)生信息*/void BackupData(); /*備份學(xué)生信息*/實(shí)現(xiàn)該系統(tǒng)的C程序框架void main() /*系統(tǒng)功能以菜單的形式提供給用戶*/ char choice; ReadData(); for( ; ; ) /*顯示系統(tǒng)功能菜單*/ printf(* 學(xué)生信息管理系統(tǒng) *n); printf(*n); printf(“* 1顯示學(xué)生信息 *n); prin

8、tf(* 2查詢學(xué)生信息 *n); 實(shí)現(xiàn)該系統(tǒng)的C程序框架printf(* 8備份學(xué)生信息 *n);printf(“* 0退出系統(tǒng) *n);printf(*n);printf( 請選擇要執(zhí)行的操作(08):_ n);scanf(%c, &choice);switch(choice) case 1: Display();break; case 2: Search();break; case 0: return; default: printf(選擇錯(cuò)誤!請重新選擇。n); /*switch結(jié)束*/實(shí)現(xiàn)該系統(tǒng)的C程序框架 /*for結(jié)束*/*main函數(shù)結(jié)束*/*各自定義函數(shù)實(shí)現(xiàn)代碼*/void

9、ReadData()void Display()void Search() 第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述從上述學(xué)生信息管理系統(tǒng)的C程序框架可以看出,運(yùn)用面向過程程序設(shè)計(jì)方法所設(shè)計(jì)出來的程序,數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)是分離的。所有數(shù)據(jù)都是公用的,一個(gè)函數(shù)可以使用任何一組數(shù)據(jù),而一組數(shù)據(jù)又能被多個(gè)函數(shù)所使用。用面向過程程序設(shè)計(jì)方法所設(shè)計(jì)出來的程序模型如圖1-1所示。1.1 面向過程程序設(shè)計(jì)圖1-1 面向過程程序設(shè)計(jì)的程序模型第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向過程的結(jié)構(gòu)化程序設(shè)計(jì)在20世紀(jì)60年代末、70年代初從一定程度上緩解了當(dāng)時(shí)的“軟件危機(jī)”,它在處理較小規(guī)模的程序時(shí)比較有效。但是,隨著人們對大規(guī)模軟

10、件需求的增長,面向過程的結(jié)構(gòu)化程序設(shè)計(jì)逐漸顯示出它的不足,具體表現(xiàn)在:1.1 面向過程程序設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向過程的結(jié)構(gòu)化程序設(shè)計(jì)的不足:1程序設(shè)計(jì)困難,生產(chǎn)率低下2數(shù)據(jù)不安全3程序修改困難4代碼重用程度低1.1 面向過程程序設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述圖1-1 面向過程程序設(shè)計(jì)的程序模型圖1-2 面向?qū)ο蟪绦蛟O(shè)計(jì)的程序模型 第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述要使某一個(gè)對象實(shí)現(xiàn)某一個(gè)行為,應(yīng)當(dāng)向它傳遞相應(yīng)的消息。數(shù)據(jù)成員函數(shù)成員函數(shù)數(shù)據(jù)成員函數(shù)成員函數(shù)數(shù)據(jù)成員函數(shù)成員函數(shù)對象對象對象消息消息消息第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述 在面向過程的結(jié)構(gòu)化程序設(shè)計(jì)中,人們常使用這樣的公式來表述

11、程序: 程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu) 而面向?qū)ο蟪绦蛟O(shè)計(jì)則把算法和數(shù)據(jù)結(jié)構(gòu)封裝在對象中。在面向?qū)ο蟪绦蛟O(shè)計(jì),我們可以這樣來表述程序: 程序 =(對象 + 對象 + 對象 + )+ 消息 或 程序 = 對象s + 消息 對象 = 算法 + 數(shù)據(jù)結(jié)構(gòu)圖1-2 面向?qū)ο蟪绦蛟O(shè)計(jì)的程序模型 第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述數(shù)據(jù)函數(shù)函數(shù)數(shù)據(jù)函數(shù)函數(shù)數(shù)據(jù)函數(shù)函數(shù)對象對象對象消息消息消息屬性行為行為實(shí)體第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?1對象 可以從兩個(gè)角度來理解對象。一個(gè)角度是現(xiàn)實(shí)世界,另一個(gè)角度是我們所建立的軟件系統(tǒng)。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?1對

12、象現(xiàn)實(shí)世界中客觀存在的任何一個(gè)事物都可以看成一個(gè)對象(object)。或者說,現(xiàn)實(shí)世界是由千千萬萬個(gè)對象組成的。對象可以是有形的,如汽車、房屋、張三等,也可以是無形的,如社會(huì)生活中的一種邏輯結(jié)構(gòu):學(xué)校、軍隊(duì),甚至一篇文章、一個(gè)圖形、一項(xiàng)計(jì)劃等都可視作對象。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?1對象對象可大可小。例如學(xué)校是一個(gè)對象,一個(gè)班級也是一個(gè)對象,一個(gè)學(xué)生也是一個(gè)對象。同樣,軍隊(duì)中的一個(gè)師,一個(gè)團(tuán),一個(gè)連,一個(gè)班都是對象。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?1對象任何一個(gè)對象都具有兩個(gè)要素:屬性和行為屬性:用于描述客觀事物的靜態(tài)特征行為:用于

13、描述事物的動(dòng)態(tài)特征。例如,一個(gè)人是一個(gè)對象,他有姓名、性別、身高、體重等屬性,有走路、講話、打手勢、學(xué)習(xí)和工作等行為。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?1對象在一個(gè)系統(tǒng)中的多個(gè)對象之間通過一定的渠道相互聯(lián)系,如圖1-2所示。圖1-2 面向?qū)ο蟪绦蛟O(shè)計(jì)的程序模型 第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述要使某一個(gè)對象實(shí)現(xiàn)某一個(gè)行為,應(yīng)當(dāng)向它傳遞相應(yīng)的消息。數(shù)據(jù)成員函數(shù)成員函數(shù)數(shù)據(jù)成員函數(shù)成員函數(shù)數(shù)據(jù)成員函數(shù)成員函數(shù)對象對象對象消息消息消息第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?1對象在面向?qū)ο蟮能浖治鱿到y(tǒng)中,對象是用來描述客觀事物的一個(gè)相對獨(dú)立體,是構(gòu)成系統(tǒng)的

14、一個(gè)基本單位。一個(gè)對象由一組屬性和對這組屬性進(jìn)行操縱的一組操作組成。屬性是用來描述對象靜態(tài)特征的一個(gè)數(shù)據(jù)項(xiàng),操作是用來描述對象行為的一個(gè)動(dòng)作序列。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?1對象在開發(fā)軟件系統(tǒng)時(shí),首先要對現(xiàn)實(shí)世界中的對象進(jìn)行分析和歸納,以此為基礎(chǔ)來定義軟件系統(tǒng)中的對象。軟件系統(tǒng)中的一部分對象是對現(xiàn)實(shí)世界中的對象的抽象,但其內(nèi)容不是全盤照搬,這些對象只包含與所解決的現(xiàn)實(shí)問題有關(guān)的那些內(nèi)容;系統(tǒng)中的另一部分對象是為了構(gòu)建系統(tǒng)而設(shè)立的。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?2類類是對客觀世界中具有相同屬性和行為的一組對象的抽象,它為屬于該類的全

15、部對象提供了統(tǒng)一的抽象描述,其內(nèi)容包括屬性和操作。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?2類在尋找類時(shí),要用到一個(gè)概念:抽象。所謂抽象,是指忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共性的事物劃分為一類,得出一個(gè)抽象的概念。例如,人可以作為一個(gè)類,它是世界上所有實(shí)體人如張三、李四、王五等的抽象,而實(shí)體人張三、李四、王五等則是人這個(gè)類的具體實(shí)例。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?2類類和對象的關(guān)系可表述為: 類是對象的抽象,而對象則是類的實(shí)例,或者說是類的具體表現(xiàn)形式。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2

16、 面向?qū)ο蟮幕靖拍?3封裝在面向?qū)ο蠓椒ㄖ?,所謂“封裝”,指兩方面的含義:一是用對象把屬性和操縱這些屬性的操作包裝起來,形成一個(gè)基本單位,各個(gè)對象之間相對獨(dú)立,互不干擾。二是將對象中某些部分對外隱蔽,即隱藏其內(nèi)部細(xì)節(jié),只留下少量接口,以便與外界聯(lián)系,接收外界的消息。這種對外界隱蔽的做法稱為信息隱蔽(information hiding)。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?4繼承所謂“繼承”,是指特殊類自動(dòng)地?fù)碛谢螂[含地復(fù)制其一般類的全部屬性與操作。繼承具有“是一種”的含義。 汽車卡車轎車圖1-3 繼承示例 一般類(也稱為基類、父類)特殊類(也稱為派生類、子類)第1章

17、 面向?qū)ο蟪绦蛟O(shè)計(jì)概述圖1-4 繼承的層次與抽象原則的運(yùn)用汽車卡車轎車火車車輛輪船飛機(jī)運(yùn)輸工具 較多地忽 略事物之 間的差別, 得到較一 般的類 較多地注 意事物之 間的差別, 得到較特 殊的類第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述有時(shí)一個(gè)類要同時(shí)繼承兩個(gè)或兩個(gè)以上一般類中的屬性和操作,把這種允許一個(gè)特殊類具有一個(gè)以上一般類的繼承模式稱作多繼承。圖1-5 多重繼承示例 銷售經(jīng)理管理人員兼職技術(shù)人員銷售人員雇員第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?5消息在面向?qū)ο蠓椒ㄖ?,把向?qū)ο蟀l(fā)出的操作請求稱為消息(message)。對象之間通過消息進(jìn)行通信,實(shí)現(xiàn)了對象

18、之間的動(dòng)態(tài)聯(lián)系。至于消息的具體用途,它們有很多種,例如,讀取或設(shè)置對象本身的某個(gè)(些)屬性的值,請求其他對象的操作。在C+中,消息其實(shí)就是函數(shù)調(diào)用。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?6關(guān)聯(lián)關(guān)聯(lián)(association)是兩個(gè)或多個(gè)類之間的一種靜態(tài)關(guān)系。教師指導(dǎo)畢業(yè)論文學(xué)生1圖1-6 關(guān)聯(lián)示例 第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?7組合組合描述的是類與類之間的整體與部分的關(guān)系。例如,汽車與發(fā)動(dòng)機(jī)之間的關(guān)系,計(jì)算機(jī)與主板間的關(guān)系。組合是具有“整體部分”關(guān)系語義的關(guān)聯(lián),也就是說,組合是關(guān)聯(lián)的一種,只是它還具有明顯的“整體部分”含義。第1章 面向?qū)ο蟪?/p>

19、序設(shè)計(jì)概述1.2.2 面向?qū)ο蟮幕靖拍?8多態(tài)性如果有幾個(gè)相似而不完全相同的對象,有時(shí)人們要求在向它們發(fā)出同一個(gè)消息時(shí),它們的反應(yīng)各不相同,分別執(zhí)行不同的操作,這種情況就是多態(tài)現(xiàn)象。在面向?qū)ο蠓椒ㄖ?,所謂多態(tài)性(polymorphism)是指由繼承而產(chǎn)生的相關(guān)而不同的類,其對象對同一消息會(huì)作出不同的響應(yīng)。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)重要特征,使用它能增加程序的靈活性。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.1 面向?qū)ο蟮木幊趟枷?具體地講,面向?qū)ο缶幊痰幕舅枷肴缦拢?1. 客觀世界中的事物都是對象(object),對象之間存在一定的關(guān)系。 2用對象的屬性(attribute)描述事物的靜態(tài)特

20、征,用對象的操作(operation)描述事物的行為(動(dòng)態(tài)特征)。1.2 面向?qū)ο蟪绦蛟O(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.1 面向?qū)ο蟮木幊趟枷?3對象的屬性和操作結(jié)合為一體,形成一個(gè)相對獨(dú)立、不可分的實(shí)體。對象對外屏蔽其內(nèi)部細(xì)節(jié),只留下少量接口,以便與外界聯(lián)系。4通過抽象對對象進(jìn)行分類,把具有相同屬性和相同操作的對象歸為一類,類是這些對象的抽象描述,每個(gè)對象是其所屬類的一個(gè)實(shí)例。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.1 面向?qū)ο蟮木幊趟枷?復(fù)雜的對象可以用簡單的對象作為其構(gòu)成部分。6通過在不同程度上運(yùn)用抽象的原則,可以得到一般類和特殊類。特殊類繼承一般類的屬性與操作,從而簡化系統(tǒng)的構(gòu)造過程

21、。7對象之間通過傳遞消息進(jìn)行通信,以實(shí)現(xiàn)對象之間的動(dòng)態(tài)聯(lián)系。8通過關(guān)聯(lián)表達(dá)類之間的靜態(tài)關(guān)系。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.3 面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn)1從認(rèn)識論的角度看,面向?qū)ο蟪绦蛟O(shè)計(jì)改變了軟件開發(fā)的方式 面向?qū)ο蟪绦蛟O(shè)計(jì)強(qiáng)調(diào)從對象出發(fā)認(rèn)識問題域 ,對象對應(yīng)著問題域中的事物,其屬性和操作分別刻畫了事物的靜態(tài)特征和動(dòng)態(tài)行為,對象之間的繼承、組合、關(guān)聯(lián)和依賴關(guān)系如實(shí)地表達(dá)了問題域中事物實(shí)際存在的各種關(guān)系。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.3 面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn) 因此,無論是軟件系統(tǒng)的構(gòu)成成分,還是通過這些成分之間的關(guān)系而體現(xiàn)的軟件系統(tǒng)結(jié)構(gòu),都可直接地映射到問題域。軟件開發(fā)人員能夠利用人

22、類認(rèn)識事物所采用的一般思維方式來進(jìn)行軟件開發(fā)。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.3 面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn)2面向?qū)ο蟪绦蛑械臄?shù)據(jù)的安全性高 面向?qū)ο蟪绦蛑械臄?shù)據(jù)及對數(shù)據(jù)的操作捆綁在一起,被封裝在不同的對象中。對象對外隱蔽其內(nèi)部細(xì)節(jié),只留下少量的接口,以便與外界聯(lián)系。外界只能通過對象提供的對外接口操作對象中的數(shù)據(jù),這可以有效保護(hù)數(shù)據(jù)的安全。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.3 面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn)3面向?qū)ο蟪绦蛟O(shè)計(jì)有助于軟件的維護(hù)與復(fù)用 某類對象數(shù)據(jù)結(jié)構(gòu)的改變只會(huì)引起該類對象操作代碼的改變,只要其對外提供的接口不發(fā)生變化,程序的其余部分就不需要做任何改動(dòng),從而把程序代碼的修改維護(hù)局限在一個(gè)

23、很小的范圍內(nèi)。這就對用戶需求的變化有較強(qiáng)的適應(yīng)性。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1.2.3 面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn)3面向?qū)ο蟪绦蛟O(shè)計(jì)有助于軟件的維護(hù)與復(fù)用 面向?qū)ο蟪绦蛟O(shè)計(jì)中類的繼承機(jī)制有效解決了代碼復(fù)用的問題。在設(shè)計(jì)新類時(shí),可通過繼承引用已有類的屬性和操作,并可在已有類的基礎(chǔ)上增加新的數(shù)據(jù)結(jié)構(gòu)和操作,延伸和擴(kuò)充已有類的功能,這種延伸和擴(kuò)充一點(diǎn)不影響原有類的使用。人們可以像使用集成電路(IC)構(gòu)造計(jì)算機(jī)硬件那樣,比較方便地重用對象類來構(gòu)造軟件系統(tǒng)。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€(gè)階段:1面向?qū)ο蠓治觯╫bject oriented analysis, OOA)2面向?qū)ο?/p>

24、設(shè)計(jì)(object oriented design, OOD)3面向?qū)ο缶幊蹋╫bject oriented programming, OOP)4面向?qū)ο鬁y試(object oriented test,OOT)5面向?qū)ο缶S護(hù)(object oriented soft maintenance,OOSM)1.3 面向?qū)ο蟮能浖_發(fā)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述1面向?qū)ο蠓治?對系統(tǒng)進(jìn)行面向?qū)ο蠓治?,識別出系統(tǒng)中的對象,定義對象的屬性和操作,并抽象出對象類。1.4 學(xué)生信息管理系統(tǒng)的面向?qū)ο蠓治雠c設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述(1)學(xué)生對象與學(xué)生類 考慮問題域,識別系統(tǒng)中的對象與類。 該系統(tǒng)是一個(gè)學(xué)

25、生信息管理系統(tǒng),每一個(gè)被管理的學(xué)生都是該系統(tǒng)中的一個(gè)對象,所有學(xué)生對象都具有相同的屬性:學(xué)號、姓名、性別、出生日期、英語成績、數(shù)據(jù)結(jié)構(gòu)成績、C+程序設(shè)計(jì)成績、總成績、平均成績,相同的操作:計(jì)算總成績、計(jì)算平均成績。對所有學(xué)生對象的抽象,形成一個(gè)學(xué)生類。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述 + 計(jì)算總成績 + 計(jì)算平均成績 - 學(xué)號 - 姓名 - - 平均成績 學(xué)生類 + 顯示學(xué)生信息 + 按學(xué)號查詢學(xué)生信息 + 按姓名查詢學(xué)生信息 + 打開文件 + 寫文件 + 新建文件“順序表”容器類1 - 學(xué)生數(shù)組 - 學(xué)生總?cè)藬?shù)圖1-8 學(xué)生信息管理系統(tǒng)的類圖第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述(2)順序表對象與順序表類

26、 考慮系統(tǒng)責(zé)任,把系統(tǒng)責(zé)任所要求的每一項(xiàng)功能都落實(shí)到某個(gè)或某些對象上。該系統(tǒng)要實(shí)現(xiàn)對所有需要管理的學(xué)生對象信息的輸入(從鍵盤輸入)、輸出(輸出到屏幕)、存儲(chǔ)(存儲(chǔ)到外存)、讀?。◤耐獯孀x?。?、增加、刪除、修改、查詢、排序、統(tǒng)計(jì)等操作。假定學(xué)生對象信息在外存中以文件的形式存放,在內(nèi)存中以順序表的形式存放。我們把順序表看作系統(tǒng)中的一個(gè)對象,并形象地稱它為“容器”。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述(2)順序表對象與順序表類 順序表對象作為用來存儲(chǔ)學(xué)生對象的容器,其數(shù)據(jù)結(jié)構(gòu)可以選擇最簡單的數(shù)組,因此,順序表對象應(yīng)該具有的屬性:以學(xué)生對象為元素的對象數(shù)組、學(xué)生總?cè)藬?shù)。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述(2)順序表

27、對象與順序表類 要對學(xué)生信息進(jìn)行管理,實(shí)現(xiàn)系統(tǒng)功能,順序表對象需要設(shè)計(jì)較豐富的操作,可以想到的有:顯示全部學(xué)生信息、按學(xué)號查詢學(xué)生信息、按姓名查詢學(xué)生信息、添加學(xué)生信息、修改學(xué)生信息、刪除學(xué)生信息、統(tǒng)計(jì)每個(gè)學(xué)生的總成績和平均成績、統(tǒng)計(jì)某一門課的總成績和平均成績、學(xué)生信息排序、打開文件讀取數(shù)據(jù)、將順序表中的數(shù)據(jù)寫入文件、新建文件等。 對順序表對象的抽象形成一個(gè)順序表類。第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述2面向?qū)ο笤O(shè)計(jì) 根據(jù)面向?qū)ο蠓治龅慕Y(jié)果,主要解決與實(shí)現(xiàn)有關(guān)的問題。 首先,我們把分析階段所抽象出來的類,按實(shí)現(xiàn)條件進(jìn)行補(bǔ)充和調(diào)整。1.4 學(xué)生信息管理系統(tǒng)的面向?qū)ο蠓治雠c設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述

28、2面向?qū)ο笤O(shè)計(jì) 假如我們選擇C+作為該系統(tǒng)的編程語言,由于C+沒有提供日期數(shù)據(jù)類型,所以每個(gè)學(xué)生的出生日期看作一個(gè)日期對象,所有日期對象具有相同的屬性:年、月、日,相同的操作:設(shè)置日期、顯示日期、獲取年份、獲取月份、獲取日期。對所有日期對象的抽象,形成一個(gè)日期類。該類與學(xué)生類的關(guān)系為組合關(guān)系。1.4 學(xué)生信息管理系統(tǒng)的面向?qū)ο蠓治雠c設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述2面向?qū)ο笤O(shè)計(jì)對于學(xué)生類,增加描述類對象自身行為的操作:初始化屬性值、設(shè)置屬性值(設(shè)置屬性學(xué)號、姓名、性別、出生日期、英語成績、數(shù)據(jù)結(jié)構(gòu)成績、C+程序設(shè)計(jì)成績的值)、顯示屬性值(顯示所有屬性的值)、獲取學(xué)號、獲取姓名、獲取英語成績、獲

29、取數(shù)據(jù)結(jié)構(gòu)成績、獲取C+成績、獲取總成績、獲取平均成績。1.4 學(xué)生信息管理系統(tǒng)的面向?qū)ο蠓治雠c設(shè)計(jì)第1章 面向?qū)ο蟪绦蛟O(shè)計(jì)概述2面向?qū)ο笤O(shè)計(jì)對于人機(jī)界面的設(shè)計(jì),由于我們不借助于可視化編程環(huán)境(Visial C+)的支持,我們需要設(shè)計(jì)一個(gè)主菜單類,負(fù)責(zé)系統(tǒng)功能主菜單的顯示。每項(xiàng)系統(tǒng)子功能設(shè)計(jì)一個(gè)子菜單類,負(fù)責(zé)系統(tǒng)子功能菜單的顯示與實(shí)現(xiàn)。主菜單類與子菜單類是繼承關(guān)系,這樣可以在類間使用多態(tài)性機(jī)制,從而創(chuàng)建一個(gè)易于擴(kuò)展的系統(tǒng)。1.4 學(xué)生信息管理系統(tǒng)的面向?qū)ο蠓治雠c設(shè)計(jì)Thank You !第2章 C+基礎(chǔ)知識C+程序設(shè)計(jì)第2章 C+基礎(chǔ)知識本章學(xué)習(xí)要點(diǎn)從C語言到C+的發(fā)展歷程簡單的C+程序C+對

30、C的擴(kuò)充C+的輸入輸出、數(shù)據(jù)類型、函數(shù)及指針C+的常變量、引用、名字空間、字符串變量C+程序的編寫和實(shí)現(xiàn)第2章 C+基礎(chǔ)知識本章學(xué)習(xí)目標(biāo)了解從C語言到C+的發(fā)展歷程對簡單的C+程序有整體的感性認(rèn)識掌握C+對C的擴(kuò)充掌握C+的輸入輸出、數(shù)據(jù)類型、函數(shù)及指針掌握C+的常變量、引用、名字空間、字符串變量熟悉C+程序的編寫和實(shí)現(xiàn)流程2.1 從C語言到C+C語言到C+的發(fā)展歷程C+3.0C+2.0C+1.0帶類的CCC+4.0ANSI C+89年,增加類的多繼承91年,增加模板增加異常處理、名字空間、運(yùn)行時(shí)類型識別97年, 美國C+標(biāo)準(zhǔn)正式發(fā)布2.2 簡單C+程序下面看幾個(gè)簡單的C+程序【例2-1】在屏

31、幕上輸出一行字符“Hello C+!”。 #include /包含頭文件命令using namespace std; /使用名字空間stdint main() coutHello C+!endl; /輸出字符串到屏幕 return 0; /main函數(shù)返回0至操作系統(tǒng)標(biāo)準(zhǔn)C+程序和C程序的不同 :main函數(shù)的返回值為整型 注釋符:/使用cout輸出 包含頭文件iostream名字空間注意【例2-2】通過函數(shù)求兩個(gè)整數(shù)a和b的和。 #include /包含頭文件命令using namespace std;/使用名字空間stdint sum(int x, int y) return x + y;

32、 /求和函數(shù)int main() int a,b; /定義兩個(gè)變量a和b coutInput to a and b: ab; /等待用戶從鍵盤輸入數(shù)據(jù) couta+b=sum(a, b)endl; return 0;2.2 簡單C+程序C+的函數(shù)和C語言的函數(shù)非常相似 函數(shù)的使用仍然需要先聲明后使用。如果函數(shù)定義在函數(shù)調(diào)用之后,則必須在前面聲明函數(shù)原型注意 #include /包含頭文件命令using namespace std; /使用名字空間stdint main() int a,b; /定義兩個(gè)變量a和b coutInput to a and b: ab; /等待用戶從鍵盤輸入數(shù)據(jù) in

33、t sum(int x, int y); /sum函數(shù)原型聲明 couta+b=sum(a, b)endl; return 0;int sum(int x, int y) return x + y; /求和函數(shù)2.2 簡單C+程序變量可以在程序的任何地方定義,但要在使用前2.2 簡單C+程序【例2-3】聲明一個(gè)關(guān)于人的類Person,人的信息包括姓名、性別、年齡,程序運(yùn)行后,我們可以輸入自己的信息,也可以顯示自己的信息。 #include /包含頭文件命令 using namespace std; /使用名字空間std class Person int main() ; return 0; 2

34、.2 簡單C+程序class Person /類的聲明public: /以下為類的公用成員函數(shù)void SetInfo() /公用成員函數(shù)SetInfo coutnamesexage; void Show() /公用成員函數(shù)Show cout name : name; cout sex: sex; cout age: ageendl; private: /以下為類的私有數(shù)據(jù)成員char name20; /私有數(shù)據(jù)成員namechar sex2; /私有數(shù)據(jù)成員sexint age; /私有數(shù)據(jù)成員age; /類聲明結(jié)束,此處必須有分號 2.2 簡單C+程序int main()/main函數(shù) /

35、定義Person類的兩個(gè)對象person1,person2Person person1,person2; person1.SetInfo(); /對象person1信息輸入person2.SetInfo(); /對象person2信息輸入person1.Show(); /對象person1信息輸出person2.Show(); /對象person2信息輸出return 0; 注意:類的聲明和對象的定義的語法形式。類中的成員分為數(shù)據(jù)成員和成員函數(shù),成員的可見性分為 3種:公用 、私有、受保護(hù)。類的概念的理解:類是一種用戶自定義數(shù)據(jù)類型,它是不占用實(shí)際存儲(chǔ)空間的。對象的理解:對象是類類型的變量,系

36、統(tǒng)會(huì)為對象分配內(nèi)存空間。2.2 簡單C+程序2.3 C+對C的擴(kuò)充在輸入輸出方面的擴(kuò)充對數(shù)據(jù)類型的擴(kuò)充常變量在指針方面的擴(kuò)充引用的概念在函數(shù)方面的擴(kuò)充名字空間的概念字符串變量本章重點(diǎn)2.3.1 C+的輸入輸出C語言輸入輸出的實(shí)現(xiàn)通過輸入輸出庫函數(shù)實(shí)現(xiàn)C語言的輸入輸出存在著格式復(fù)雜、無法保證安全性、無法對自定義類型整體輸入輸出等缺點(diǎn) C+對C輸入輸出的擴(kuò)充C+的輸入/輸出(I/O)流類庫“流”的思想cout、cin對象, 運(yùn)算符2.3.2 數(shù)據(jù)類型的擴(kuò)展2.3.3 用const定義常變量直接常量和符號常量使用符號常量需要注意的問題:運(yùn)行時(shí)不分配內(nèi)存單元符號常量沒有類型,在編譯時(shí)不進(jìn)行類型檢查注意

37、替換后的表達(dá)式和預(yù)想的表達(dá)式是否一致 int x=1,y=2; #define PI 3.14159 #define R x+y coutPI*R*Rendl;輸出語句輸出的并不是 3.14159*(x+y)*(x+y),而是 3.14159*x+y*x+y。2.3.3 用const定義常變量為了使常量也能像變量那樣進(jìn)行類型檢查,C+提供了用const定義常變量的方法定義常變量的語法: const float PI=3.14159;注意:常變量要在定義的同時(shí)進(jìn)行初始化, 可以是具體的數(shù)值,也可以是表達(dá)式。【例2-4】利用常變量計(jì)算圓的面積。 #include using namespace s

38、td;int main() const float PI = 3.14; /定義常變量 float radius = 0; coutradius; coutThe area of circle is: PI*radius*radiusendl; return 0;2.2 簡單C+程序注意const的位置,一般見到的const的位置可能在類型的前面,但是const也可以在變量名前面,并且兩者的含義完全相同。注意 float const PI = 3.14; /定義常變量2.3.4 指針指針指針是一個(gè)重要概念,如果使用得當(dāng)可以使程序高效、簡潔、緊湊。如果對指針掌握不牢固,編程則會(huì)出現(xiàn)意想不到的錯(cuò)誤

39、 指針是內(nèi)存單元的地址 經(jīng)常所講的指針是指針變量的簡稱,是用來存放指針(地址)的變量。 本節(jié)重點(diǎn)討論C+中使用指針需要注意的地方 指針與0空指針空指針表示“未分配”或者“尚未指向任何地方”的指針 空指針一般用來判斷內(nèi)存分配是否成功注意:“空指針”與“野指針”的區(qū)別在指針上下文中的常數(shù)0被編譯成空指針 程序員更常使用符號常量NULL來表示空指針 未初始化的指針【例2-5】指針與0。#include using namespace std;int main()int *p = 0; /定義空指針pint *q; /定義野指針qint x = 100; /定義整型變量x并初始化為100/*p = 5

40、0; /若執(zhí)行則編譯出錯(cuò),不能使用空指針*q = 50; /編譯通過,但不知把50寫到何處p = q = &x; /使指針p和q都指向變量xif(p!= 0) /判斷指針p是否為空指針cout*p *qendl; /輸出變量x的值 return 0; 2.2 簡單C+程序int *p = NULL 指針與constint *p = NULLconst int *p = NULLint const *p = NULL指向const變量的指針int * const p = NULLconst指針 指針與const【例2-6】指向const變量的指針。include using namespace

41、std;int main() const int *p = NULL; /定義指向const變量的指針pconst int a = 10 ; /定義常變量ap = &a; /指針p指向acout*p = *pendl; /輸出p所指向單元的內(nèi)容int b = 100; /定義普通變量bp = &b; /指針p指向bcout*p = *pendl; /輸出p所指向單元的內(nèi)容/*p = 200; /錯(cuò)誤,不能通過p修改p所指向單元內(nèi)容b = 200;cout*p = *pendl; /輸出p所指向單元的內(nèi)容return 0;通過本例可以看到可以改變指向const變量的指針的指向,但是不能通過指針修

42、改指針指向單元內(nèi)容。 指針與const【例2-7】const指針。#include using namespace std;int main() int a = 10 ; /定義普通變量aint b = 100; /定義普通變量bint * const p = &a; /定義const指針p并初始化指向acout*p = *pendl; /輸出p所指向單元內(nèi)容/p = &b; /錯(cuò)誤,不能改變const指針p的指向*p = 100; /通過指針修改p所指向單元內(nèi)容cout*p = *pendl; /輸出p所指向單元內(nèi)容return 0;通過本例可以看到可以改變const指針指向單元的內(nèi)容,但是

43、不能改變const指針的指向。 指針與const【例2-8】指向const變量的const指針。#include using namespace std;int main() int a = 10 ;int b = 100;/定義指向const變量的const指針p const int * const p = &a; cout*p = *pendl; /輸出p所指向單元內(nèi)容/p = &b; /錯(cuò)誤,不能改變指針p的指向/*p = 100; /錯(cuò)誤,不能改變p所指向單元的內(nèi)容return 0;對于指向const變量的const指針,既不能改變指針指向單元的內(nèi)容,也不能改變指針的指向。 指針與co

44、nst小結(jié)指針和const的關(guān)系比較復(fù)雜,const有兩個(gè)位置,可形成三種指針:const int *p = NULLint const *p = NULL指向const變量的指針int * const p = NULLconst指針 指針與const小結(jié)指針和const的關(guān)系比較復(fù)雜,const有兩個(gè)位置,可形成三種指針:const int * const p = NULLint const * const p = NULL指向const變量的const指針: void指針void在作為函數(shù)類型和參數(shù)類型時(shí)為空類型,表示沒有返回值或參數(shù)。void修飾指針時(shí)稱為“無類型指針”,表示該指針可以指

45、向任意類型的變量。雖然void指針可以指向任意類型的數(shù)據(jù),但是在使用void指針時(shí)必須對其進(jìn)行強(qiáng)制類型轉(zhuǎn)換,轉(zhuǎn)換成它所指向單元的實(shí)際類型,然后才可以使用。 void指針【例2-9】void指針的聲明與使用。#include using namespace std;int main() int x = 100; void *p = &x; /定義void指針p指向x int *q = NULL; /定義整型指針q /cout*p = *pendl; /錯(cuò)誤 cout*p = *(int *)pendl; /正確 /q = p; /錯(cuò)誤 q = (int *)p; /正確 cout*q = *qe

46、ndl; /輸出指針q指向單元內(nèi)容 return 0; void指針為什么要使用void指針因?yàn)関oid指針可以指向任意類型的數(shù)據(jù),所以使用void指針時(shí)把void指針?biāo)赶虻臄?shù)據(jù)給抽象化了,這樣可以增加程序的通用性 使用void指針的兩個(gè)例子void * memcpy(void *dest, const void *src, size_t len); void * malloc(unsigned int size); new和deleteC語言的動(dòng)態(tài)內(nèi)存管理malloc()和free()函數(shù)主要缺點(diǎn)函數(shù)的返回值是void*類型 分配內(nèi)存單元時(shí)根據(jù)參數(shù)size的值來分配,無法檢查錯(cuò)誤分配到的內(nèi)

47、存單元無法初始化C+中使用new和delete運(yùn)算符進(jìn)行動(dòng)態(tài)內(nèi)存管理P31 最后【例2-11】使用new和delete動(dòng)態(tài)管理內(nèi)存單元。#include using namespace std;int main() int *p = NULL; p = new int; cout*p = *pendl; delete p; return 0;通過new運(yùn)算得到的內(nèi)存單元是不會(huì)自動(dòng)釋放的,必須通過delete運(yùn)算去釋放注意 new和delete new和delete申請內(nèi)存空間并進(jìn)行初始化 指針變量 = new 數(shù)據(jù)類型(初值); 分配多個(gè)連續(xù)變量的存儲(chǔ)空間 使用new 和delete 指針變量

48、 = new 數(shù)據(jù)類型元素個(gè)數(shù); delete 指針變量; 三種動(dòng)態(tài)內(nèi)存管理的方式:兼容C語言的malloc/free方式,單個(gè)變量的new/delete方式,多個(gè)變量的new /delete 方式 2.3.5 引用引用就是某一變量的別名,對引用的操作與對變量直接操作完全一樣 引用的聲明方法 類型標(biāo)識符 &引用名 = 目標(biāo)變量名;2.3.5 引用int a;int &b=a;20地址2000變量a引用b在聲明一個(gè)引用時(shí),引用前面的類型標(biāo)示符是指目標(biāo)變量的類型,且必須同時(shí)使之初始化,即聲明它代表哪一個(gè)變量.【例2-12】使用引用訪問變量。#include using namespace std;

49、int main() int x = 100; /定義整型變量x int &rx = x; /定義變量x的引用rx coutrx = rxendl;/輸出引用rx的內(nèi)容 rx = 200; /給引用rx賦值 coutx = xendl; /輸出變量x的內(nèi)容 return 0;程序運(yùn)行結(jié)果如下:rx = 100 x = 2002.3.5 引用補(bǔ)充:關(guān)于引用的簡單說明(1)引用并不是一種獨(dú)立的數(shù)據(jù)類型,聲明引用時(shí)必須指定其代表某一類型的實(shí)體(如變量、類對象),即對它初始化。int a;int &b=a;int &b;float a; int &b=a;(2)引用與其所代表的變量共享同一內(nèi)存單元,系

50、統(tǒng)并不為引用另外分配存儲(chǔ)空間。int a=3;int &b=a;Cout&a“ “&bendl;補(bǔ)充:關(guān)于引用的簡單說明int a=3;int &b=a;/聲明b是整型變量的別名int &c=b; /聲明c是整型引用b的別名(3)對引用的初始化,可以用一個(gè)變量名,也可以用另一個(gè)引用。如:補(bǔ)充:關(guān)于引用的簡單說明(4)引用在初始化后不能再被重新聲明為另一變量的別名。int a=3,b=4;int &c=a;int &c=b;/企圖重新聲明c為整型變量b的別名補(bǔ)充:關(guān)于引用的簡單說明(5)當(dāng)&a的前面有類型符時(shí)(如 int &a),它必然是對引用的聲明;如果前面沒有類型符時(shí)(p= &a) ,此時(shí)的

51、&是取地址運(yùn)算符。int a=3,b=4;int &c=a;int *p=&b; 補(bǔ)充:關(guān)于引用的簡單說明實(shí)際上,在C+程序中很少使用獨(dú)立變量的引用,如果要使用某一個(gè)變量,就直接使用它的原名,沒有必要故意使用它的別名。前面舉的例子只是為了說明引用的特征和基本的用法。C+之所以增加“引用”,主要是利用它作為函數(shù)參數(shù),以擴(kuò)充函數(shù)傳遞數(shù)據(jù)的功能補(bǔ)充:關(guān)于引用的簡單說明在C語言中,函數(shù)的參數(shù)傳遞有以下兩種情況:(1)值傳遞:將變量名作為形參和實(shí)參。此時(shí)傳遞給形參的是實(shí)參變量的值,數(shù)據(jù)傳遞是單向的,在函數(shù)執(zhí)行期間形參值發(fā)生變化并不回傳給實(shí)參。 (2)地址傳遞:(2)地址傳遞:形參是指針變量,實(shí)參是變量的

52、地址。函數(shù)調(diào)用時(shí),形參指向?qū)崊⒆兞繂卧?,?shù)據(jù)傳遞是雙向的?!纠?-13】編寫一個(gè)函數(shù),交換兩個(gè)整型變量的值。(1)值傳遞:教材3510 x20y1020 xy2010(2)地址傳遞:傳遞變量的地址(指針)【例2-13】編寫一個(gè)函數(shù),交換兩個(gè)整型變量的值。10 x20y*x*y2010(3)引用傳遞:【例2-13】編寫一個(gè)函數(shù),交換兩個(gè)整型變量的值。#include using namespace std;void swap(int &x, int &y) int tmp; tmp = x; x = y; y = tmp;int main() int x = 10, y = 20; cout交換

53、前:x = x, y = yendl; swap(x,y); cout交換后:x = x, y = yendl; return 0;2.3.5 引用 別名x10變量x20變量y 別名y1020對引用的進(jìn)一步說明(1)不能建立數(shù)組的引用。 “引用”只能是變量或?qū)ο蟮囊?。?shù)組是具有某種類型的數(shù)據(jù)的集合,其名字表示該數(shù)組的起始地址而不是一個(gè)變量。所以不能建立數(shù)組的引用。 char c6=“hello”; char &rc=c; (3)可以將變量的引用的地址賦給一個(gè)指針,此時(shí)指針指向的是原來的變量,如 int a=3; int &b=a; int *p=&b; 由于引用不是一種獨(dú)立的數(shù)據(jù)類型,不能建

54、立指向引用類型的指針變量: int & *p=&a; 對引用的進(jìn)一步說明(4)可以建立指針變量的引用,如 int i=3; int *p=&i; int *&pt=p;對引用的進(jìn)一步說明(5)可以用const對引用加以限定,不允許改變該引用的值。如 int i=5; const int &a=i; a=3; 但可以 i=3 對引用的進(jìn)一步說明利用常引用作為函數(shù)形參,既能提高程序的執(zhí)行效率,又能保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函數(shù)中被改變,達(dá)到保護(hù)實(shí)參的目的 引用型參數(shù)應(yīng)該在能被定義為const的情況下,盡量定義為const。注意對引用的進(jìn)一步說明void show(const int &x) x=8;

55、 cout“x=“xendl;(6)可以用常量或表達(dá)式對引用進(jìn)行初始化,但此時(shí)必須用const作聲明。如 int a=3; const int &b=a+3; int temp=a+3; const int &b=temp; 用這種方式不僅可以用表達(dá)式對引用進(jìn)行初始化,還可以用不同類型的變量對之初始化。對引用的進(jìn)一步說明 double d=3.14159; const int &a=d;int temp=d;const int &a=d; 對引用的進(jìn)一步說明2.3.5 引用引用作為函數(shù)的返回值 【例2-14】引用作為函數(shù)的返回值。class stringpublic: /重載賦值運(yùn)算符stri

56、ng& operator=(const string &right);string& operator+=(const string &right); int compare(const string &)const; /字符串比較private: unsigned buflen; char * buffer; 面向過程的C+程序中的函數(shù)與C語言中的函數(shù)基本相同面向?qū)ο蟮腃+程序中的函數(shù)有成員函數(shù)和公共函數(shù)之分主要討論面向過程的C+程序中函數(shù)與C語言函數(shù)的區(qū)別2.3.6 函數(shù) 函數(shù)原型聲明在函數(shù)尚未定義的情況下,先將函數(shù)的形式告訴編譯系統(tǒng),以便編譯能夠正常進(jìn)行 函數(shù)原型聲明的語法形式有兩種:(

57、1)返回值類型 函數(shù)名(參數(shù)類型1, 參數(shù)類型2, .);(2)返回值類型 函數(shù)名(參數(shù)類型1 參數(shù)名1, 參數(shù)類型2 參數(shù)名2, .);函數(shù)原型聲明和函數(shù)定義是不同的。函數(shù)原型聲明不是一個(gè)獨(dú)立的完整的函數(shù)單位,它僅僅是一條語句,因此在函數(shù)原型聲明后面一定要加上分號。 函數(shù)默認(rèn)參數(shù)在多次調(diào)用一個(gè)函數(shù)將實(shí)參傳遞給形參時(shí),其中可能有一個(gè)或幾個(gè)參數(shù),它們傳遞進(jìn)來的實(shí)參值多次相同在定義或聲明函數(shù)時(shí),給形參一個(gè)默認(rèn)值,如果在調(diào)用時(shí)沒有給該形參傳遞實(shí)參值,則使用默認(rèn)值作為該形參的值;如果調(diào)用時(shí)給該形參傳遞了實(shí)參值,則使用實(shí)參的值作為該形參的值。 函數(shù)默認(rèn)參數(shù)【例2-16】求兩個(gè)或三個(gè)正整數(shù)中的最大值,使用

58、帶有默認(rèn)參數(shù)的函數(shù)實(shí)現(xiàn)。#include using namespace std;int main() int max(int,int,int = 0);/帶有默認(rèn)參數(shù)的函數(shù)原型聲明int a = 5,b = 8,c = 10;coutmax of a and b is:max(a,b)endl; coutmax of a, b and c is:max(a,b,c)endl;return 0;/定義帶有默認(rèn)參數(shù)的函數(shù)int max(int a, int b, int c = 0)if(a b) a = b;if(a c) a = c;return a; 函數(shù)默認(rèn)參數(shù)1.指定默認(rèn)值參數(shù)默認(rèn)值的

59、位置:為了避免混淆,最好只在函數(shù)原型聲明時(shí)指定默認(rèn)值。2.當(dāng)只有部分形參帶有默認(rèn)值時(shí),帶有默認(rèn)值的參數(shù)必須放在形參表的右端。3.當(dāng)一個(gè)函數(shù)既是重載函數(shù),又是帶有默認(rèn)參數(shù)的函數(shù)時(shí),要注意不要出現(xiàn)二義性的問題注意調(diào)用帶有默認(rèn)參數(shù)的函數(shù)時(shí),實(shí)參的個(gè)數(shù)可以與形參的個(gè)數(shù)不同,對于實(shí)參未給出的,可以從形參的默認(rèn)值中獲得,利用這一特性,可以使函數(shù)的使用更加靈活。 函數(shù)與引用函數(shù)與引用聯(lián)合使用主要有兩種方式:1. 函數(shù)的參數(shù)是引用 當(dāng)使用引用作為函數(shù)的形參時(shí),引用不是一個(gè)單獨(dú)的變量,不需要在內(nèi)存中分配存儲(chǔ)單元,實(shí)參向形參傳遞的是變量的名字。使用引用作為函數(shù)的形參可以部分代替指針,降低了程序的復(fù)雜度,提高了程序

60、的執(zhí)行效率,同時(shí)也提高了程序的可讀性。 2. 函數(shù)的返回值是引用 函數(shù)與引用函數(shù)與引用聯(lián)合使用主要有兩種方式:2. 函數(shù)的返回值是引用以引用作為函數(shù)的返回值是為了使函數(shù)可以作為左值而被賦值。函數(shù)的返回值為引用類型表示該函數(shù)的返回值是一個(gè)內(nèi)存變量的別名??梢詫⒑瘮?shù)調(diào)用作為一個(gè)變量來使用,可以為其賦值。2.3.5 引用引用作為函數(shù)的返回值 【例2-14】引用作為函數(shù)的返回值。class stringpublic: /重載賦值運(yùn)算符string& operator=(const string &right);string& operator+=(const string &right); int c

溫馨提示

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

最新文檔

評論

0/150

提交評論