面向?qū)ο驝++ 第二章_第1頁(yè)
面向?qū)ο驝++ 第二章_第2頁(yè)
面向?qū)ο驝++ 第二章_第3頁(yè)
面向?qū)ο驝++ 第二章_第4頁(yè)
面向?qū)ο驝++ 第二章_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第2章章 從結(jié)構(gòu)到類的演變從結(jié)構(gòu)到類的演變2.1 結(jié)構(gòu)的演化結(jié)構(gòu)的演化2.2 從結(jié)構(gòu)演變一個(gè)簡(jiǎn)單的類從結(jié)構(gòu)演變一個(gè)簡(jiǎn)單的類2.3 C+面向?qū)ο蟪绦蛟O(shè)計(jì)特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)特點(diǎn)2.4 數(shù)據(jù)對(duì)象和數(shù)據(jù)類型數(shù)據(jù)對(duì)象和數(shù)據(jù)類型2.5 熟悉并使用類和對(duì)象熟悉并使用類和對(duì)象2.6 string對(duì)象數(shù)組與范型算法對(duì)象數(shù)組與范型算法2.7 結(jié)構(gòu)化程序設(shè)計(jì)典型例題結(jié)構(gòu)化程序設(shè)計(jì)典型例題2.8 活捉臭蟲保平安活捉臭蟲保平安2.1 結(jié)構(gòu)的演化結(jié)構(gòu)的演化 結(jié)構(gòu)由若干元素構(gòu)成,結(jié)構(gòu)由若干元素構(gòu)成,C語(yǔ)言中稱這些結(jié)構(gòu)元語(yǔ)言中稱這些結(jié)構(gòu)元素為素為結(jié)構(gòu)成員結(jié)構(gòu)成員,C+中稱為中稱為數(shù)據(jù)成員數(shù)據(jù)成員。能夠做數(shù)據(jù)。能夠做數(shù)據(jù)成

2、員的不只是基本數(shù)據(jù)類型的變量,還可以是構(gòu)造成員的不只是基本數(shù)據(jù)類型的變量,還可以是構(gòu)造類型(數(shù)組、指針甚至是其他類型的結(jié)構(gòu))變量。類型(數(shù)組、指針甚至是其他類型的結(jié)構(gòu))變量。 C+的結(jié)構(gòu)中可以有函數(shù)。其實(shí),類確實(shí)是從的結(jié)構(gòu)中可以有函數(shù)。其實(shí),類確實(shí)是從結(jié)構(gòu)演變而來(lái),開始稱為結(jié)構(gòu)演變而來(lái),開始稱為“帶類的帶類的C”。這場(chǎng)革命就。這場(chǎng)革命就是從讓結(jié)構(gòu)含有函數(shù)開始的。是從讓結(jié)構(gòu)含有函數(shù)開始的。2.1.1 結(jié)構(gòu)發(fā)生質(zhì)的演變結(jié)構(gòu)發(fā)生質(zhì)的演變1. 函數(shù)與數(shù)據(jù)共存函數(shù)與數(shù)據(jù)共存C+允許結(jié)構(gòu)中可以定義函數(shù),這些函數(shù)稱為允許結(jié)構(gòu)中可以定義函數(shù),這些函數(shù)稱為成員函數(shù)成員函數(shù)。如果將原來(lái)的結(jié)構(gòu)成員稱為數(shù)據(jù)成員的話,

3、可以使用如下如果將原來(lái)的結(jié)構(gòu)成員稱為數(shù)據(jù)成員的話,可以使用如下的形式描述:的形式描述: struct 結(jié)構(gòu)名結(jié)構(gòu)名 數(shù)據(jù)成員數(shù)據(jù)成員 成員函數(shù)成員函數(shù) ; 可以像結(jié)構(gòu)變量或指針使用結(jié)構(gòu)成員那樣,使用成員可以像結(jié)構(gòu)變量或指針使用結(jié)構(gòu)成員那樣,使用成員函數(shù):函數(shù): 結(jié)構(gòu)變量結(jié)構(gòu)變量.成員函數(shù)成員函數(shù) 指向結(jié)構(gòu)變量指針的名字指向結(jié)構(gòu)變量指針的名字 - 成員函數(shù)成員函數(shù)假設(shè)為結(jié)構(gòu)假設(shè)為結(jié)構(gòu)Point設(shè)計(jì)一個(gè)設(shè)計(jì)一個(gè)Setxy函數(shù)如下:函數(shù)如下: void Setxy(double a, double b) x=a; y=b; 如果把域如果把域x和和y稱為結(jié)構(gòu)的稱為結(jié)構(gòu)的數(shù)據(jù)成員數(shù)據(jù)成員,則可,則可以使

4、用參數(shù)表中的以使用參數(shù)表中的a和和b賦給結(jié)構(gòu)變量的數(shù)據(jù)成賦給結(jié)構(gòu)變量的數(shù)據(jù)成員。假設(shè)有對(duì)象員。假設(shè)有對(duì)象(結(jié)構(gòu)變量結(jié)構(gòu)變量)a,則語(yǔ)句:,則語(yǔ)句: a.Setxy(12.5,14.5);使結(jié)構(gòu)變量使結(jié)構(gòu)變量a的的a.x=125, a.y=14.5。 【例【例2.1】結(jié)構(gòu)中使用成員函數(shù)的實(shí)例?!拷Y(jié)構(gòu)中使用成員函數(shù)的實(shí)例。#include using namespace std;struct Point double x, y; /數(shù)據(jù)成員數(shù)據(jù)成員 void Setxy(double a, double b) /成員函數(shù),用來(lái)成員函數(shù),用來(lái) /重新設(shè)置數(shù)據(jù)成員重新設(shè)置數(shù)據(jù)成員 x=a; y=b;

