面向對象程序設計教程C++語言描述課件_第1頁
面向對象程序設計教程C++語言描述課件_第2頁
面向對象程序設計教程C++語言描述課件_第3頁
面向對象程序設計教程C++語言描述課件_第4頁
面向對象程序設計教程C++語言描述課件_第5頁
已閱讀5頁,還剩329頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向對象程序設計教程(C++語言描述)上面向對象程序設計教程(C++語言描述)上第1章面向對象程序設計概論1.1程序設計方法1.2面向對象程序設計的基本概念1.3面向對象程序設計語言1.4C++對面向對象程序設計方法的支持1.5C++程序的實現第1章面向對象程序設計概論1.1程序設計方法1.1程序設計方法1.1.1

結構化程序設計方法1.1.2

面向對象的程序設計方法返回首頁目前有兩種重要的程序設計方法:1.1程序設計方法1.1.1結構化程序設計方法返回首1.1.1結構化程序設計方法結構化程序設計的概念由瑞士計算機科學家1971年首次提出來,隨之出現了支持結構化程序設計方法的程序設計語言,例如C語言。

結構化程序設計方法:強調程序結構的規(guī)范性,強調程序設計的自頂向下,逐步求精的演化過程。在這種方法中,待解問題和程序設計語言中的過程緊密相聯(lián)。1.1.1結構化程序設計方法結構化程序設計的概1.1.1結構化程序設計方法例如要開發(fā)一個成績管理系統(tǒng),由于問題較復雜,我們將待解的問題分解成若干子問題:輸入成績處理成績打印成績待解問題將對應到main()函數,每個子問題對應到main()的調用函數1.1.1結構化程序設計方法例如要開發(fā)一個成績管理系統(tǒng)1.1.1結構化程序設計方法返回本節(jié)隨著程序規(guī)模與復雜性的增長,面向過程的結構化程序設計方法存在明顯的不足之處:數據安全性問題可維護性及可重用性差圖形用戶界面的應用程序,很難用過程來描述和實現,開發(fā)和維護也都很困難。1.1.1結構化程序設計方法返回本節(jié)隨著程序1.1.2面向對象程序設計方法在結構化程序設計方法中,程序可表示為:程序=數據結構+算法即程序的要素是數據結構和算法,數據結構是指利用計算機的離散邏輯來量化表達需要解決的問題,而算法則研究如何高效而快捷地組織解決問題的具體過程。1.1.2面向對象程序設計方法在結構化程序設計方法中,程1.1.2面向對象程序設計方法【例1.1】用C++語言描述,用結構化程序設計方法計算矩形的面積。1.1.2面向對象程序設計方法【例1.1】用C++語言描1.1.2面向對象程序設計方法在面向對象的程序設計方法中,對象是數據結構和算法的封裝體。根據這個定義,對象是計算機內存中的一塊區(qū)域。在對象中,不但存有數據,而且存有代碼,使得每個對象在功能上相互之間保持相對獨立。當然,對象之間存在各種聯(lián)系,但它們之間只能通過消息進行通信。程序可表示為:程序=對象+消息1.1.2面向對象程序設計方法在面向對象的程序設1.1.2面向對象程序設計方法【例1.2】用C++語言描述,用面向對象程序設計方法計算矩形的面積。1.1.2面向對象程序設計方法【例1.2】用C++語言描1.1.2面向對象程序設計方法通過這個程序可以知道面向對象程序程序的基本結構。一般情況下,面向對象程序都是由三個部分來構成:類的聲明、類的成員的實現和主函數。可見,在面向對象程序設計中,它著重于類的設計。類正是面向對象語言的基本程序模塊,通過類的設計,來完成實體的建模任務。1.1.2面向對象程序設計方法通過這個程序可以知1.1.2面向對象程序設計方法程序Li1_2比程序Li1_1看起來要煩瑣一些。但是,如果以RectangleArea類為基礎,通過繼承,可以很方便地派生出長方體等新的幾何體,實現代碼重用。面向對象程序設計方法提供了軟件重用、解決大問題和復雜問題的有效途徑,具有抽象性、封裝性、繼承性和多態(tài)性等特點。返回本節(jié)1.1.2面向對象程序設計方法程序Li1_2比程1.2面向對象程序設計的基本概念1.2.1