5、void Display() /成員函數(shù),按指定格式輸出成員函數(shù),按指定格式輸出 /數(shù)據(jù)成員的值數(shù)據(jù)成員的值 coutxtyDisplay(); /使用指向變量使用指向變量a的指針調(diào)用成員函數(shù)的指針調(diào)用成員函數(shù) coutxtyendl;程序運(yùn)行結(jié)果如下:程序運(yùn)行結(jié)果如下:10.6 18.510.6 18.510.6 18.5 主程序中的變量是通過(guò)結(jié)構(gòu)的成員函數(shù)使用數(shù)據(jù)成員,但最主程序中的變量是通過(guò)結(jié)構(gòu)的成員函數(shù)使用數(shù)據(jù)成員,但最后一條語(yǔ)句則是直接使用數(shù)據(jù)成員。這稱作結(jié)構(gòu)后一條語(yǔ)句則是直接使用數(shù)據(jù)成員。這稱作結(jié)構(gòu) Point的的公有公有(public)性質(zhì)。性質(zhì)。2. 封裝性封裝性所謂封裝性,就

6、是限制存取權(quán)限。如果在定義結(jié)所謂封裝性,就是限制存取權(quán)限。如果在定義結(jié)構(gòu)時(shí),將數(shù)據(jù)成員使用構(gòu)時(shí),將數(shù)據(jù)成員使用private關(guān)鍵字定義,則產(chǎn)關(guān)鍵字定義,則產(chǎn)生封裝性生封裝性。 【例【例2.2】使結(jié)構(gòu)具有封裝性的實(shí)例?!渴菇Y(jié)構(gòu)具有封裝性的實(shí)例。#include using namespace std;struct Point private: double x, y; /數(shù)據(jù)成員數(shù)據(jù)成員 public: void Setxy(double a, double b) /成員函數(shù)成員函數(shù) /用來(lái)重新設(shè)置數(shù)據(jù)成員用來(lái)重新設(shè)置數(shù)據(jù)成員 x=a; y=b; void Display() /成員函數(shù),按指定

7、格式成員函數(shù),按指定格式 /輸出數(shù)據(jù)成員的值輸出數(shù)據(jù)成員的值 coutxtyendl; 沒有使用沒有使用private定義的成員函數(shù),默認(rèn)為定義的成員函數(shù),默認(rèn)為public(也也可以直接使用可以直接使用public)。這時(shí),如果還使用。這時(shí),如果還使用【例【例2.1】的主】的主程序,則其最后一條語(yǔ)句就出現(xiàn)編譯錯(cuò)誤。也就是說(shuō),程序,則其最后一條語(yǔ)句就出現(xiàn)編譯錯(cuò)誤。也就是說(shuō),私私有的數(shù)據(jù)成員,必須通過(guò)有的數(shù)據(jù)成員,必須通過(guò)成員函數(shù)成員函數(shù)才能使用,這就稱為數(shù)才能使用,這就稱為數(shù)據(jù)的封裝性。據(jù)的封裝性。2.1.2 使用構(gòu)造函數(shù)初始化結(jié)構(gòu)的對(duì)象使用構(gòu)造函數(shù)初始化結(jié)構(gòu)的對(duì)象 因?yàn)橐驗(yàn)椤纠纠?.2】的

8、程序使結(jié)構(gòu)具有封裝性,所】的程序使結(jié)構(gòu)具有封裝性,所以不能使用初始化列表初始化結(jié)構(gòu)對(duì)象。為此,這以不能使用初始化列表初始化結(jié)構(gòu)對(duì)象。為此,這里為結(jié)構(gòu)里為結(jié)構(gòu)Point設(shè)計(jì)兩個(gè)專門用于初始化的函數(shù)。設(shè)計(jì)兩個(gè)專門用于初始化的函數(shù)。這兩個(gè)函數(shù)具有相同的名字這兩個(gè)函數(shù)具有相同的名字Point,其原型如下:,其原型如下: Point(); Point(double,double); 這是函數(shù)重載。因?yàn)檫@里的函數(shù)名與結(jié)構(gòu)同名,這是函數(shù)重載。因?yàn)檫@里的函數(shù)名與結(jié)構(gòu)同名,稱為稱為構(gòu)造函數(shù)構(gòu)造函數(shù)。構(gòu)造函數(shù)專門用于初始化對(duì)象。構(gòu)造函數(shù)專門用于初始化對(duì)象。【例【例2.3】使用構(gòu)造函數(shù)初始化對(duì)象的實(shí)例?!渴褂脴?gòu)造函

9、數(shù)初始化對(duì)象的實(shí)例。#include using namespace std;struct Point private: double x, y; /數(shù)據(jù)成員數(shù)據(jù)成員 public: Point(); /無(wú)參數(shù)構(gòu)造函數(shù)無(wú)參數(shù)構(gòu)造函數(shù) Point(double a, double b) /具有兩個(gè)參數(shù)的構(gòu)造函數(shù)具有兩個(gè)參數(shù)的構(gòu)造函數(shù) x=a; y=b; void Setxy(double a, double b) /成員函數(shù),用來(lái)成員函數(shù),用來(lái)重新設(shè)置數(shù)據(jù)成員重新設(shè)置數(shù)據(jù)成員 x=a; y=b; void Display() /成員函數(shù),按指定格式輸出成員函數(shù),按指定格式輸出 數(shù)據(jù)成員的值數(shù)據(jù)成

10、員的值 coutxtyendl;void main( ) Point a; /定義對(duì)象定義對(duì)象a Point b(18.5 , 10.6); /定義對(duì)象定義對(duì)象b并賦初值并賦初值 a.Setxy(10.6,18.5); /設(shè)置變量設(shè)置變量a的數(shù)據(jù)成員的數(shù)據(jù)成員 a.Display(); /顯示變量顯示變量a的數(shù)據(jù)成員的數(shù)據(jù)成員 b.Display(); /顯示變量顯示變量b的數(shù)據(jù)成員的數(shù)據(jù)成員程序運(yùn)行結(jié)果如下:程序運(yùn)行結(jié)果如下:10.6 18.518.5 10.6 現(xiàn)在不深究構(gòu)造函數(shù)的原理,只要記住它的現(xiàn)在不深究構(gòu)造函數(shù)的原理,只要記住它的使用方法即可。一般形式為:使用方法即可。一般形式為:

11、構(gòu)造函數(shù)名構(gòu)造函數(shù)名 對(duì)象名(初始化參數(shù));對(duì)象名(初始化參數(shù));程序在運(yùn)行時(shí),會(huì)自動(dòng)完成初始化任務(wù)。例如語(yǔ)程序在運(yùn)行時(shí),會(huì)自動(dòng)完成初始化任務(wù)。例如語(yǔ)句句 Point b(18.5 , 10.6); 使得使得a.x=18.5,a.y=10.6。2.2 從結(jié)構(gòu)演變一個(gè)簡(jiǎn)單的類從結(jié)構(gòu)演變一個(gè)簡(jiǎn)單的類其實(shí),使用關(guān)鍵字其實(shí),使用關(guān)鍵字class代替代替struct,就是一個(gè),就是一個(gè)標(biāo)準(zhǔn)的類。標(biāo)準(zhǔn)的類。【例【例2.4】定義類的實(shí)例?!慷x類的實(shí)例。class Point private: double x, y; /類類point的數(shù)據(jù)成員的數(shù)據(jù)成員public: Point(); /類類Point的

12、無(wú)參數(shù)構(gòu)造函數(shù)的無(wú)參數(shù)構(gòu)造函數(shù) Point(double a, double b) /具有兩個(gè)參數(shù)的構(gòu)造函數(shù)具有兩個(gè)參數(shù)的構(gòu)造函數(shù) x=a; y=b; void Setxy(double a, double b) /成員函數(shù),用來(lái)成員函數(shù),用來(lái) /重新設(shè)置數(shù)據(jù)成員重新設(shè)置數(shù)據(jù)成員 num=a; score=b; void Display() /成員函數(shù),按指定格成員函數(shù),按指定格 /式輸出數(shù)據(jù)成員的值式輸出數(shù)據(jù)成員的值 coutxtyendl; ;使用類產(chǎn)生對(duì)象的方式如結(jié)構(gòu)一樣,可以使用如下的主函使用類產(chǎn)生對(duì)象的方式如結(jié)構(gòu)一樣,可以使用如下的主函數(shù),將得到相同的運(yùn)行結(jié)果。數(shù),將得到相同的運(yùn)行結(jié)

13、果。void main( ) Point a; /定義類定義類Point的對(duì)象的對(duì)象a Point b(18.5 , 10.6); /定義類定義類Point的對(duì)象的對(duì)象b并初始化并初始化 a.Setxy(10.6,18.5); /為對(duì)象為對(duì)象a的數(shù)據(jù)成員賦值的數(shù)據(jù)成員賦值 a.Display(); /顯示對(duì)象顯示對(duì)象a的數(shù)據(jù)成員的數(shù)據(jù)成員 b.Display(); /顯示對(duì)象顯示對(duì)象b的數(shù)據(jù)成員的數(shù)據(jù)成員程序運(yùn)行結(jié)果如下:程序運(yùn)行結(jié)果如下:10.6 18.518.5 10.6可以將可以將point類看作直角坐標(biāo)系的點(diǎn)類類看作直角坐標(biāo)系的點(diǎn)類2.3 C+面向?qū)ο蟪绦蛟O(shè)計(jì)特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)特點(diǎn)面

14、向?qū)ο蟮某绦蛟O(shè)計(jì)方法要求語(yǔ)言必須具備抽象、面向?qū)ο蟮某绦蛟O(shè)計(jì)方法要求語(yǔ)言必須具備抽象、封裝、繼承和多態(tài)性等關(guān)鍵要素。封裝、繼承和多態(tài)性等關(guān)鍵要素。2.3.1 對(duì)象對(duì)象 現(xiàn)實(shí)世界中客觀存在的事物為對(duì)象。復(fù)雜的對(duì)現(xiàn)實(shí)世界中客觀存在的事物為對(duì)象。復(fù)雜的對(duì)象可以由簡(jiǎn)單的對(duì)象組成,例如火車站對(duì)象又包象可以由簡(jiǎn)單的對(duì)象組成,例如火車站對(duì)象又包含售票處、行李房、信號(hào)燈、站臺(tái)、鐵軌和通信含售票處、行李房、信號(hào)燈、站臺(tái)、鐵軌和通信設(shè)施等對(duì)象。這些對(duì)象各自又由許多對(duì)象組成,設(shè)施等對(duì)象。這些對(duì)象各自又由許多對(duì)象組成,對(duì)象各自完成特定的功能??傊?,對(duì)象各自完成特定的功能??傊?,世界萬(wàn)物皆對(duì)世界萬(wàn)物皆對(duì)象象。 售票處有

15、各種規(guī)格的車票,這些車票表示售票售票處有各種規(guī)格的車票,這些車票表示售票處的處的靜態(tài)特征靜態(tài)特征。它提供發(fā)售車票的功能。它提供發(fā)售車票的功能(操作操作),表,表示了售票處的示了售票處的動(dòng)態(tài)特征動(dòng)態(tài)特征。 通過(guò)這種抽象歸納,通過(guò)這種抽象歸納,C+可使用對(duì)象名、屬可使用對(duì)象名、屬性和操作三要素來(lái)描述對(duì)象。性和操作三要素來(lái)描述對(duì)象。l對(duì)象名用來(lái)標(biāo)識(shí)一個(gè)具體對(duì)象。用數(shù)據(jù)來(lái)表示對(duì)對(duì)象名用來(lái)標(biāo)識(shí)一個(gè)具體對(duì)象。用數(shù)據(jù)來(lái)表示對(duì)象的屬性,一個(gè)屬性就是描述對(duì)象靜態(tài)特征的一象的屬性,一個(gè)屬性就是描述對(duì)象靜態(tài)特征的一個(gè)數(shù)據(jù)項(xiàng)。個(gè)數(shù)據(jù)項(xiàng)。l操作是描述對(duì)象動(dòng)態(tài)特征(行為)的一個(gè)函數(shù)序操作是描述對(duì)象動(dòng)態(tài)特征(行為)的一個(gè)函