抽象1.2.2封裝1.2.3消息1.2.4繼承1.2.5多態(tài)返回首頁1.2面向對象程序設計的基本概念1.2.1抽象返回1.2.1抽象抽象就是忽略事物中與當前目標無關的非本質特征,而強調與當前目標有關的本質特征,從而找出事物的共性,并把具有共性的事物劃為一類,得到一個抽象的概念。1.2.1抽象抽象就是忽略事物中與當前目標無關的1.2.1抽象面向對象方法中的抽象:指對具體問題(對象)進行概括,抽出一類對象的公共性質并加以描述的過程。它包括兩個方面:數據抽象和行為抽象(或稱功能抽象、代碼抽象)。其中,數據抽象描述某類對象共有的屬性或狀態(tài),行為抽象描述某類對象的共有的行為或功能特征。將這兩方面抽象有機地結合,就形成了面向對象程序設計中的“對象”。還可以繼續(xù)抽象:把眾多相似的“對象”聚集起來,進一步抽象后就形成了“類”。1.2.1抽象面向對象方法中的抽象:指對具體問題(1.2.1抽象數據抽象:floatlength,width,Area;行為抽象:SetData(floatL,floatW);CompueteArea();OutputArea();分析程序清單Li1_2:如果不是計算矩形的面積,關注的特征可能是顏色、大小等。由此可見,對于同一個研究對象,由于所研究問題的側重點不同,就可能產生不同的抽象結果。返回本節(jié)1.2.1抽象數據抽象:分析程序清單Li1_2:如果不是1.2.2封裝在日常生活中,我們往往只想知道某件物品的功能,而不關心它是怎么工作的。對于程序設計亦是如此,當人們面對某段程序時,只關心它的執(zhí)行結果,而不關心實現過程以及過程中所用到的數據。封裝恰好滿足了這一需求。1.2.2封裝在日常生活中,我們往往只想知道某件1.2.2封裝面向對象方法中的封裝:就是將抽象出來的對象的屬性和行為結合成一個獨立的單位,并盡可能隱蔽對象的內部細節(jié)。封裝有兩個含義:一是把對象的全部屬性和行為結合在一起,形成一個不可分割的獨立單位。對象的私有屬性只能由這個對象的行為來讀取和修改;二是盡可能隱蔽對象的內部細節(jié),對外形成一道屏障,通過公有行為充當外部接口。1.2.2封裝面向對象方法中的封裝:就是將抽象出1.2.2封裝例如程序段Li1_2中的類RectangleArea就是在抽象的基礎上,將矩形的數據和功能結合起來而構成的封裝體。聲明的私有成員length、width和Area外部無法直接訪問,外界可通過公有行為SetData()、CompueteArea()和OutputArea()與類RectangleArea發(fā)生聯(lián)系。返回本節(jié)1.2.2封裝例如程序段Li1_2中的類Rect1.2.3消息消息:是面向對象程序設計用來描述對象之間通信的機制。一個消息就是一個對象要求另一個對象實施某種操作的一個請求。前面所提到的“接口”規(guī)定了能向某一對象發(fā)出什么請求。也就是說,類對每個可能的請求都定義了一個相關的函數,當向對象發(fā)出請求時,就調用這個函數。這個過程通常概括為向對象“發(fā)送消息”(提出請求),對象根據這個消息決定做什么(執(zhí)行函數代碼)。1.2.3消息消息:是面向對象程序設計用來描述對1.2.3消息例如,外界與RectangleArea類進行通信,可以通過下面的C++語句來描述://創(chuàng)建一個Rectangle對象

RectangleAreaRectangle;//通過對象調用CompueterArea()函數

Rectangle.CompueterArea();返回本節(jié)1.2.3消息例如,外界與RectangleArea類進1.2.4繼承在客觀世界中,存在著一般和特殊的關系,特殊具有一般的特性,同時又有自己的新特性。運用抽象的原則就是舍棄對象的特殊性,提取其一般性,從而得到適合一個對象集的類。如果在這個類的基礎上,再考慮抽象過程中被舍棄的一部分對象的特性,則可形成一個新的類,這個類具有前一個類的全部特征,又有自己的新特征,形成一種層次結構,即繼承結構。1.2.4繼承在客觀世界中,存在著一般和特殊的關1.2.4繼承面向對象程序設計中利用繼承機制將這種關系模型化。繼承就是指特殊類的對象擁有其一般類的屬性和行為。

1.2.4繼承面向對象程序設計中利用繼承機制將這1.2.4繼承在軟件開發(fā)過程中,繼承進一步實現了軟件模塊的可重用性。繼承意味著“自動地擁有”,即特殊類中不必重新定義已在一般類中定義過的屬性和行為,而是自動地、隱含地擁有其一般類的屬性與行為。當這個特殊類又被它更下層的特殊類繼承時,它繼承來的和自己定義的屬性和行為又被下一層的特殊類繼承下去。不僅如此,如果將開發(fā)好的類作為構件放到構件庫中,在開發(fā)新系統(tǒng)時便可直接使用或繼承使用。返回本節(jié)1.2.4繼承在軟件開發(fā)過程中,繼承進一步實現了1.2.5多態(tài)

面向對象的通信機制是消息,一個消息可以產生不同的響應效果,這種現象叫做多態(tài)。即一個名字,多種語義;或相同界面,多種實現。1.2.5多態(tài)面向對象的通信機制是消息,一個消息1.2.5多態(tài)

例如,如果發(fā)送消息“雙擊”,不同的對象就會有不同的響應。比如,“文件夾”對象收到雙擊消息后,會打開該文件夾,而“音樂文件”對象收到雙擊消息后,會播放該音樂。顯然,打開文件夾和播放音樂需要不同的函數體。但是,它們可以被同一條消息“雙擊”所引發(fā)。這就是多態(tài)。返回本節(jié)1.2.5多態(tài)例如,如果發(fā)送消息“雙擊”,不同的1.3面向對象程序設計語言1.3.1混合型的面向對象程序設計語言C++1.3.2純面向對象程序設計語言Java返回首頁1.3面向對象程序設計語言1.3.1混合型的面向對象1.3.1混合型的面向對象程序設計語言C++

混合型程序設計語言兼有同時支持面向過程的程序設計和支持面向對象的程序設計的特點,C++語言是這類語言的典型代表。1.3.1混合型的面向對象程序設計語言C++混合型程1.3.1混合型的面向對象程序設計語言C++C++語言具有4個方面的優(yōu)點:降低程序開發(fā)和維護的成本。與C兼容,但比用C語言編寫的程序更有效率。允許程序員更自由地使用各種庫。C++的異常處理機制能夠保證在運行期間檢查到錯誤,并轉至相應的處理程序,減少了代碼的長度和復雜度。返回本節(jié)1.3.1混合型的面向對象程序設計語言C++C++語言具有41.3.2純面向對象程序設計語言Java

Java是一種具有“簡單、面向對象的、分布式、解釋型、健壯、安全、與體系結構無關、可移植、高性能、多線程和動態(tài)執(zhí)行”等特性的語言。其次,它最大限度地利用了網絡,Java的應用程序(Applet)可在網絡上傳輸,可以說是網絡世界的通用語言;另外,Java還提供了豐富的類庫,使程序設計者可以方便地建立自己的系統(tǒng)。因此Java具有強大的圖形、圖像、動畫、音頻、視頻、多線程及網絡交互能力,使其在設計交互式、多媒體網頁和網絡應用程序方面大顯身手。Java是C++的簡化和改進,因而C++程序員可以很快掌握Java編程技術。返回本節(jié)1.3.2純面向對象程序設計語言JavaJava1.4C++對面向對象程序設計方法的支持C++作為一種面向對象程序設計語言,支持面向對象技術的抽象性、繼承性、封裝性和多態(tài)性等特性。返回首頁1.4C++對面向對象程序設計方法的支持C++作1.4C++對面向對象程序設計方法的支持1.支持抽象性C++把問題域中的事物抽象成對象(Object),用數據成員描述該對象的靜態(tài)特征(屬性),用成員函數來刻畫該對象的動態(tài)特征(行為)。返回本節(jié)1.4C++對面向對象程序設計方法的支持1.支持抽象性返1.4C++對面向對象程序設計方法的支持

2.支持繼承性C++語言允許單繼承和多繼承。繼承是面向對象語言的重要特性。C++允許從一個或多個已經定義的類中派生出新的類并繼承其數據和操作,同時在新類中可以重新定義或增加新的數據和操作,從而建立起類的層次結構。被繼承的類稱為基類或父類,派生的新類稱為派生類或子類。返回本節(jié)1.4C++對面向對象程序設計方法的支持2.支持繼承性1.4C++對面向對象程序設計方法的支持3.支持封裝性在C++語言中,類是支持數據封裝的工具,對象是數據封裝的實現。C++將數據和相關操作封裝在類中,同時通過訪問權限來控制對內部數據的訪問。返回本節(jié)1.4C++對面向對象程序設計方法的支持3.支持封裝性返1.4C++對面向對象程序設計方法的支持4.支持多態(tài)性C++多態(tài)分為編譯時多態(tài)和運行時多態(tài)。對編譯時多態(tài)的支持是通過函數重載和運算符重載實現的;對運行時多態(tài)的支持是通過繼承和虛函數來實現的。返回本節(jié)1.4C++對面向對象程序設計方法的支持4.支持多態(tài)性返1.5

C++程序的實現返回首頁1.5.1編輯C++源程序1.5.2編譯和連接源程序1.5.3運行源程序

1.5C++程序的實現返回首頁1.5.1編輯C++第2章從C到C++2.1C++程序基本組成2.2簡單的輸入/輸出2.3指針與引用2.4函數2.5new和delete運算符2.6其他若干重要的C++特性2.7應用實例第2章從C到C++2.1C++程序基本組成2.1C++程序基本組成返回首頁2.1.1

C++程序基本結構2.1.2C++程序基本組成2.1C++程序基本組成返回首頁2.1.1C++程2.1.1

C++程序基本結構一般情況下,用C++語言編寫的程序是由函數加上類組成的。兩種退化情形:程序中僅有類而沒有函數(包括沒有主函數)。通常是用來構造C++程序庫,供編程序時重用。另一種退化情形是程序中僅有函數而沒有類。除主函數外,還可能有一些游離的函數,這些游離的函數不屬于任何類。返回本節(jié)2.1.1C++程序基本結構一般情況下,用C+2.1.2C++程序基本組成【例2.1】一個最簡單的C++程序。2.1.2C++程序基本組成【例2.1】一個最簡單的C2.1.2C++程序基本組成分析程序Li1_1.cpp:1.文件包含命令(#include指令)文件包含命令,即#include指令,其作用是將某一個源文件的代碼并入當前源程序。其形式有兩種: #include<文件名>一般用于C++提供的庫函數。C++編譯程序按標準方式搜索,即系統(tǒng)到存放C++庫函數頭文件的include子目錄中尋找要包含的文件。2.1.2C++程序基本組成分析程序Li1_1.cpp2.1.2C++程序基本組成 #include“文件名”這種形式一般用于程序員自己開發(fā)的模塊。C++編譯程序首先在當前工作目錄中搜索,若沒有,再按標準方式搜索。2.1.2C++程序基本組成 2.1.2C++程序基本組成程序Li2_1.cpp中的第1行代碼#include<iostream>是編譯預處理中的文件包含命令,它的作用是在編譯之前將文件iostream的內容增加到源程序Li2_1.cpp該命令所在的地方。文件iostream設置了C++的I/O相關環(huán)境,定義了輸入/輸出流類對象cout與cin等,程序要在屏幕上輸入/輸出時,需要包含該文件。2.1.2C++程序基本組成程序Li2_1.cppC++編譯系統(tǒng)提供的頭文件有兩類:一類是標準的C++庫頭文件,這些頭文件不帶“.h”;這種寫法也適合標準的C庫頭文件,但是必須使用前綴字符“c”。例如:#include<cmath>//相當于#include<math.h>另一類是非準的C++庫頭文件,這些頭文件帶“.h”。在連接時,編譯系統(tǒng)會根據頭文件名自動確定連接哪一個庫。2.1.2C++程序基本組成使用標準C++庫時,在所有的include指令之后,需要加入語句:usingnamespacestd;C++編譯系統(tǒng)提供的頭文件有兩類:2.1.2C++程序2.針對名字空間的指令一個軟件往往由多個模塊組合而成,其中包括由不同的程序員開發(fā)的組件及類庫提供的組件,這樣不同模塊間在對標識符命名時就有可能發(fā)生命名沖突,簡單地說,就是在不同的模塊中使用相同名字表示不同的事物,這樣當然會引起程序出錯。C++提供名字空間來防止命名的沖突。2.1.2C++程序基本組成2.針對名字空間的指令2.1.2C++程序基本組成2.1.2C++程序基本組成程序Li2_1.cpp中的語句usingnamespacestd;是針對名字空間的指令。告訴編譯程序此程序中所有的標識符都在std名字空間中,標識符都可以直接使用而不會發(fā)生命名的沖突。2.1.2C++程序基本組成程序Li2_1.cpp2.1.2C++程序基本組成代碼段intmain(){cout<<"hello,students!"<<endl;return0; }3.主函數部分定義一個名為main的主函數,每個C++程序都必須有且只能有一個主函數main(),它是程序執(zhí)行的起點。一般來說,所有函數,包括main函數,都必須指明其返回類型。2.1.2C++程序基本組成代碼段3.主函數部分定義4.注釋部分C++提供了兩種注釋方式:一種注釋方式是從“//”開始,直到行尾,都將被計算機當作注釋。另一種是使用“/*……*/”,將要注釋的部分括起。一般情況下,多行注釋使用“/*……*/”,而短的注釋較多使用“//”。2.1.2C++程序基本組成返回本節(jié)4.注釋部分2.1.2C++程序基本組成返回本節(jié)2.2簡單的輸入/輸出返回首頁2.2.1

鍵盤輸入2.2.2屏幕輸出C++本身沒有定義輸入/輸出操作,而是由一個I/O流類庫提供的。流類對象cin和cout分別代表標準的輸入設備和輸出設備。它們在文件iostream聲明。2.2簡單的輸入/輸出返回首頁2.2.1鍵盤輸入返回本節(jié)2.2.1鍵盤輸入在C++中輸入操作可理解為從輸入流對象中提取數據,故稱為提取操作。鍵盤輸入是標準輸入,其一般形式可表示為:cin>>變量1>>變量2>>…>>變量n;其中,cin是預定義的標準輸入流對象,>>是輸入操作符,也稱提取運算符。返回本節(jié)2.2.1鍵盤輸入在C++中輸入操作可理2.2.2屏幕輸出在C++中輸出操作可理解為將數據插入到輸出流對象中,故稱為插入操作。屏幕輸出是標準輸出操作,用來將表達式的結果輸出到顯示器的屏幕上。其一般形式可表示為:cout<<表達式1<<表達式2<<…<<表達式n;其中,cout是預定義的標準輸出流對象,<<是輸出操作符,也稱插入運算符。用它可以輸出各種不同類型的數據。在輸出時若要換行,可使用控制符endl,2.2.2屏幕輸出在C++中輸出操作可理解為將數2.2.2屏幕輸出【例2.2】分析下列程序的輸出結果。學會使用輸入、輸出方法。2.2.2屏幕輸出【例2.2】分析下列程序的輸出結果。學2.2.2屏幕輸出返回本節(jié)2.2.2屏幕輸出返回本節(jié)2.3指針與引用返回首頁2.3.1

指針2.3.2引用2.3指針與引用返回首頁2.3.1指針2.3.1指針指針是一種特殊的對象,指針的類型是它所指向對象的類型,它的值是它所指向對象的地址值。1.指針的值和類型指針具有一般對象的三個要素:名字、類型和值。指針的命名與一般對象的命名是相同的,它與一般對象的區(qū)別在于類型和值上。2.3.1指針指針是一種特殊的對象,指針的類型是2.3.1指針2.指針的定義格式使用一個指針之前要先定義。具體格式如下:〈類型〉*〈指針名1〉,*〈指針名2〉,…;其中,〈類型〉為指針的基類型,可以是系統(tǒng)提供的基本類型,也可以是用戶自定義類型。2.3.1指針2.指針的定義格式2.3.1指針例如:int*p1;//定義一個指向int型的指針p1char*p2;//定義一個指向char型的指針p2float*p3;//定義一個指向float型的指針p32.3.1指針例如:2.3.1指針3.指針的運算符專門為指針準備的兩個運算符:&:表示取其對象的地址值*:表示取其所指向的對象值上面定義的指針p1,p2,p3只是指向某種類型,必須給指針賦值后才具體地指向某個對象。2.3.1指針3.指針的運算符2.3.1指針如執(zhí)行語句intp;int*p1;p1=&p;//&是一個取地址的運算符后p1才指向具體的p。2.3.1指針如執(zhí)行語句2.3.1指針【例2.3】分析程序結果,體會指針的值、地址與指針所指向的對象的值、地址的含義。返回本節(jié)2.3.1指針【例2.3】分析程序結果,體會指針的值、地2.3.2引用所謂引用,就是給對象起一個別名,使用該別名可以存取該對象。換句話說,是使新對象和原對象共用一個地址。1.引用的定義格式<類型說明符>&<引用名>=<對象名>例如:inta;int&ta=a;其中,ta是一個引用名,即ta是對象a的別名,ta和a都是int型的。2.3.2引用所謂引用,就是給對象起一個2.3.2引用【例2.4】分析下列程序的輸出結果,并分析引用的說明和用法。2.3.2引用【例2.4】分析下列程序的輸出結果,并分析返回本節(jié)2.3.2引用在C++程序中,引用的主要用途是用作函數參數和函數的返回值。使用引用時要注意以下幾點:建立引用時,必須要用某個對象對它初始化引用不是變量,它本身沒有地址值引用在初始化被綁定到某個對象上后,將只能永遠綁定到這個對象。沒有空引用。下面語句是錯誤的。int&ri=NULL;返回本節(jié)2.3.2引用在C++程序中,引2.4函數返回首頁2.4.1函數的定義與調用2.4.2函數原型與帶默認參數的函數2.4.3函數的參數傳遞2.4.4內聯(lián)函數與重載函數2.4.5標準庫函數2.4函數返回首頁2.4.1函數的定義與調用2.4.1函數的定義與調用函數是面向對象程序設計中對功能的抽象,它封裝或隱藏了一些程序的代碼和數據。函數需要先定義,后使用。1.函數的定義C++有兩種函數:標準庫函數和用戶自定義的函數。自定義函數的形式與主函數的形式相似,一般為:〈返回值類型〉〈函數名〉(〈形式參數表〉){〈函數體〉}2.4.1函數的定義與調用函數是面向對象程序設計2.4.1函數的定義與調用2.函數調用函數的使用是通過函數調用實現的。函數調用指定了被調用函數的名字和調用函數所需的信息(參數)。調用函數所需提供的參數實際參數,簡稱實參。函數調用的一般形式為:函數名(〈實參表〉)其中,〈實參表〉中的各參數用逗號分隔,實參可以是常量、變量或表達式,與被調用函數形參的個數和類型必須相符。2.4.1函數的定義與調用2.函數調用2.4.1函數的定義與調用【例2.5】通過調用兩數和的函數,求3個數的和。返回本節(jié)2.4.1函數的定義與調用【例2.5】通過調用兩數和的函2.4.2函數原型與帶默認參數的函數1.函數原型函數原型體現了函數的聲明風格。它標識一個函數的返回類型,同時也標識該函數參數的個數與類型,這將作為編譯程序進行類型檢查及函數匹配的依據。函數原型由函數首部加上分號組成。例如:intsum(intx,inty);2.4.2函數原型與帶默認參數的函數1.函數原型2.4.2函數原型與帶默認參數的函數2.帶默認參數的函數在C++中,在函數原型中可以為一個或多個參數指定默認值。當進行函數調用時,編譯器按從左向右的順序將實參與形參結合,若未指定足夠的實參,則編譯器按同樣的順序用函數聲明中的默認值來補足所缺少的實參。對函數參數設置默認值要注意以下幾點:2.4.2函數原型與帶默認參數的函數2.帶默認參數的函2.4.2函數原型與帶默認參數的函數若沒有聲明函數原型,參數的默認值可在函數定義的頭部進行設置,否則必須在函數原型中進行設置。在一個指定了默認值的參數的右邊,不能出現沒有指定默認值的參數。設置默認參數可使用表達式,但表達式中不可用局部變量。2.4.2函數原型與帶默認參數的函數若沒有聲明函數原型2.4.2函數原型與帶默認參數的函數【例2.6】函數原型與帶默認參數的函數的用法。返回本節(jié)2.4.2函數原型與帶默認參數的函數【例2.6】函數原型2.4.3函數的參數傳遞函數被調用前,形參沒有存儲空間,也沒有實際的值。函數被調用時,系統(tǒng)建立與實參對應的形參存儲空間,函數通過形參與實參通信、進行操作。函數執(zhí)行完畢,系統(tǒng)收回作為形參的臨時存儲空間。這個過程稱為參數傳遞或參數的虛實結合。C++有兩種參數傳遞機制:值傳遞(值調用)和引用傳遞(引用調用)。2.4.3函數的參數傳遞函數被調用前,2.4.3函數的參數傳遞1.值傳遞在值傳遞機制中,作為實參表達式的值被復制到由對應的形參名所標識的一個對象中,作為形參的初始值。數據的傳遞是單向的。2.4.3函數的參數傳遞1.值傳遞2.4.3函數的參數傳遞【例2.7】示例值傳遞的方式交換兩個對象的值。2.4.3函數的參數傳遞【例2.7】示例值傳遞的方式交2.4.3函數的參數傳遞2.引用傳遞使用引用作函數的形參時,調用函數的實參要用變量名。實參傳遞給形參,相當于在被調用函數中使用了實參的別名。于是,在被調用函數中對形參的操作,實質是對實參的直接操作,即數據的傳遞是雙向的。2.4.3函數的參數傳遞2.引用傳遞2.4.3函數的參數傳遞【例2.8】將引用作為參數,編寫函數,交換兩個對象的值。2.4.3函數的參數傳遞【例2.8】將引用作為參數,編2.4.3函數的參數傳遞

C++引入引用的目的為了方便函數間數據的傳遞。引用的另一個主要用途是用于返回引用的函數,即引用返回。2.4.3函數的參數傳遞C++引入引用2.4.3函數的參數傳遞【例2.9】定義一個函數,返回兩個數較大值的引用。2.4.3函數的參數傳遞【例2.9】定義一個函數,返回2.4.3函數的參數傳遞

引用返回的主要目的是為了將該函數用在賦值運算符的左邊?!纠?.10】定義一個引用返回函數,并將該函數用在賦值運算符的左邊。返回本節(jié)2.4.3函數的參數傳遞引用返回的主要2.4.4內聯(lián)函數與重載函數1.內聯(lián)函數內聯(lián)函數是使用inline關鍵字聲明一個函數,也稱內嵌函數,它主要是解決程序的運行效率。其定義格式如下:inline〈返回值類型〉〈函數名〉(〈形式參數表〉){

〈函數體〉}2.4.4內聯(lián)函數與重載函數1.內聯(lián)函數2.4.4內聯(lián)函數與重載函數使用內聯(lián)函數應注意:遞歸函數不能定義為內聯(lián)函數內聯(lián)函數一般適合于不含有switch和while等復雜的結構且只有1~5條語句的小函數,否則編譯系統(tǒng)將該函數視為普通函數內聯(lián)函數只能先定義后使用,否則編譯系統(tǒng)也將該函數視為普通函數對內聯(lián)函數也不能進行異常接口聲明2.4.4內聯(lián)函數與重載函數使用內聯(lián)函數應注意:2.4.4內聯(lián)函數與重載函數2.重載函數重載函數通常用來對具有相似行為而數據類型不同的操作提供—個通用的名稱。編譯系統(tǒng)將根據函數參數的類型和個數來判斷使用哪一個函數。C++要求重載的函數具有不同的簽名。函數簽名包括:函數名參數的個數、數據類型和順序2.4.4內聯(lián)函數與重載函數2.重載函數2.4.4內聯(lián)函數與重載函數【例2.11】示例內聯(lián)函數與重載函數的用法。返回本節(jié)2.4.4內聯(lián)函數與重載函數【例2.11】示例內聯(lián)函數2.4.5標準庫函數1.常用數值函數除偽隨機數發(fā)生函數的原型在cstdlib頭文件中以外,其他所有數值函數的原型都定義在cmath頭文件中。表2.1給出了一些常用數值函數的功能。2.常用字符函數常用字符函數的原型定義在ctype.h頭文件中。表2.2給出了一些常用字符函數及說明。2.4.5標準庫函數1.常用數值函數2.4.5標準庫函數【例2.12】從鍵盤輸入一個正整數,求出它的平方根。示例標準庫函數用法。返回本節(jié)2.4.5標準庫函數【例2.12】從鍵盤輸入一個正整數2.5new和delete運算符C++中使用new、new[]、delete和delete[]運算符來進行動態(tài)內存分配與釋放。運算符new分配一個空間;new[]分配—個數組;delete釋放由new分配的單—空間;delete[]釋放由new[]分配的數組。2.5new和delete運算符C+2.5new和delete運算符【例2.13】演示new和delete的基本用法返回首頁2.5new和delete運算符【例2.13】演示n2.6其他若干重要的C++特性返回首頁2.6.1符號常量2.6.2變量的定義2.6.3強制類型轉換2.6.4string類型2.6.5結構2.6其他若干重要的C++特性返回首頁2.6.1符2.6.1符號常量C++使用const修飾符來定義符號常量。例如:

constfloatpi=3.14159;或floatconstpi=3.14159;返回本節(jié)2.6.1符號常量C++使用const修飾符來定2.6.2變量的定義在C++中,任何一個變量在被使用之前必須被定義。C++中的變量可以在程序中隨時定義,不必集中在程序之前。返回本節(jié)2.6.2變量的定義在C++中,任何一個變量在被2.6.3強制類型轉換C++中有如下兩種強制類型轉換形式:<類型說明符><(表達式)>或(<類型說明符>)<表達式>例如:inti;floatx=float(i);或inti;floatx=(float)i;返回本節(jié)2.6.3強制類型轉換C++中有如下兩種強制類型轉換形式2.6.4string類型C++提供string類型來代替C語言的以null結尾的char類型數組。使用string類型必須包含頭文件string。2.6.4string類型C++提供st2.6.4string類型【例2.14】演示string類型的基本用法返回本節(jié)2.6.4string類型【例2.14】演示string2.6.5結構C++中的結構與C語言結構不同。struct不需要出現在結構變量定義的地方。例如:給定如結構聲明:structPoint{doublex,y;};我們可以用如下方式定義結構變量:

Pointp1,p2;

返回本節(jié)2.6.5結構C++中的結構與C語言結構不同。s2.7應用實例返回首頁編寫一個學生成績管理程序。建一個單鏈表,要求能輸入和打印學生成績,并求出所有學生的平均成績。目的:了解C++程序的基本結構,掌握C++語言所引入的一些新的語言成分在程序中的運用。2.7應用實例返回首頁編寫一個學生成績管理程序。建一個第3章類與對象3.1類3.2對象3.3構造函數與析構函數3.4this指針3.5子對象和堆對象3.6類的靜態(tài)成員3.7類的友元3.8應用實例第3章類與對象3.1類3.1類返回首頁3.1.1

類的定義3.1.2類成員的訪問控制3.1.3成員函數的實現3.1類返回首頁3.1.1類的定義3.1.1類的定義C++語言的類:是一種用戶自己定義的數據類型,和其他數據類型不同的是,組成這種類型的不僅可以有數據,而且可以有對數據進行操作的函數。C++規(guī)定,任何數據類型都必須先定義后使用,類也不例外。3.1.1類的定義C++語言的類:3.1.1類的定義返回本節(jié)一般形式為:

class類名{public:<公有數據和函數>protected:<保護數據和函數>private:<私有數據和函數>};有效的C++標識符,不能是關鍵字,以大寫字母開始數據成員和成員函數分號“;”類聲明的結束標志不能漏掉3.1.1類的定義返回本節(jié)一般形式為:有效的C++標識符3.1.2類成員的訪問控制關鍵字public、protected和private用于控制類中成員在程序中的可訪問性。public:公有protected:保護private:私有所有成員缺省定義為private的。公有成員定義了類的外部接口。私有成員是被隱藏的數據,只有該類的成員函數或友元函數才可以引用它。保護成員具有公有成員和私有成員的雙重性質,可以被該類或派生類的成員函數或友元函數引用。返回本節(jié)3.1.2類成員的訪問控制關鍵3.1.3成員函數的實現成員函數的實現,可以放在類體內,也可以放在類體外,但必須在類體內給出原型說明。放在類體內定義的函數被默認為內聯(lián)函數,而放在類體外定義的函數是一般函數,如果要定義為內聯(lián)函數則需在前面加上關鍵字inline。3.1.3成員函數的實現成員函3.1.3成員函數的實現在類體外定義成員函數的一般形式為:<返回類型><類名>::<成員函數名>(<參數說明>){類體}“::”稱為作用域運算符,“<類名>::”表明其后的成員函數是在這個類中聲明的。3.1.3成員函數的實現在類體外定義成員函數的一般形式3.1.3成員函數的實現【例3.1】定義一個點類(Point),示例類體內實現成員函數3.1.3成員函數的實現【例3.1】定義一個點類(Po3.1.3成員函數的實現【例3.2】定義一個點類(Point),示例類體外實現成員函數3.1.3成員函數的實現【例3.2】定義一個點類(Po3.1.3成員函數的實現為了減少代碼的重復,加快編譯速度,在大型程序設計中,C++的類結構常常被分成兩部分:一部分是類的界面,另一部分是類的實現。在類的界面中僅包括類的所有數據成員以及成員函數的函數原型,放在頭文件中,供所有相關應用程序共享。而對于類的實現,即成員函數實現則放在與頭文件同名的源文件中,便于修改。這種做法還有利于為一個類的同一界面提供不同的內部實現。3.1.3成員函數的實現為了減少代碼的重復,加3.1.3成員函數的實現【例3.3】按類的界面與類的實現兩部分來重新定義一個點類(Point)。//文件Li3_3.h點類的界面部分返回本節(jié)3.1.3成員函數的實現【例3.3】按類的界面與類的實3.2對象返回首頁3.2.1

對象的聲明3.2.2對象的創(chuàng)建和銷毀3.2.3對象成員的訪問3.2對象返回首頁3.2.1對象的聲明返回本節(jié)3.2.1對象的聲明類實際上是由一個類定義的類型,稱為類類型。具有類類型的變量稱為對象。

對象的聲明與普通變量相似,一般格式為:<類名><對象名表>;例如,聲明類Point的對象:Pointp1,p2,*pdate,p[3],&rp=p1;返回本節(jié)3.2.1對象的聲明類實際上是由一個3.2.2對象的創(chuàng)建和銷毀在程序運行時,通過為對象分配存儲空間來創(chuàng)建對象。創(chuàng)建對象時,類被用作樣板,對象稱為類的實例。為對象分配存儲空間主要有靜態(tài)分配和動態(tài)分配兩種方式。堆對象是在程序運行時根據需要隨時可以被創(chuàng)建或刪除的對象,只有堆對象采用動態(tài)分配方式,3.2.2對象的創(chuàng)建和銷毀在程序運行時,通過為對3.2.2對象的創(chuàng)建和銷毀靜態(tài)分配方式:在聲明對象時分配存儲空間,對象生命期結束時收回所分配存儲空間。在這種分配方式下,對象的創(chuàng)建和銷毀是由程序本身決定的。例如聲明:

Pointp1,p2,p[3];

時,即創(chuàng)建對象p1,p2和對象數組p。3.2.2對象的創(chuàng)建和銷毀靜態(tài)分配方式:在聲明對3.2.2對象的創(chuàng)建和銷毀動態(tài)分配方式:建立新的對象時,使用運算符new在堆中為其分配內存空間;對象使用完畢需要銷毀時,使用運算符delete來釋放它所占用的自由內存空間。在這種分配方式下,對象的創(chuàng)建和銷毀是由程序員決定的。例如聲明:Point*pdate;時,只創(chuàng)建了對象指針pdate,并沒有創(chuàng)建pdate所指向的對象。返回本節(jié)3.2.2對象的創(chuàng)建和銷毀動態(tài)分配方式:建立新的3.2.3對象成員的訪問用成員選擇運算符“.”訪問一般對象的成員:<對象名>.<數據成員名><對象名>.<成員函數名>(<參數表>)用成員選擇運算符“.”訪問對象引用的成員:<對象引用名>.<數據成員名><對象引用名>.<成員函數名>(<參數表>)3.2.3對象成員的訪問用成員選擇運算符“.”訪問一般對3.2.3對象成員的訪問用成員選擇運算符“->”訪問對象指針的成員:<對象指針名>-><數據成員名><對象指針名>-><成員函數名>(<參數表>)或者(*<對象指針名>).<數據成員名>(*<對象指針名>).<成員函數名>(<參數表>)3.2.3對象成員的訪問用成員選擇運算符“->”訪問對象3.2.3對象成員的訪問【例3.4】利用例3.3中定義的類,示例對象的聲明和對成員訪問方法。返回本節(jié)3.2.3對象成員的訪問【例3.4】利用例3.3中定義的3.3構造函數與析構函數返回首頁3.3.1構造函數3.3.2析構函數3.3.3拷貝構造函數3.3構造函數與析構函數返回首頁3.3.1構造函數3.3.1構造函數對象的數據成員反映了該對象的內部狀態(tài),但在類聲明中,無法用表達式初始化這些數據成員,因而數據成員的初始值是不確定的。在聲明對象的時候進行的數據成員設置,稱為對象的初始化。在特定對象使用結束時,還經常需要進行一些清理工作。C++程序中的初始化和清理工作,分別由兩個特殊的成員函數來完成,即構造函數與析構函數。3.3.1構造函數對象的數據成員反映了該對象的內3.3.1構造函數構造函數的特點構造函數是一種特殊的成員函數,對象的創(chuàng)建和初始化工作可以由它來完成,其格式如下:<類名>::<類名>(<形參表>){〈函數體〉}3.3.1構造函數構造函數的特點3.3.1構造函數構造函數應該被聲明為公有函數,因為它是在創(chuàng)建對象的時侯被自動調用。構造函數特點:函數名與類名相同可以重載不能指定返回類型不能被顯式調用3.3.1構造函數構造函數應該被聲明為公有函數,3.3.1構造函數2.默認構造函數默認構造函數就是無參數的構造函數。既可以是自己定義的,也可以是編譯系統(tǒng)自動生成的。當沒有為一個類定義任何構造函數的情況下,編譯系統(tǒng)就會自動生成一個無參數、空函數體的默認構造函數。其格式如下:<類名>::<類名>(){}3.3.1構造函數2.默認構造函數3.3.1構造函數【例3.5】修改例3.2中定義的類,示例構造函數的用法。返回本節(jié)3.3.1構造函數【例3.5】修改例3.2中定義的類,示3.3.2析構函數1.析構函數的特點析構函數也是一種特殊的成員函數,它的作用是在對象消失時執(zhí)行一項清理任務,例如,可以用來釋放由構造函數分配的內存等。其格式如下:~<類名>::<類名>(){〈函數體〉}3.3.2析構函數1.析構函數的特點3.3.2析構函數析構函數也只能被聲明為公有函數。析構函數有如下特點:析構函數的名字同類名,與構造函數名的區(qū)別在于析構函數名前加~,表明它的功能與構造函數的功能相反析構函數沒有參數,不能重載,一個類中只能定義一個析構函數不能指定返回類型析構函數在釋放一個對象時侯被自動調用。它能被顯式調用,但不提倡。3.3.2析構函數析構函數也只能被聲明為3.3.2析構函數2.默認析構函數如果一個類中沒有定義析構函數時,系統(tǒng)將自動生成一個默認析構函數,其格式如下:<類名>::~<類名>(){}3.3.2析構函數2.默認析構函數3.3.2析構函數【例3.6】修改例3.2中定義的類,示例析構函數的用法。//程序Li3_6.cpp點類的界面部分返回本節(jié)3.3.2析構函數【例3.6】修改例3.2中定義的類,示3.3.3拷貝構造函數1.拷貝構造函數的特點拷貝構造函數是一種特殊的構造函數,它的作用是用一個已經存在的對象去初始化另一個對象。為了保證所引用的對象不被修改,通常把引用參數聲明為const參數。其格式為:<類名>::<類名>(const<類名>&<對象名>){〈函數體〉}3.3.3拷貝構造函數1.拷貝構造函數的特點3.3.3拷貝構造函數拷貝構造函數具有一般構造函數的特性,其特點如下:拷貝構造函數名字與類相同,不能指定返回類型拷貝構造函數只有一個參數,該參數是該類的對象的引用它不能被顯式調用。在以下3種情況下會被自動調用:3.3.3拷貝構造函數拷貝構造函數具有一3.3.3拷貝構造函數當用類的一個對象去初始化該類的另一個對象時當函數的形參是類的對象,進行形參和實參結合時當函數的返回值是類的對象,函數執(zhí)行完成返回調用者時3.3.3拷貝構造函數當用類的一個對象去初始化該類的另3.3.3拷貝構造函數2.默認拷貝構造函數如果一個類中沒有定義拷貝構造函數,則系統(tǒng)自動生成一個默認拷貝構造函數。該函數的功能是將已知對象的所有數據成員的值拷貝給對應的對象的所有數據成員。3.3.3拷貝構造函數2.默認拷貝構造函數3.3.3拷貝構造函數【例3.7】分析下面程序的執(zhí)行過程,了解拷貝構造函數的用法。返回本節(jié)3.3.3拷貝構造函數【例3.7】分析下面程序的執(zhí)行過程3.4this指針同一類的各個對象創(chuàng)建后,都在類中產生自己成員的副本。對象在副本中與成員函數建立關系是通過C++為成員函數提供的一個稱為this的指針來進行的。當創(chuàng)建一個對象時,this指針就初始化指向該對象。當某一對象調用一個成員函數時,this指針將作為一個變元自動傳給該函數。所以,不同的對象調用同一個成員函數時,編譯器根據this指針來確定應該引用哪一個對象的數據成員。3.4this指針同一類的各個對象創(chuàng)建后,都在3.4this指針this指針是由C++編譯器自動產生且較常用的一個隱含對象指針,它不能被顯式聲明。this指針是一個局部量,局部于某個對象。this指針是一個常量,它不能作為賦值、遞增、遞減等運算的目標對象。只有非靜態(tài)類成員函數才擁有this指針,并通過該指針來處理對象。3.4this指針this指針是由C++編譯器自動產3.4this指針【例3.8】分析下面程序,體會this指針的隱式使用3.4this指針【例3.8】分析下面程序,體會thi3.4this指針【例3.9】分析程序結果,體會this指針的顯式使用。返回首頁3.4this指針【例3.9】分析程序結果,體會thi3.5子對象和堆對象返回首頁3.5.1子對象3.5.2堆對象3.5子對象和堆對象返回首頁3.5.1子對象3.5.1子對象一個對象作為另一個類的成員時,該對象稱為類的子對象。子對象實際上是某個類的數據成員。說明形式為:class<X>{<類名1><子對象1><類名2><子對象2>……<類名n><子對象n>};3.5.1子對象一個對象作為另一個類的成3.5.1子對象classA{…};classB{…private:Aa;…};例如:3.5.1子對象classAclassB例如:3.5.1子對象2.子對象的初始化為初始化子對象,X的構造函數要調用這些對象成員所在類的構造函數,于是X類的構造函數中就應包含數據成員初始化列表,用來給子對象進行初始化。3.5.1子對象2.子對象的初始化3.5.1子對象X類的構造函數的定義形式如下:<X>::<X>(<參數表0>):<成員1>(<參數表1>),<成員2>(<參數表2>),…,<成員n>(<參數表n>){……}3.5.1子對象X類的構造函數的定義形式如下:3.5.1子對象對子對象的構造函數的調用順序取決于這些子對象在類中說明的順序,與它們在成員初始化列表中給出的順序無關。當建立X類的對象時,先調用子對象的構造函數,初始化子對象,然后才執(zhí)行X類的構造函數,初始化X類中的其他成員。3.5.1子對象對子對象的構造函數的調用3.5.1子對象【例3.10】分析下面程序中構造函數與析構函數的調用順序。3.5.1子對象【例3.10】分析下面程序中構造函數與析3.5.1子對象Whole類的缺省構造函數沒有給出成員初始化列表,這表明子對象將使用缺省構造函數進行初始化。例如:intmain(){Wholew;//調用缺省構造函數return0;}3.5.1子對象Whole類的缺省構造函數3.5.1子對象程序的輸出為:DefaultconstructorofPartDefaultconstructorofPartDestructorofWholeDestructorofPart,0DestructorofPart,0在這種情況下,Whole類必須定義一個缺省構造函數

3.5.1子對象程序的輸出為:在這種情況下,Whole3.5.1子對象該例類Whole中數據成員只含有2個子對象,它的構造函數的成員初始化列表中含有2個對子對象進行初始化的選項。如果該類中還有其他數據成員,其初始化也可通過成員初始化列表進行。例如:3.5.1子對象該例類Whole中數據成3.5.1子對象classWhole{public:Whole(inti);Whole(){};~Whole();private:Partp1;Partp2;intdata;};3.5.1子對象classWhole3.5.1子對象為了初始化數據成員data,這時該構造函數也可以定義成如下格式:Whole::Whole(inti,j):p1(),p2(i),data(j){……}返回本節(jié)3.5.1子對象為了初始化數據成員dat3.5.2堆對象堆對象:是在程序運行時根據需要隨時可以被創(chuàng)建或刪除的對象。在虛擬的程序空間中存在一些空閑存儲單元,這些空閑存儲單元組成所謂的堆。C++程序的內存格局通常分為4個區(qū):數據區(qū)代碼區(qū)棧區(qū)堆區(qū)(即自由存儲區(qū))3.5.2堆對象堆對象:是在程序運行時根據需要隨時可以被3.5.2堆對象1.使用運算符new創(chuàng)建堆對象使用new運算符可以動態(tài)地創(chuàng)建對象,即堆對象。使用語法為:new<類型說明符>(<初始值列表>)例如:HeapObjectClass*pa;pa=new(3,7);3.5.2堆對象1.使用運算符new創(chuàng)建堆對象3.5.2堆對象2.使用運算符delete刪除堆對象該運算符專門用來釋放由運算符new所創(chuàng)建的對象。其使用語法為:delete<指針名>例如:deletepa;3.5.2堆對象2.使用運算符delete刪除堆對象3.5.2堆對象【例3.11】分析下列程序的輸出結果,注意運算符new和delete的用法。3.5.2堆對象【例3.11】分析下列程序的輸出結果,注3.5.2堆對象3.使用運算符new[]創(chuàng)建對象數組其使用語法為:new<類型說明符>[<算術表達式>]其中,<算術表達式>給出數組的大小,后面不能再跟構造函數參數,所以,從堆上分配對象數組,只能調用默認的構造函數,不能調用其他任何構造函數。例如:ObjectArrayClass*ptr;ptr=newHeapObjectClass[15];3.5.2堆對象3.使用運算符new[]創(chuàng)建對象數組3.5.2堆對象4.使用運算符delete[]刪除對象數組其格式如下:delete[]<指針名>其中,<指針名>必須是指向new[]所創(chuàng)建的對象數組,且必須是new[]所返回的值。3.5.2堆對象4.使用運算符delete[]刪除3.5.2堆對象【例3.12】分析下列程序的輸出結果,注意運算符new[]和delete[]的用法。3.5.2堆對象【例3.12】分析下列程序的輸出結果,注3.6類的靜態(tài)成員返回首頁3.6.1靜態(tài)數據成員3.6.2靜態(tài)成員函數3.6類的靜態(tài)成員返回首頁3.6.1靜態(tài)數據成員3.6.1靜態(tài)數據成員靜態(tài)成員是指聲明為static的類成員,包括靜態(tài)數據成員和靜態(tài)成員函數,在類的范圍內所有對象共享該數據。靜態(tài)數據成員不屬于任何對象,它是類定義的一部分。類中的靜態(tài)數據成員不同于一般的靜態(tài)變量,也不同于其他的類數據成員。它在程序開始運行時創(chuàng)建而不是在對象創(chuàng)建時創(chuàng)建。它所占空間的回收也不是在析構函數時進行而是在程序結束時進行。3.6.1靜態(tài)數據成員靜態(tài)成員是指聲明為stat3.6.1靜態(tài)數據成員1.靜態(tài)數據成員的初始化必須對靜態(tài)數據成員進行初始化,因為只有這時編譯程序才會為靜態(tài)數據成員分配一個具體的作儲空間。靜態(tài)數據成員的初始化與一般數據成員不同,它的初始化不能在構造函數中進行。靜態(tài)數據成員初始化的格式為:<數據類型><類名>::<靜態(tài)數據成員名>=<初始值>;3.6.1靜態(tài)數據成員1.靜態(tài)數據成員的初始化3.6.1靜態(tài)數據成員2.靜態(tài)數據成員的引用靜態(tài)數據成員可說明為公有的、私有的、或保護的。若為公有的可直接訪問,引用靜態(tài)數據成員的格式為:<類名>::<靜態(tài)數據成員>3.6.1靜態(tài)數據成員2.靜態(tài)數據成員的引用3.6.1靜態(tài)數據成員【例3.13】用靜態(tài)數據成員的控制點類,每次只允許一個對象訪問。3.6.1靜態(tài)數據成員【例3.13】用靜態(tài)數據成員的控制3.6.1靜態(tài)數據成員【例3.14】統(tǒng)計點類的對象數,示例靜態(tài)數據成員的記數作用。返回本節(jié)3.6.1靜態(tài)數據成員【例3.14】統(tǒng)計點類的對象數,示3.6.2靜態(tài)成員函數靜態(tài)成員函數的定義和其他成員函數一樣。在一般函數定義前加上static關鍵字。調用靜態(tài)成員函數的格式為:<類名>::<靜態(tài)成員函數名>(<參數表>);或<對象名>.<靜態(tài)成員函數名>(<參數表>);3.6.2靜態(tài)成員函數靜態(tài)成員函數的定義3.6.2靜態(tài)成員函數【例3.15】改寫例3.14,用靜態(tài)成員函數輸出點類的對象數。3.6.2靜態(tài)成員函數【例3.15】改寫例3.14,用靜3.6.2靜態(tài)成員函數【例3.16】用靜態(tài)成員函數輸出點的位置。返回本節(jié)3.6.2靜態(tài)成員函數【例3.16】用靜態(tài)成員函數輸出點3.7類的友元返回首頁3.7.1友元函數3.7.2友元類3.7類的友元返回首頁3.7.1友元函數3.7.1友元函數在類里聲明一個普通函數,加上關鍵字friend,就成了該類的友元函數,它可以訪問該類的一切成員。其原型為:friend<類型><友元函數名>(<參數表>);友元函數聲明的位置可在類的任何部位,既可在pubic區(qū),也可在protected區(qū)。其實現放在類的外部。3.7.1友元函數在類里聲明一個普通函數,加上關3.7.1友元函數【例3.17】用友元函數求兩點的距離。返回本節(jié)3.7.1友元函數【例3.17】用友元函數求兩點的距離。3.7.2友元類一個類可被聲明為另一個類的友元,該類被稱為友元類。假設有類A和類B,若在類B的定義中將類A聲明為友元,那么,類A被稱作類B的友元類,它所有的成員函數都可以訪問類B中的任意成員。友元類的聲明為:friend<類名>;3.7.2友元類一個類可被聲明為另一個類3.7.2友元類例3.18中,將整個教師類teacher看成是學生類student的友元類,教師可以給學生設置學號,輸入學生成績?!纠?.18】示例友元類的使用返回本節(jié)3.7.2友元類例3.18中,將整個教師類teacher3.8應用實例返回首頁用面向對象的方法重新編寫一個學生成績管理程序。要求能添加、編輯、查找、刪除學生有關信息。目的:區(qū)分面向過程與掌握面向對象的思想,掌握面向對象的思路及基本概念。3.8應用實例返回首頁用面向對象的方法重新編寫面向對象程序設計教程(C++語言描述)上面向對象程序設計教程(C++語言描述)上第1章面向對象程序設計概論1.1程序設計方法1.2面向對象程序設計的基本概念1.3面向對象程序設計語言1.4C++對面向對象程序設計方法的支持1.5C++程序的實現第1章面向對象程序設計概論1.1程序設計方法1.1程序設計方法1.1.1

結構化程序設計方法1.1.2

面向對象的程序設計方法返回首頁目前有兩種重要的程序設計方法:1.1程序設計方法1.1.1結構化程序設計方法返回首1.1.1結構化程序設計方法結構化程序設計的概念由瑞士計算機科學家1971年首次提出來,隨之出現了支持結構化程序設計方法的程序設計語言,例如C語言。

結構化程序設計方法:強調程序結構的規(guī)范性,強調程序設計的自頂向下,逐步求精的演化過程。在這種方法中,待解問題和程序設計語言中的過程緊密相聯(lián)。1.1.1結構化程序設計方法結構化程序設計的概1.1.1結構化程序設計方法例如要開發(fā)一個成績管理系統(tǒng),由于問題較復雜,我們將待解的問題分解成若干子問題:輸入成績處理成績打印成績待解問題將對應到main()函數,每個子問題對應到main()的調用函數1.1.1結構化程序設計方法例如要開發(fā)一個成績管理系統(tǒng)1.1.1結構化程序設計方法返回本節(jié)隨著程序規(guī)模與復雜性的增長,面向過程的結構化程序設計方法存在明顯的不足之處:數據安全性問題可維護性及可重用性差圖形用戶界面的應用程序,很難用過程來描述和實現,開發(fā)和維護也都很困難。1.1.1結構化程序設計方法返回本節(jié)隨著程序1.1.2面向對象程序設計方法在結構化程序設計方法中,程序可表示為:程序=數據結構+算法即程序的要素是數據結構和算法,數據結構是指利用計算機的離散邏輯來量化表達需要解決的問題,而算法則研究如何高效而快捷地組織解決問題的具體過程。1.1.2面向對象程序設計方法在結構化程序設計方法中,程1.1.2面向對象程序設計方法【例1.1】用C++語言描述,用結構化程序設計方法計算矩形的面積。1.1.2面向對象程序設計方法【例1.1】用C++語言描1.1.2面向對象程序設計方法在面向對象的程序設計方法中,對象是數據結構和算法的封裝體。根據這個定義,對象是計算機內存中的一塊區(qū)域。在對象中,不但存有數據,而且存有代碼,使得每個對象在功能上相互之間保持相對獨立。當然,對象之間存在各種聯(lián)系,但它們之間只能通過消息進行通信。程序可表示為:程序=對象+消息1.1.2面向對象程序設計方法在面向對象的程序設1.1.2面向對象程序設計方法【例1.2】用C++語言描述,用面向對象程序設計方法計算矩形的面積。1.1.2面向對象程序設計方法【例1.2】用C++語言描1.1.2面向對象程序設計方法通過這個程序可以知道面向對象程序程序的基本結構。一般情況下,面向對象程序都是由三個部分來構成:類的聲明、類的成員的實現和主函數。可見,在面向對象程序設計中,它著重于類的設計。類正是面向對象語言的基本程序模塊,通過類的設計,來完成實體的建模任務。1.1.2面向對象程序設計方法通過這個程序可以知1.1.2面向對象程序設計方法程序Li1_2比程序Li1_1看起來要煩瑣一些。但是,如果以RectangleArea類為基礎,通過繼承,可以很方便地派生出長方體等新的幾何體,實現代碼重用。面向對象程序設計方法提供了軟件重用、解決大問題和復雜問題的有效途徑,具有抽象性、封裝性、繼承性和多態(tài)性等特點。返回本節(jié)1.1.2面向對象程序設計方法程序Li1_2比程1.2面向對象程序設計的基本概念1.2.1

抽象1.2.2封裝1.2.3消息1.2.4繼承1.2.5多態(tài)返回首頁1.2面向對象程序設計的基本概念1.2.1抽象返回1.2.1抽象抽象就是忽略事物中與當前目標無關的非本質特征,而強調與當前目標有關的本質特征,從而找出事物的共性,并把具有共性的事物劃為一類,得到一個抽象的概念。1.2.1抽象抽象就是忽略事物中與當前目標無關的1.2.1抽象面向對象方法中的抽象:指對具體問題(對象)進行概括,抽出一類對象的公共性質并加以描述的過程。它包括兩個方面:數據抽象和行為抽象(或稱功能抽象、代碼抽象)。其中,數據抽象描述某類對象共有的屬性或狀態(tài),行為抽象描述某類對象的共有的行為或功能特征。將這兩方面抽象有機地結合,就形成了面向對象程序設計中的“對象”。還可以繼續(xù)抽象:把眾多相似的“對象”聚集起來,進一步抽象后就形成了“類”。1.2.1抽象面向對象方法中的抽象:指對具體問題(1.2.1抽象數據抽象:floatlength,width,Area;行為抽象:SetData(floatL,floatW);CompueteArea();OutputArea();分析程序清單Li1_2:如果不是計算矩形的面積,關注的特征可能是顏色、大小等。由此可見,對于同一個研究對象,由于所研究問題的側重點不同,就可能產生不同的抽象結果。返回本節(jié)1.2.1抽象數據抽象:分析程序清單Li1_2:如果不是1.2.2封裝在日常生活中,我們往往只想知道某件物品的功能,而不關心它是怎么工作的。對于程序設計亦是如此,當人們面對某段程序時,只關心它的執(zhí)行結果,而不關心實現過程以及過程中所用到的數據。封裝恰好滿足了這一需求。1.2.2封裝在日常生活中,我們往往只想知道某件1.2.2封裝面向對象方法中的封裝:就是將抽象出來的對象的屬性和行為結合成一個獨立的

溫馨提示

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

評論

0/150

提交評論