16、數(shù)序列(使用函數(shù)實(shí)現(xiàn)),也稱為方法或服務(wù)。列(使用函數(shù)實(shí)現(xiàn)),也稱為方法或服務(wù)。l數(shù)據(jù)稱為數(shù)據(jù)成員,函數(shù)稱為成員函數(shù)。數(shù)據(jù)稱為數(shù)據(jù)成員,函數(shù)稱為成員函數(shù)。 由此可見,由此可見,C+中的對(duì)象是系統(tǒng)中用來(lái)描述中的對(duì)象是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,是構(gòu)成系統(tǒng)的一個(gè)基本單客觀事物的一個(gè)實(shí)體,是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的成員函數(shù)構(gòu)成。的成員函數(shù)構(gòu)成。對(duì)象名對(duì)象名屬性屬性1 1屬性屬性2 2屬性屬性n n操作操作1 1操作操作2 2操作操作n n圖圖2.22.2對(duì)象結(jié)構(gòu)圖對(duì)象結(jié)構(gòu)圖 【例【例2.5】用簡(jiǎn)單對(duì)象表示平面上的

17、】用簡(jiǎn)單對(duì)象表示平面上的A(3.5,6.4)和和B(8.5,8.9)兩個(gè)坐標(biāo)點(diǎn)??墒褂脠D兩個(gè)坐標(biāo)點(diǎn)。可使用圖2.3表示具體對(duì)表示具體對(duì)象象A和和B的對(duì)象結(jié)構(gòu)。的對(duì)象結(jié)構(gòu)。 Bx(8.5)y(8.9) display( );setxy( );move( );Ax(3.5)y(6.4) display( );setxy( );move( ); 對(duì)象名是對(duì)象名是“A”,A是一個(gè)點(diǎn)的對(duì)象。沒有給對(duì)象是一個(gè)點(diǎn)的對(duì)象。沒有給對(duì)象A的屬性賦值時(shí),這只是個(gè)抽象名的屬性賦值時(shí),這只是個(gè)抽象名詞。只有具有確定的屬性值,才是一個(gè)具有確定位置的點(diǎn)。圖中用詞。只有具有確定的屬性值,才是一個(gè)具有確定位置的點(diǎn)。圖中用x坐標(biāo)

18、和坐標(biāo)和y坐標(biāo)表示坐標(biāo)表示坐標(biāo)點(diǎn)對(duì)象的靜態(tài)屬性(稱為位置屬性)。坐標(biāo)點(diǎn)對(duì)象的靜態(tài)屬性(稱為位置屬性)。 假設(shè)讓點(diǎn)對(duì)象對(duì)外有顯示屬性值、設(shè)置屬性值和移動(dòng)位置等操作,這里分別使用假設(shè)讓點(diǎn)對(duì)象對(duì)外有顯示屬性值、設(shè)置屬性值和移動(dòng)位置等操作,這里分別使用成員函數(shù)成員函數(shù)display, setxy, move來(lái)實(shí)現(xiàn)這些操作。來(lái)實(shí)現(xiàn)這些操作。 2.3.2 抽象和類抽象和類 抽象是一種從一般的觀點(diǎn)看待事物的方法,即集抽象是一種從一般的觀點(diǎn)看待事物的方法,即集中于事物的本質(zhì)特征,而不是具體細(xì)節(jié)或具體實(shí)現(xiàn)。中于事物的本質(zhì)特征,而不是具體細(xì)節(jié)或具體實(shí)現(xiàn)。 面向?qū)ο蠊膭?lì)程序員以抽象的觀點(diǎn)看待程序,即面向?qū)ο蠊膭?lì)程序

19、員以抽象的觀點(diǎn)看待程序,即程序是由一組抽象的對(duì)象程序是由一組抽象的對(duì)象(類類)組成的。組成的。 可以將一組對(duì)象的共同特征進(jìn)一步抽象出來(lái),從可以將一組對(duì)象的共同特征進(jìn)一步抽象出來(lái),從而形成而形成“類類”的概念。例如,從點(diǎn)的概念。例如,從點(diǎn)A和和B抽象出點(diǎn)的抽象出點(diǎn)的概念,這就是概念,這就是“點(diǎn)類點(diǎn)類”。Point float x; float y; display( );setxy( );move( );圖圖2.4 類類Point的結(jié)構(gòu)圖的結(jié)構(gòu)圖 類由類名、一組屬性和一組操類由類名、一組屬性和一組操作等作等3部分組成。類的屬性只是性部分組成。類的屬性只是性質(zhì)的說(shuō)明,對(duì)象的屬性才是具體的質(zhì)的說(shuō)明,

20、對(duì)象的屬性才是具體的數(shù)據(jù)。所以,圖數(shù)據(jù)。所以,圖2.4的的Point類只是類只是表示類名是表示類名是Point,它的點(diǎn)位置是,它的點(diǎn)位置是兩個(gè)實(shí)數(shù),但還沒有具體的位置。兩個(gè)實(shí)數(shù),但還沒有具體的位置。只有像本節(jié)只有像本節(jié)A和和B兩點(diǎn)具有確定的兩點(diǎn)具有確定的屬性值,才是屬性值,才是Point類的具體對(duì)象,類的具體對(duì)象,稱它為類稱它為類Point的一個(gè)的一個(gè)實(shí)例實(shí)例。類名類名屬性屬性1屬性屬性2 2屬性屬性n n操作操作1 1操作操作2 2操作操作n n圖圖2.5 類模型的結(jié)構(gòu)圖類模型的結(jié)構(gòu)圖 對(duì)于一個(gè)具體的類,它有許多具體的個(gè)體,對(duì)于一個(gè)具體的類,它有許多具體的個(gè)體,這些個(gè)體叫做這些個(gè)體叫做“對(duì)象

21、對(duì)象”。舉個(gè)例子,。舉個(gè)例子,“人人”是一是一個(gè)類,具有個(gè)類,具有“直立行走、會(huì)使用工具直立行走、會(huì)使用工具”等一些區(qū)等一些區(qū)別于其他事物的共同特征;而張三、李四、王五別于其他事物的共同特征;而張三、李四、王五等一個(gè)個(gè)具體的人,就是等一個(gè)個(gè)具體的人,就是“人人”這個(gè)類的一個(gè)個(gè)這個(gè)類的一個(gè)個(gè)“對(duì)象對(duì)象”,同一類的不同對(duì)象具有相同的行為方,同一類的不同對(duì)象具有相同的行為方式(如張三和李四都能直立行走、會(huì)使用工具),式(如張三和李四都能直立行走、會(huì)使用工具),不同類的對(duì)象具有不同的行為。不同類的對(duì)象具有不同的行為。 類的作用是定義對(duì)象。類和對(duì)象的關(guān)系如同類的作用是定義對(duì)象。類和對(duì)象的關(guān)系如同一個(gè)模具

22、與用這個(gè)模具鑄造出來(lái)的鑄造件之間的一個(gè)模具與用這個(gè)模具鑄造出來(lái)的鑄造件之間的關(guān)系。類給出了屬于該類的全部對(duì)象的抽象定義,關(guān)系。類給出了屬于該類的全部對(duì)象的抽象定義,而對(duì)象則是符合這種定義的實(shí)體。所以,而對(duì)象則是符合這種定義的實(shí)體。所以,C+中中將將對(duì)象稱做對(duì)象稱做類的一個(gè)類的一個(gè)實(shí)例實(shí)例。 在程序中,每個(gè)對(duì)象在程序中,每個(gè)對(duì)象需要有自己的存儲(chǔ)空間需要有自己的存儲(chǔ)空間以以保存它們自己的屬性值。所謂保存它們自己的屬性值。所謂“一個(gè)類的所有對(duì)一個(gè)類的所有對(duì)象具有相同的屬性象具有相同的屬性”,是指屬性的個(gè)數(shù)、名稱、,是指屬性的個(gè)數(shù)、名稱、數(shù)據(jù)類型相同,各個(gè)對(duì)象的屬性值則可以互不相數(shù)據(jù)類型相同,各個(gè)對(duì)象

23、的屬性值則可以互不相同,并且隨著程序的執(zhí)行而變化。至于操作,則同,并且隨著程序的執(zhí)行而變化。至于操作,則是是所有對(duì)象共同使用它們的類定義中給出的操作所有對(duì)象共同使用它們的類定義中給出的操作代碼代碼。l消息(消息(MessageMessage)對(duì)象之間相互請(qǐng)求相互協(xié)作的途徑對(duì)象之間相互請(qǐng)求相互協(xié)作的途徑 一個(gè)消息由下述三部分組成:一個(gè)消息由下述三部分組成:(1 1)接收消息的對(duì)象;)接收消息的對(duì)象;(2 2)消息選擇符(也稱為消息名);)消息選擇符(也稱為消息名);(3 3)零個(gè)或多個(gè)變?cè)?。)零個(gè)或多個(gè)變?cè)?例如例如 : MyCircle.Show(GREENMyCircle.Show(GRE

24、EN) ) ; 其中:其中: MyCircleMyCircle是接收消息的對(duì)象的名字是接收消息的對(duì)象的名字 ShowShow是消息選擇符(即消息名)是消息選擇符(即消息名) GREENGREEN是消息的變?cè)?。是消息的變?cè)?消息消息2.3.3 封裝封裝 將類封裝起來(lái),也是為了保護(hù)類的安全,所將類封裝起來(lái),也是為了保護(hù)類的安全,所謂安全,就是限制使用類的屬性和操作。謂安全,就是限制使用類的屬性和操作。 按照面向?qū)ο蟮姆庋b原則,一個(gè)對(duì)象的屬性按照面向?qū)ο蟮姆庋b原則,一個(gè)對(duì)象的屬性和操作是緊密結(jié)合的,對(duì)象的屬性只能由這個(gè)對(duì)和操作是緊密結(jié)合的,對(duì)象的屬性只能由這個(gè)對(duì)象的操作來(lái)存取。象的操作來(lái)存取。 對(duì)

25、象的操作分為對(duì)象的操作分為內(nèi)部?jī)?nèi)部操作和操作和外部外部操作。內(nèi)部操作。內(nèi)部操作只供對(duì)象內(nèi)部的其他操作使用操作只供對(duì)象內(nèi)部的其他操作使用,不對(duì)外提供,不對(duì)外提供服務(wù)。外部操作對(duì)外提供一個(gè)消息接口,通過(guò)這服務(wù)。外部操作對(duì)外提供一個(gè)消息接口,通過(guò)這個(gè)接口接收對(duì)象外部的消息并為之提供操作(服個(gè)接口接收對(duì)象外部的消息并為之提供操作(服務(wù))。對(duì)象內(nèi)部數(shù)據(jù)結(jié)構(gòu)的這種不可訪問(wèn)性稱為務(wù))。對(duì)象內(nèi)部數(shù)據(jù)結(jié)構(gòu)的這種不可訪問(wèn)性稱為信息信息(數(shù)據(jù)數(shù)據(jù))隱藏隱藏。l數(shù)據(jù)封裝給數(shù)據(jù)提供了與外界聯(lián)系的標(biāo)準(zhǔn)接數(shù)據(jù)封裝給數(shù)據(jù)提供了與外界聯(lián)系的標(biāo)準(zhǔn)接口,無(wú)論是誰(shuí),只有通過(guò)這些接口,使用規(guī)口,無(wú)論是誰(shuí),只有通過(guò)這些接口,使用規(guī)范的方

26、式,才能訪問(wèn)這些數(shù)據(jù)。同時(shí),由于范的方式,才能訪問(wèn)這些數(shù)據(jù)。同時(shí),由于程序員總是和接口打交道,因此就不必了解程序員總是和接口打交道,因此就不必了解數(shù)據(jù)的具體細(xì)節(jié)。數(shù)據(jù)的具體細(xì)節(jié)。l簡(jiǎn)言之,封裝就是把對(duì)象的屬性和操作結(jié)合簡(jiǎn)言之,封裝就是把對(duì)象的屬性和操作結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單位,并盡可能隱蔽對(duì)象成一個(gè)獨(dú)立的系統(tǒng)單位,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。的內(nèi)部細(xì)節(jié)。 l在類中,封裝是通過(guò)在類中,封裝是通過(guò)存取權(quán)限存取權(quán)限實(shí)現(xiàn)的,如將實(shí)現(xiàn)的,如將每個(gè)類的屬性和操作分為每個(gè)類的屬性和操作分為私有私有的和的和公有公有的兩的兩種類型。對(duì)象的外部只能訪問(wèn)對(duì)象的公有部種類型。對(duì)象的外部只能訪問(wèn)對(duì)象的公有部分,不能直接

27、訪問(wèn)對(duì)象的私有部分。分,不能直接訪問(wèn)對(duì)象的私有部分。2.3.4 繼承繼承 對(duì)象的另一個(gè)特點(diǎn)是繼承。繼承是一個(gè)對(duì)對(duì)象的另一個(gè)特點(diǎn)是繼承。繼承是一個(gè)對(duì)象可以獲得另一個(gè)對(duì)象的特性的機(jī)制,它支持象可以獲得另一個(gè)對(duì)象的特性的機(jī)制,它支持層次類這一概念,例如紅香蕉蘋果屬于蘋果類,層次類這一概念,例如紅香蕉蘋果屬于蘋果類,而蘋果類又屬于水果類。通過(guò)繼承,低層的類而蘋果類又屬于水果類。通過(guò)繼承,低層的類只須定義特定于它的特征,而共享高層的類中只須定義特定于它的特征,而共享高層的類中的特征。的特征。2.3.5 多態(tài)性多態(tài)性 不同的對(duì)象可以調(diào)用相同名稱的函數(shù),并可不同的對(duì)象可以調(diào)用相同名稱的函數(shù),并可導(dǎo)致完全不同

28、的行為的現(xiàn)象稱為多態(tài)性。利用多導(dǎo)致完全不同的行為的現(xiàn)象稱為多態(tài)性。利用多態(tài)性,程序中只須進(jìn)行一般形式的函數(shù)調(diào)用,函態(tài)性,程序中只須進(jìn)行一般形式的函數(shù)調(diào)用,函數(shù)的實(shí)現(xiàn)細(xì)節(jié)留給接受函數(shù)調(diào)用的對(duì)象。這大大數(shù)的實(shí)現(xiàn)細(xì)節(jié)留給接受函數(shù)調(diào)用的對(duì)象。這大大提高了我們解決復(fù)雜問(wèn)題的能力。提高了我們解決復(fù)雜問(wèn)題的能力。 如將兩個(gè)數(shù)如將兩個(gè)數(shù)“相加相加”,這兩個(gè)數(shù)可以是整數(shù),這兩個(gè)數(shù)可以是整數(shù)或?qū)崝?shù),將或?qū)崝?shù),將“+”看做一個(gè)特殊函數(shù),則看做一個(gè)特殊函數(shù),則8+7和和23.5+8.7都是使用都是使用“+”來(lái)完成兩個(gè)數(shù)相加的功能,來(lái)完成兩個(gè)數(shù)相加的功能,這就是這就是“+”體現(xiàn)的多態(tài)性。由此可知,體現(xiàn)的多態(tài)性。由此可知

29、,“-”、“*”和和“/”也都具有這一特征,而且還可以自己也都具有這一特征,而且還可以自己定義這些運(yùn)算符的功能。定義這些運(yùn)算符的功能。2.5 熟悉并使用類和對(duì)象熟悉并使用類和對(duì)象 本節(jié)將介紹如何使用本節(jié)將介紹如何使用C+標(biāo)準(zhǔn)程序庫(kù)提供的標(biāo)準(zhǔn)程序庫(kù)提供的string類和類和complex類,目的是進(jìn)一步了解類和類,目的是進(jìn)一步了解類和對(duì)象的概念,為以后自己編寫類打下基礎(chǔ)。對(duì)象的概念,為以后自己編寫類打下基礎(chǔ)。 2.5.1 使用使用string對(duì)象對(duì)象 C+標(biāo)準(zhǔn)程序庫(kù)提供標(biāo)準(zhǔn)程序庫(kù)提供string類,類,string類可以像類可以像char那樣定義一個(gè)字符串對(duì)象,但那樣定義一個(gè)字符串對(duì)象,但str

30、ing類定義的類定義的對(duì)象不需要結(jié)束符對(duì)象不需要結(jié)束符“0”,而且可以使用,而且可以使用string類類提供的成員函數(shù)進(jìn)行相應(yīng)操作,例如求字符串的提供的成員函數(shù)進(jìn)行相應(yīng)操作,例如求字符串的長(zhǎng)度或取這個(gè)字符串的子串等。長(zhǎng)度或取這個(gè)字符串的子串等。 圖圖2.7 string類的簡(jiǎn)化圖類的簡(jiǎn)化圖string str string find size substrl從圖從圖2.7可見,它的可見,它的屬性屬性是一個(gè)字符串是一個(gè)字符串str,同名函數(shù),同名函數(shù)string是構(gòu)是構(gòu)造函數(shù),用來(lái)初始化字符串,有參數(shù)不同的幾種構(gòu)造函數(shù)。造函數(shù),用來(lái)初始化字符串,有參數(shù)不同的幾種構(gòu)造函數(shù)。l另外另外3個(gè)成員函數(shù)用

31、來(lái)對(duì)屬性個(gè)成員函數(shù)用來(lái)對(duì)屬性str進(jìn)行操作。成員函數(shù)進(jìn)行操作。成員函數(shù)find用來(lái)在用來(lái)在str字符串中檢索所需要的子串;字符串中檢索所需要的子串;size成員函數(shù)計(jì)算并輸出成員函數(shù)計(jì)算并輸出str存儲(chǔ)存儲(chǔ)的單詞長(zhǎng)度;的單詞長(zhǎng)度;substr成員函數(shù),用來(lái)返回成員函數(shù),用來(lái)返回str字符串中的子串。字符串中的子串。l在程序中可以使用在程序中可以使用string類定義存儲(chǔ)字符串的對(duì)象。這些對(duì)象隸類定義存儲(chǔ)字符串的對(duì)象。這些對(duì)象隸屬于屬于string類,因此還必須在程序中包含這個(gè)類的頭文件,即使類,因此還必須在程序中包含這個(gè)類的頭文件,即使用語(yǔ)句用語(yǔ)句 #include l可以使用雙引號(hào)括起來(lái)的單

32、個(gè)字符常量初始化,即下面語(yǔ)句均可以使用雙引號(hào)括起來(lái)的單個(gè)字符常量初始化,即下面語(yǔ)句均是正確的:是正確的: string str=A; string str(A); /也是正確的也是正確的 如果如果string 的的對(duì)象對(duì)象str的內(nèi)容為的內(nèi)容為“ab”,則,則str0=a,str1=b?!纠纠?.6】演示使用】演示使用string對(duì)象及初始化的例子。對(duì)象及初始化的例子。 #include #include using namespace std;void main() string str1(We are here! ); string str2=Where are you? ; couts

33、tr10str111,str1endl; coutstr20str213,str2endl; coutstr1; coutlength of the str1 is str1.size().endl;下面是程序的輸出結(jié)果:下面是程序的輸出結(jié)果: W!,We are here! W?,Where are you? please input a word: good length of the fine is 4.對(duì)象使用自己的成員函數(shù)的方法是通過(guò)對(duì)象使用自己的成員函數(shù)的方法是通過(guò)“.”運(yùn)算運(yùn)算符,格式如下:符,格式如下: 對(duì)象名對(duì)象名.成員函數(shù)成員函數(shù)例如對(duì)象例如對(duì)象str1使用類使用類stri

34、ng的的size成員函數(shù)計(jì)算并成員函數(shù)計(jì)算并輸出單詞的長(zhǎng)度,其格式為:輸出單詞的長(zhǎng)度,其格式為: str1.size()string類還提供將兩個(gè)字符串連接起來(lái)組成一個(gè)類還提供將兩個(gè)字符串連接起來(lái)組成一個(gè)新字符串的能力。新字符串的能力?!?”號(hào)將其后的字符串連接到號(hào)將其后的字符串連接到前一個(gè)字符串的后面,也可以與單個(gè)字符常量相前一個(gè)字符串的后面,也可以與單個(gè)字符常量相加。例如語(yǔ)句加。例如語(yǔ)句 str=str + + str;將原來(lái)的兩個(gè)將原來(lái)的兩個(gè)str 的內(nèi)容用空格連起來(lái),新內(nèi)容為:的內(nèi)容用空格連起來(lái),新內(nèi)容為: We are here! We are here!2.5.2 使用使用stri

35、ng類的典型成員函數(shù)實(shí)例類的典型成員函數(shù)實(shí)例 string對(duì)象是通過(guò)調(diào)用成員函數(shù)實(shí)現(xiàn)操作,從而對(duì)象是通過(guò)調(diào)用成員函數(shù)實(shí)現(xiàn)操作,從而提供對(duì)象的行為或消息傳遞的。對(duì)象調(diào)用成員函數(shù)的提供對(duì)象的行為或消息傳遞的。對(duì)象調(diào)用成員函數(shù)的語(yǔ)法可表示如下:語(yǔ)法可表示如下: 對(duì)象名稱對(duì)象名稱.成員函數(shù)(參數(shù)(可供選擇的消息內(nèi)成員函數(shù)(參數(shù)(可供選擇的消息內(nèi)容)容) 例如例如string類提供的類提供的substr成員函數(shù),用來(lái)返回成員函數(shù),用來(lái)返回字符串的子串。字符串的子串。第第1個(gè)參數(shù)是要截取子串在字符串中個(gè)參數(shù)是要截取子串在字符串中的位置,第的位置,第2個(gè)參數(shù)是截取的長(zhǎng)度個(gè)參數(shù)是截取的長(zhǎng)度。要從對(duì)象。要從對(duì)象

36、str中截中截取取“are”,因?yàn)?,因?yàn)镃+規(guī)定字符串的計(jì)數(shù)是從零開始的,規(guī)定字符串的計(jì)數(shù)是從零開始的,所以所以“a”處于位置處于位置3,可用如下語(yǔ)句實(shí)現(xiàn):,可用如下語(yǔ)句實(shí)現(xiàn): string newstr=str.substr(3,3);這時(shí)這時(shí)newstr的內(nèi)容為的內(nèi)容為“are”。l給出的位置必須位于字符串中,否則出錯(cuò)。如果長(zhǎng)度大于給出的位置必須位于字符串中,否則出錯(cuò)。如果長(zhǎng)度大于字符串的長(zhǎng)度,則是可以的,它自動(dòng)截取到末尾。字符串的長(zhǎng)度,則是可以的,它自動(dòng)截取到末尾。 string strnew=newstr.substr(2,8);截取的內(nèi)容為截取的內(nèi)容為“e”,等同于語(yǔ)句,等同于語(yǔ)句“

37、string strnew=newstr.substr(2,1);”。l成員函數(shù)成員函數(shù)find用來(lái)在主串中檢索所需字符串。它有兩個(gè)參用來(lái)在主串中檢索所需字符串。它有兩個(gè)參數(shù),格式如下:數(shù),格式如下: 對(duì)象名稱對(duì)象名稱.find(要查找的字符串,開始查找的位置要查找的字符串,開始查找的位置);該成員函數(shù)返回查找到的字符串在主串的位置。例如:該成員函數(shù)返回查找到的字符串在主串的位置。例如: int i=str.find(are, 0 );表示從表示從str字符串的位置字符串的位置0(起始位置起始位置)開始查找,結(jié)果為開始查找,結(jié)果為3。如果改從如果改從4開始,則查找到連接的第開始,則查找到連接的

38、第2個(gè)個(gè)“are”,結(jié)果為,結(jié)果為16。如果讓它從如果讓它從17處開始,則找不到,返回值為處開始,則找不到,返回值為-1。如果不給。如果不給位置參數(shù),位置參數(shù),默認(rèn)位置參數(shù)為默認(rèn)位置參數(shù)為0,即上述語(yǔ)句可寫為,即上述語(yǔ)句可寫為 int i=str.find(are); string類還提供一個(gè)輔助功能,以便使用類還提供一個(gè)輔助功能,以便使用getline從流從流cin中讀出輸入的一行給中讀出輸入的一行給string類的對(duì)象。類的對(duì)象。 string InputLine; getline(cin, InputLine, n); cout your input: InputLineendl; 如果

39、輸入如果輸入“I am here!”,則得到如下結(jié)果:,則得到如下結(jié)果: your input: I am here!【例【例2.7】演示將美國(guó)格式的日期轉(zhuǎn)換為國(guó)際格式的例子。】演示將美國(guó)格式的日期轉(zhuǎn)換為國(guó)際格式的例子。美國(guó)使用月日年格式,例如美國(guó)使用月日年格式,例如May 28 , 2002。轉(zhuǎn)為國(guó)際格式應(yīng)為。轉(zhuǎn)為國(guó)際格式應(yīng)為28 May 2002。這可以使用。這可以使用find檢索,使用檢索,使用substr截取,然后再截取,然后再按要求重組。具體步驟如下:按要求重組。具體步驟如下: 尋找月份。尋找月份。假設(shè)假設(shè)string類的類的Date對(duì)象存放美國(guó)日期,則下列對(duì)象存放美國(guó)日期,則下列語(yǔ)

40、句語(yǔ)句 int i=Date.find(“ ”); /查找查找May與與28之間的空格,之間的空格,i=3 string Month=Date.substr(0,i) ; /從從0位置開始截取位置開始截取i 個(gè)字符個(gè)字符(上面求的上面求的i=3)得到得到Month。 尋找日子。尋找日子。尋找尋找“,”號(hào),假設(shè)其位置為號(hào),假設(shè)其位置為k。Day的起始位置的起始位置應(yīng)是應(yīng)是i+1處,長(zhǎng)度應(yīng)處,長(zhǎng)度應(yīng)是是k-(i+1),則語(yǔ)句,則語(yǔ)句 string Day=Date.substr(i+1, k-i-1); 得到得到Day。 尋找年份。尋找年份。年份應(yīng)從逗號(hào)處再計(jì)數(shù)年份應(yīng)從逗號(hào)處再計(jì)數(shù)2次(因逗號(hào)后面

41、有一個(gè)空次(因逗號(hào)后面有一個(gè)空格),長(zhǎng)度為格),長(zhǎng)度為4,也可使用比年的長(zhǎng)度長(zhǎng)的字符串的總長(zhǎng)度,這,也可使用比年的長(zhǎng)度長(zhǎng)的字符串的總長(zhǎng)度,這由它的成員函數(shù)由它的成員函數(shù)size提供。下面兩種方法是等效的:提供。下面兩種方法是等效的: string Year = Date.substr(k + 2, Date.size() - 1); string Year = Date.substr(k + 2, 4); 按新格式拼裝并輸出。按新格式拼裝并輸出。下面是完整的程序及運(yùn)行結(jié)果:下面是完整的程序及運(yùn)行結(jié)果:#include #include using namespace std;void main

42、() cout Enter the date in American format (e.g., December 25, 2002) : ; string Date; getline(cin, Date, n); int i = Date.find( ); string Month = Date.substr(0, i); int k = Date.find(,); string Day = Date.substr(i + 1, k - i - 1); string Year = Date.substr(k + 2, 4); string NewDate = Day + + Month +

43、+ Year; cout Original date: Date endl; cout Converted date: NewDate endl; 程序運(yùn)行示范如下:程序運(yùn)行示范如下:Enter the date in American format (e.g., December 29, 1953) : May 28, 2002Original date: May 28, 2002Converted date: 28 May 20022.5.3 使用使用complex對(duì)象對(duì)象C+標(biāo)準(zhǔn)程序庫(kù)提供標(biāo)準(zhǔn)程序庫(kù)提供complex 類定義復(fù)數(shù)對(duì)象。在程類定義復(fù)數(shù)對(duì)象。在程序中包含這個(gè)類的頭文件:序中包含這個(gè)類的頭文件: #include 復(fù)數(shù)(復(fù)數(shù)(complex number)類需要兩個(gè)初始值:實(shí)部)類需要兩個(gè)初始值:實(shí)部和虛部,這需要借助構(gòu)造函數(shù)初始化來(lái)實(shí)現(xiàn)多值處理。和虛部,這需要借助構(gòu)造函數(shù)初始化來(lái)實(shí)現(xiàn)多值處理。 complex 類是一個(gè)類是一個(gè)模板類模板類(template class),所謂,所謂模板,意思是說(shuō)它可以定義多種數(shù)據(jù)類型的復(fù)數(shù),例模板,意思是說(shuō)它可以定義多種數(shù)據(jù)類型的復(fù)數(shù),例如實(shí)部和虛部的數(shù)據(jù)類型可以是整數(shù),也可以是實(shí)數(shù)。如實(shí)部和虛部的數(shù)據(jù)類型可以是整數(shù),也可以是實(shí)數(shù)。 這可以在這可以在comple

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論