《C++程序設(shè)計教程》課件第1章_第1頁
《C++程序設(shè)計教程》課件第1章_第2頁
《C++程序設(shè)計教程》課件第1章_第3頁
《C++程序設(shè)計教程》課件第1章_第4頁
《C++程序設(shè)計教程》課件第1章_第5頁
已閱讀5頁,還剩132頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1.1概述

1.2C++入門

1.3類的基本概念

1.4現(xiàn)實生活中的類與對象

1.5程序的具體實現(xiàn)

1.6this指針

1.7作用域、可見性及命名規(guī)則1.8C++程序結(jié)構(gòu)

本章要點

練習(xí)

1.軟件設(shè)計方法的發(fā)展

軟件開發(fā)早期采用結(jié)構(gòu)化程序設(shè)計方法,程序被理解為:程序=(算法)+(數(shù)據(jù)結(jié)構(gòu))。即算法和數(shù)據(jù)結(jié)構(gòu)是各個獨立的整體,分別進行設(shè)計。1.1概述隨后,軟件工程師們開始逐步注重系統(tǒng)整體關(guān)系的表示和數(shù)據(jù)模型技術(shù),他們把數(shù)據(jù)結(jié)構(gòu)與算法看做一個整體的功能模塊,于是程序被重新認識為:程序=(算法+數(shù)據(jù)結(jié)構(gòu))。即算法與數(shù)據(jù)結(jié)構(gòu)是一個整體,算法總是離不開數(shù)據(jù)結(jié)構(gòu),算法含有對數(shù)據(jù)結(jié)構(gòu)的訪問。一個算法只能適用于特定的數(shù)據(jù)結(jié)構(gòu),想設(shè)計一個適合于訪問多個數(shù)據(jù)結(jié)構(gòu)的算法是不明智的,而且數(shù)據(jù)結(jié)構(gòu)由多個算法來對其進行同種操作也是多余的。

此后,面向?qū)ο蟮某绦蛟O(shè)計方法被提出并獲得了發(fā)展。

2.面向?qū)ο笳Z言的特征

在面向?qū)ο蟪绦蛟O(shè)計中,算法與數(shù)據(jù)結(jié)構(gòu)被捆綁成一個“類”,類進一步具體化為實物,即對象。于是程序被進一步理解為:程序=(對象+對象+…),對象=(算法+數(shù)據(jù)結(jié)構(gòu))。現(xiàn)實世界本身就是一個對象的世界,任何對象都通過它的屬性和行為體現(xiàn)出來。即程序就是許多對象在計算機中相繼表現(xiàn)的體現(xiàn)。從這樣的角度看問題,我們在開發(fā)程序時就不用為程序功能如何實現(xiàn)而費盡心機了,而只要通過對象的組合就可以輕易實現(xiàn)。面向?qū)ο蟪绦蛟O(shè)計思想突破了軟件思想的障礙,使得程序規(guī)模迅速擴大,軟件產(chǎn)業(yè)得以飛速發(fā)展。面向?qū)ο蟪绦蛟O(shè)計是軟件設(shè)計方法發(fā)展的必然結(jié)果。

C++是一種流行的面向?qū)ο蟮某绦蛟O(shè)計語言。它通過類機制,最有效地實現(xiàn)了面向?qū)ο蟮脑?。它使得我們能從真實客觀的角度來理解和開發(fā)應(yīng)用程序。因此,可以說C++是類機制比較完善的一種高級語言。

3.C++和C

C++是一種高效實用的程序設(shè)計語言,它同時兼有面向過程和面向?qū)ο蟪绦蛟O(shè)計,因而得到了廣泛應(yīng)用。C++從C進化而來,是C語言的超集,C中的語法規(guī)則在C++中都適用。C++也可以說是C的增強版,所以在名字中使用了C語言中的自增量運算符++,而形成C++。但是,C++并不是C語言的簡單擴充,而是一個本質(zhì)性的變革。它在繼承C語言優(yōu)點的基礎(chǔ)上,提供了面向?qū)ο蟪绦蛟O(shè)計的能力。C++是一門優(yōu)秀的、高效實用的、具有發(fā)展前途的程序設(shè)計語言。學(xué)好C++,很容易觸類旁通地學(xué)好其他程序設(shè)計軟件。

1.輸入與輸出

C++有許多自己的特性,其中之一是將輸入/輸出改進為I/O流。例如,cout<<2就是將2這個數(shù)據(jù)送給顯示器,cin>>a就是從鍵盤讀取數(shù)據(jù)賦給a。cout和cin都是關(guān)鍵字。標(biāo)識符cout代表屏幕,運算符<<用于把內(nèi)容放進輸出流,即將數(shù)據(jù)送到顯示器。若有語句cout<<"IlearnC++";,執(zhí)行該語句之后就能在顯示器上看到“IlearnC++”。1.2C++入門輸出后若要換行可以使用語句cout<<“IlearnC++”<<endl;,endl的作用是換行并刷新輸出流。用cout<<的方式輸出數(shù)據(jù)時,對于基本數(shù)據(jù)類型,它能自動匹配一種合適的類型輸出,所以輸出時不必再指出數(shù)據(jù)類型。標(biāo)識符cin代表鍵盤,提取運算符>>用于把內(nèi)容放進輸入流,即把從鍵盤敲入的數(shù)據(jù)送到給定的單元中。

C++規(guī)定,凡使用輸出流和輸入流的程序,要用#include<iostream.h>包含頭文件。這部分內(nèi)容詳見第8章。

2.標(biāo)識符

在C++中,將由程序員命名的各名稱,如變量名a等都稱為標(biāo)識符。在命名標(biāo)識符時要注意幾點:第一,標(biāo)識符要以字母或下劃線開頭,后接由字母、數(shù)字或下劃線組成的字符序列;第二,命名標(biāo)識符時,不能使用已被系統(tǒng)定義的關(guān)鍵字;第三,可用大小寫字符來區(qū)別不同的標(biāo)識符。

表1-1列出了C++中的關(guān)鍵字。表1-1C++中的關(guān)鍵字1.3.1從結(jié)構(gòu)到類

有一個學(xué)生的部分信息如圖1-1所示,在C中可以用結(jié)構(gòu)體類型描述如下:

structstudent

{longnum;

charname[20];

intscore;

};

structstudentstu;1.3類的基本概念圖1-1結(jié)構(gòu)組成上面的描述在C中定義了一個student的結(jié)構(gòu)體,并定義了一個該結(jié)構(gòu)體的變量stu。在C++中也有結(jié)構(gòu)的概念,如:

structstudent

{longnum;

charname[20];

intscore;

};

studentstu;比較這兩種方法,對于同樣的定義,C++的描述只不過少了關(guān)鍵字struct。在C++中我們認為該描述定義了一個student的結(jié)構(gòu)體,并定義了一個該結(jié)構(gòu)體的對象stu。stu就是一個學(xué)生對象,學(xué)生是人,當(dāng)然會有一些行為。為了表現(xiàn)行為,在C++中的結(jié)構(gòu)體內(nèi)還可以定義函數(shù),用它可以實現(xiàn)某一功能。接上題描述一個學(xué)生的情況,并增加學(xué)習(xí)行為,在C++中用結(jié)構(gòu)體的方法可描述如下:

structstudent

{longnum;

charname[20];

intscore;

voidStudy();

};

studentJonas;該描述定義了一個名叫student的結(jié)構(gòu)體,并定義了一個該結(jié)構(gòu)體的對象Jonas。于是就可用Jonas.score=5;進行賦值,用Jonas.Study()來調(diào)用成員函數(shù)表現(xiàn)行為。這兩個語句的語意可描述為:Jonas得到了5個學(xué)分,Jonas去學(xué)習(xí)。

在C++的結(jié)構(gòu)體中可以定義函數(shù)。我們將結(jié)構(gòu)內(nèi)定義的函數(shù)稱為成員函數(shù),通過它可以實現(xiàn)某種功能來表現(xiàn)行為。在C中,結(jié)構(gòu)體內(nèi)的成員是公開的,在結(jié)構(gòu)體外部通過變量名引導(dǎo)就可以對成員進行訪問,這樣就很難保證數(shù)據(jù)的安全。為了能對結(jié)構(gòu)體內(nèi)成員的訪問有所限制,C++中引入了“類”的概念。所謂“類”,是把事物的數(shù)據(jù)和與之相關(guān)的功能封裝在一起,形成一種特殊的結(jié)構(gòu)體,用以表示真實事物的一種抽象概念。在C++中定義類的關(guān)鍵字用class而不用struct。C++中的類是struct的一種形式。類是C++語言中的一種數(shù)據(jù)類型,它既可以包含描述事物特征的數(shù)據(jù),又可以包含表現(xiàn)這些特征的函數(shù)。在類中的成員允許有public(公有的)、private(私有的)和protected(保

護的)。

在面向?qū)ο蟪绦蛟O(shè)計方法中,程序是通過對象的表現(xiàn)來實現(xiàn)的,而對象的所有行為和特征都是由類來決定的。因此要建立對象,首先必須定義類。定義類的一般方法如下:

class類名

{private: //標(biāo)識成員的性質(zhì)

私有成員

public:

//標(biāo)識成員的性質(zhì)

公有成員

};關(guān)鍵字class和類名組成類頭,類名的命名要符合標(biāo)識符的規(guī)定,通常第一個字母要大寫。類的定義體用“{”和“}”括住,可將它稱為類體。類體中是類成員表。右括號后加分號“;”,作為類定義的結(jié)束標(biāo)記。一個類就是由用戶定義的一個新增類型,這個類型并不“抽象”,我們對它的使用就像使用int和float一樣簡單。在上面的定義方法中,“//”之后的文字是注釋,對程序的執(zhí)行不起作用,但可以幫助理解程序。在上面的描述中,類名Student代表的是一個新增數(shù)據(jù)類型,可以通過它來定義對象。對象的定義方法與我們用內(nèi)部類型定義變量的方法一樣。例如:

voidmain()

{StudentJonas;}//定義了一個Student類的對象Jonas

引入類的概念之后,我們可以把學(xué)生信息重新描述為:定義了一個學(xué)生類Student,并在主函數(shù)中定義了一個該類的對象Jonas。1.3.2屬性與行為

類的描述主要由屬性和行為兩部分組成。屬性用于描寫個性,由數(shù)據(jù)成員來完成。行為用于實現(xiàn)某一功能,由成員函數(shù)來完成。行為(函數(shù))publicStudy(intx)屬性(數(shù)據(jù))privatenum、name[20]、score圖1-2屬性和行為

在C++中定義類時并不分配內(nèi)存單元,只有定義了類的對象之后才分配內(nèi)存單元。在例1-1中定義了一個類Student,并通過該類定義了一個對象Jonas,這時就在內(nèi)存中開辟了一片空間,如圖1-2所示。有了內(nèi)存空間,就可以對該空間的數(shù)據(jù)進行存取等操作了。

用private和public可將類的成員分為私有和公有兩個區(qū)。private區(qū)的成員具有私有性,類的外部不能訪問它們;public區(qū)的成員具有公有性,類的外部可以對它們進行訪問。我們將private、public等稱為訪問控制說明。圖1-2屬性和行為類中的所有成員只能是成員函數(shù)或數(shù)據(jù)成員。類的行為由成員函數(shù)來實現(xiàn),類的特征由數(shù)據(jù)成員來表現(xiàn)。在上面的類定義中,Student類有學(xué)號、姓名和成績?nèi)齻€特征,有學(xué)習(xí)課程的行為,并通過學(xué)習(xí)累積學(xué)分。

在主函數(shù)中定義了一個Student類的對象Jonas。整個學(xué)生是一個群體,是一個學(xué)生類,而Jonas是學(xué)生中的一個對象,是學(xué)生中的一員。Jonas有統(tǒng)計學(xué)分的行為,該行為是公有的,同時他還有學(xué)號、姓名、成績等私有屬性。1.3.3封裝與隱藏

1.類的封裝

類的封裝就是標(biāo)識成員的訪問控制說明,即指定某成員具有public(公有的)、private(私有的)或protected(保護的)性質(zhì)。類的這一要求稱為類的封裝性。在完成了封裝后,對于說明為public的成員,類的外部可以對它們進行訪問和操作;對于私有或保護成員,類的外部不能對它們進行訪問,只有該類的成員函數(shù)才有權(quán)對它們進行訪問。對于不指定訪問控制說明的成員,默認其封裝性為private。

2.封裝的作用

類有許多特性和方法,用戶不需要全部了解,也能很好地實現(xiàn)其功能,這就如我們并不需要了解電視機的內(nèi)部結(jié)構(gòu),只需通過一些按鈕便可使它發(fā)揮作用一樣。生產(chǎn)廠將內(nèi)部實現(xiàn)技術(shù)與外部接口自成于一體,這種自成一體性,稱為封裝。經(jīng)過封裝,用戶通過接口使類發(fā)揮作用,既保護了內(nèi)部元器件,又有利于技術(shù)保密。因此,封裝的作用就是有選擇地隱藏類中的特性和方法。通過封裝有選擇地隱藏類中的特性和方法,將類的一些數(shù)據(jù)成員聲明為私有以及通過公有成員函數(shù)對它們進行訪問,有助于保護它們的完整性。

C++定義的類具有封裝性。正確的類定義一旦建立,就可以將類看做是完成封裝的實體,可以作為一個整體單元被使用。通過公有接口也就是成員函數(shù),對類屬性實現(xiàn)有效的和有限的訪問,既使類發(fā)揮了功效,又使類得到了可靠的保護,這就是封裝的作用。

在C++中,成員函數(shù)的行為是由程序員規(guī)定好的,只能完成預(yù)定的功能,其他想通過成員函數(shù)來對被封裝的數(shù)據(jù)成員進行破壞的行為都不被理睬。這一封裝特性正是C++符合軟件工程理論的又一精妙之處。

3.封裝的目的

(1)相對于外部函數(shù)(普通函數(shù)或其他類的成員函數(shù))而言,使類內(nèi)部的保護和私有成員不被肆意更改。

(2)只有類的成員函數(shù)才能訪問保護或私有成員,使類具有自身的維護功能。

(3)限制類的外部接口,把類分成兩部分,一部分是公有的,一部分是保護的。

(4)減少類與其他代碼的關(guān)聯(lián)程度??梢灶惐纫幌挛覀兗抑械碾娔X,它由接口、鍵盤和主機箱等組成。接口和鍵盤是public的,允許我們使用,而主機箱內(nèi)是protected或private的,除維修人員以外是不能打開的。這樣做的好處是主機箱內(nèi)部的元器件可以不被肆意拆卸,減少了許多麻煩。通過接口、鍵盤和鼠標(biāo)等,我們可以正確地使用電腦的功能。而接口、鍵盤和鼠標(biāo)的功能是有限的,對它們的使用一般不會造成主機箱內(nèi)元件的損壞。通常我們所說的對象就是現(xiàn)實世界中的實體。比如我們每一個人就是一個對象。人有大腦、眼睛、鼻子、耳朵和手等。人還會有一些行為,如行走、工作和思考等。除了具有上面列舉的共同特性之外,每一個人還有自己的姓名、年齡和身高等。

把具有相同特性的對象進行抽象,歸并在一起,就可以用“類”的概念來描述。比如在描述人時,先要描述人類。首先說明人類是什么,然后說一個具體的人就是其中的一員,即一個對象。這種方法用程序設(shè)計的語言來描述就是先定義類,然后由類來定義對象。1.4現(xiàn)實生活中的類與對象1.4.1類的描述

C++使得我們能從真實客觀的角度來理解、開發(fā)應(yīng)用程序,這就要求程序設(shè)計應(yīng)當(dāng)是現(xiàn)實世界的體現(xiàn)。

比如描述汽車類,首先區(qū)分哪些是汽車的行為,哪些是它的特征。汽車的型號、生產(chǎn)廠和發(fā)動機等是特征,汽車的載客、行駛和制動等是行為。因為我們不希望汽車用戶改變型號、生產(chǎn)廠等,所以可將它們作為汽車類的私有數(shù)據(jù)成員。汽車的價值是供人使用,因此要將汽車的載客、行駛等作為汽車類的公有成員函數(shù)。類的外部可以對這些公有成員函數(shù)進行訪問,以便能表現(xiàn)它的行為。1.4.2類與對象

現(xiàn)實世界中的對象不僅有共性也有個性。我們?nèi)绾螌F(xiàn)實世界中的對象轉(zhuǎn)化為程序中的對象呢?即對于現(xiàn)實世界中的對象,如何在程序中表現(xiàn)出來呢?在本節(jié)中就要解決這個問題。程序中的對象也就是編程對象,它就是將對象的特性與行為組合在一起得到的結(jié)果。

1.編程中的類

程序設(shè)計的目的就是要解決實際問題。下面描述現(xiàn)實生活中的對象——人,并將他轉(zhuǎn)換為編程對象。類是一個抽象的概念,對象才是一個客觀的實體。例如,人類就是一個類,它可以有具體實物,就是人,這個人就是人類的對象。人有身高體重,并占有一定的空間。

2.編程中的對象

現(xiàn)實生活中的對象是生產(chǎn)、制造或生養(yǎng)出來的,程序中的對象要由類來定義。在程序中要定義對象,先要定義類,再通過類定義對象。類對所定義對象的數(shù)量并沒有限制。

現(xiàn)在用程序設(shè)計語言來描述一個學(xué)生對象。

3.代碼解釋

在例1-2中,Student就是一個類,它具有所有學(xué)生的共同特征和行為。該類有Student、Study和Display三個成員函數(shù),它們就是Student類對象所具有的行為。函數(shù)的具體實現(xiàn)就是它的行為能力。目前三個函數(shù)所做的事分別為初始化、累積學(xué)分和顯示成績。該類有num、name和score三個成員,它們就是Student類對象的特征,分別描述了學(xué)號、姓名和成績,稱為數(shù)據(jù)成員。

publicStudent()、Study(intx)、Display()、noprivatenum、name[20]、score在main函數(shù)中用StudentJonas;?定義了一個Student類的對象Jonas,內(nèi)存空間分配如圖1-3所示。Jonas就是學(xué)生中的一員,于是就具有Student、Study和Display的行為能力以及num、name和score特征。

在類中,因為成員函數(shù)是public,所以在類的外部可用對象名和分量運算符“.”來訪問成員,如Jonas.Display();或Jonas.no=223;。對于Jonas的private成員,就不能用對象名加分量運算符來訪問,即若用Jonas.num=2007;?就出錯。圖1-3結(jié)構(gòu)示意圖

4.訪問控制

在類的定義中,成員函數(shù)往往是類的共性,是類的所有對象共同具有的行為,所以將它們聲明為public,這樣便于類的所有對象訪問它們。也就是說,在類的外部能指揮對象,使其完成某種操作。類的數(shù)據(jù)成員往往是對象的個性與特征,一般聲明為private或protected。對于private或protected成員,類的外部是不能對它們進行訪問的,只有通過類的成員函數(shù)才可訪問。在面向?qū)ο蟪绦蛟O(shè)計中,程序被描述為:程序=(對象+對象+…),即程序就是許多對象在計算機中的相繼表現(xiàn)。

對象=(算法+數(shù)據(jù)結(jié)構(gòu))表明一個對象就是一個程序?qū)嶓w。對象是由類來定義的。1.5程序的具體實現(xiàn)1.5.1定義成員函數(shù)

C++的類中有成員函數(shù)和數(shù)據(jù)成員兩大部分。在類定義中,類的行為由函數(shù)來實現(xiàn),稱此函數(shù)為成員函數(shù)。類的特征用非函數(shù)形式來表現(xiàn),稱其為數(shù)據(jù)成員。將類中函數(shù)稱為成員函數(shù)的含義是:其一,它是類中的成員;其二,它是函數(shù),它能訪問類中的所有成員。成員函數(shù)的主要任務(wù)是,實現(xiàn)對對象的數(shù)據(jù)成員的操作。成員函數(shù)建立了類的內(nèi)部與外部有限聯(lián)系的橋梁。成員函數(shù)一般都聲明為公有的,這些公有成員函數(shù)在程序設(shè)計中被稱為類的接口。類的使用者用這些接口操作類的所有數(shù)據(jù)成員。

在C++中有兩種方法來定義成員函數(shù):在類中直接定義成員函數(shù);分別定義,即先定義類,然后再定義成員函數(shù)。

2.分別定義

所謂分別定義,就是在定義類之后再定義成員函數(shù)。分別定義時,必須指出該成員函數(shù)屬于哪個類。因此,定義成員函數(shù)的一般方法是:

返回類型類名::函數(shù)名(參數(shù)表){函數(shù)體}

其中,::稱為域區(qū)分符。在上述代碼中用到了域區(qū)分符::,它在這里是雙目運算符,指明該函數(shù)或數(shù)據(jù)屬于哪個類。當(dāng)用分別定義的方法定義成員函數(shù)時,就要使用域區(qū)分符。

域區(qū)分符還可作為單目運算符使用。此時它的作用是,使得被屏蔽的全局對象在它的作用域內(nèi)重現(xiàn)。該用法是C++中新增的內(nèi)容。在C中,在全局對象(包括變量、函數(shù)等)的作用域內(nèi)一旦定義了同名的局部對象,就將全局對象屏蔽而不可見。在C++中我們可以用域區(qū)分符::使被屏蔽的全局對象可見。使用方法是,在數(shù)據(jù)或函數(shù)前加::,表示該數(shù)據(jù)或函數(shù)是全局數(shù)據(jù)或全局函數(shù),而非成員。請看下面的例子。本例中定義了三個全局變量month、day和year。在它們的作用域內(nèi),函數(shù)Set中又定義了同名變量,將原變量屏蔽。所以在Set函數(shù)體中,若要訪問數(shù)據(jù)成員,就直接給出變量名,若要訪問被屏蔽的全局變量,就要加域區(qū)分符::。同樣地,在函數(shù)Set的作用域內(nèi),類Tdate中又定義了同名函數(shù)Set,將原函數(shù)屏蔽。因此在成員函數(shù)Set中要訪問被屏蔽的函數(shù)Set時就要加域區(qū)分符::。

3.接口與實現(xiàn)相分離

上面提供的兩種定義成員函數(shù)的方法在本質(zhì)上是一種方法,即類的定義和成員函數(shù)的定義在同一個文件中。將類的定義和其成員函數(shù)的定義分為兩個文件,然后再用包含文件建立聯(lián)系,這是目前開發(fā)程序常用的做法。我們把類定義看成是類的外部接口。由于接口的連接是通過成員函數(shù)來實現(xiàn)的,因此把類的成員函數(shù)定義看成是類的內(nèi)部實現(xiàn)。我們稱這一方法為接口與實現(xiàn)相分離。經(jīng)分離后,包含類定義的部分稱為頭文件,包含成員函數(shù)定義的部分稱為實現(xiàn)文件。然后再用包含文件建立聯(lián)系,將它們編譯連結(jié)成一體。例1-3先建立一個名叫stu.h的頭文件,將所有類定義都放入其中,再建立一個名叫stu.cpp的實現(xiàn)文件,并用#include“stu.h”將頭文件包含到實現(xiàn)文件內(nèi)。

在頭文件中用到的#ifndefSTUD_H、#defineSTUD_H…#endif是預(yù)處理代碼,其作用是防止該頭文件被多次包含。在開發(fā)一個大型程序時常使用該方法。

4.接口與實現(xiàn)相分離的評價

接口與實現(xiàn)相分離有利于軟件公司將類庫作為商品。在該商品中只提供頭文件和目標(biāo)模塊,并不公開內(nèi)部實現(xiàn)。這種技術(shù)被稱為信息隱藏。用戶只要用包含頭文件的方法就能使用該類庫,這樣既有效地保護了開發(fā)者的知識產(chǎn)權(quán),又實現(xiàn)了資源共享。我們推薦采用接口與實現(xiàn)相分離的方法。這樣做的好處主要有:

(1)保護知識產(chǎn)權(quán)。通過分離可將類內(nèi)部的特性和方法隱藏起來,用戶不需要知道也無法知道類是如何工作的,只需要了解其外特性和外部操作就能有效并安全地使用類,使其發(fā)揮功效,實現(xiàn)共享與保密的統(tǒng)一。

(2)高效與方便。當(dāng)由于某種原因需要改變類的內(nèi)部私有實現(xiàn)代碼時,只要接口不變就不會影響到類的用戶。1.5.2調(diào)用成員函數(shù)

在類定義中聲明的成員名以及類的數(shù)據(jù)成員或成員函數(shù),都屬于類的作用域。在類的作用域內(nèi),類的成員之間可以直接互訪。在類的作用域外只能訪問公有成員,且要有對象名引導(dǎo)。一般情況下,成員函數(shù)總是聲明為公有,數(shù)據(jù)成員聲明為私有或保護。

對于實施封裝后的類,外部不能對其保護或私有成員進行直接訪問。對類中數(shù)據(jù)成員的訪問,要通過成員函數(shù)來完成。成員函數(shù)是類的接口。成員函數(shù)屬于某個類或?qū)ο螅援?dāng)要調(diào)用成員函數(shù)時必須指明隸屬關(guān)系,即要用類或?qū)ο髞硪龑?dǎo),或者用指向某對象的指針來引導(dǎo)。

調(diào)用成員函數(shù)分為在類的內(nèi)部調(diào)用和在類的外部調(diào)用兩種情況。在類的內(nèi)部調(diào)用是指在成員函數(shù)中調(diào)用同一類的另一個成員函數(shù),此時可以直接進行,不需要使用點“·

”運算符。在類的外部調(diào)用成員函數(shù)的方法可有如下幾種。

1.用對象引導(dǎo)

用對象引導(dǎo)調(diào)用成員函數(shù)的形式類似于訪問一個結(jié)構(gòu)體對象的分量,先指明對象,再指明成員,即以對象加上點“·

”操作符和成員函數(shù)的形式訪問,如下面例1-4中的t1.Set(2002,1,28)。

2.用類名引導(dǎo)

采用類名引導(dǎo)的方法調(diào)用成員函數(shù)要求類名與域區(qū)分符結(jié)合使用,即類名::成員函數(shù)。用這種方法訪問類的成員函數(shù)的具體內(nèi)容將在第3章和第7章中介紹。

3.用指針訪問

通過類的指針也可以訪問成員函數(shù),方法是:先定義一個類的指針,用指針指向?qū)ο?,然后用該指針調(diào)用成員函數(shù),如例1-4中的p->play()。

4.用引用傳遞

用引用傳遞來訪問成員函數(shù)是指用對象的引用來調(diào)用成員函數(shù),這看上去和使用自身的簡單情況一樣。這部分內(nèi)容將在第4章中介紹。運行結(jié)果:

Thedateis:2002 1 28

Thedateis:2002 11 5

Thedateis:2002 1 28

w=2

Thedateis:2002 11 5

在例1-4中定義了Tdate類并對它進行了封裝;定義了一個與Tdate類成員函數(shù)同名的普通函數(shù)Set。例1-4演示了三種成員函數(shù)的訪問方法。第一種,通過對象名,如t1.Set(2002,1,28)和t2.Set(2002,11,5);第二種,通過類的指針,如p->play();第三種,在類的成員函數(shù)內(nèi)訪問該類成員函數(shù),如Tdate::Set()中的play()。在類的成員函數(shù)中對類的所有成員的訪問沒有限制。

普通函數(shù)Set不能訪問Tdate類中的private成員,但可以訪問類中的公有數(shù)據(jù)成員。訪問方法為對象名加分量運算符加公有成員名。如例1-4中的t2.week=18和Set()中的t.week=w。1.6.1成員函數(shù)和數(shù)據(jù)成員的關(guān)系

通過類來創(chuàng)建一個或多個對象時,這些對象都有各自所占有的空間,它們在內(nèi)存中的分布情況是:每個對象都會自動生成一份表現(xiàn)自我特征的數(shù)據(jù)成員拷貝,并獨占某一片空間。而成員函數(shù)只有一份拷貝,它由該類所有的對象共享。也就是說,同類的各對象都能得到一份數(shù)據(jù)成員的拷貝,這些拷貝屬于各個對象所有,彼此之間不能共享;而成員函數(shù)僅有一份,它為各個對象所共享。

同一個類的各對象的成員函數(shù)和數(shù)據(jù)成員的關(guān)系如圖1-4所示。1.6this指針圖1-4成員函數(shù)和數(shù)據(jù)成員的關(guān)系從圖1-4可知,當(dāng)創(chuàng)建多個對象時,有多份數(shù)據(jù)成員的副本,而只有一份成員函數(shù)的副本,也就是我們常說的一對多的關(guān)系。那么成員函數(shù)如何區(qū)分數(shù)據(jù)成員是哪個對象的呢?1.6.2this指針的作用

某個類定義了多個對象,為了節(jié)省空間,在該類的各個對象中有多份數(shù)據(jù)成員的拷貝,只有一份成員函數(shù),它是各對象共有的。這唯一的一份成員函數(shù)要供該類的所有對象共同使用,C++通過引入this指針來區(qū)分各對象的數(shù)據(jù)成員。1.6.3this指針的工作方式

每個對象都有一個指向自身的指針——this指針。在引用對象內(nèi)部成員時,this指針是一個隱含的參數(shù)。關(guān)鍵字this給出了調(diào)用成員函數(shù)的對象的地址。每當(dāng)調(diào)用成員函數(shù)時,編譯器會向this指針分配調(diào)用該函數(shù)對象的地址。在例1-4中使用t1.Set(2002,1,28);和t2.Set(2002,11,5);兩次調(diào)用同一個成員函數(shù)Set,對于數(shù)據(jù)成員month、day、year分屬于t1或t2的確認,就是通過this指針完成的。當(dāng)對某一對象操作時就有一個隱含的this指針指向該對象,所以說在進行t1.Set(2002,1,28);的Set函數(shù)中,隱含的t1對象的this指針起到了this->month=m;this->day=d;this->year=y;this->play();的作用。

【例1-5】this指針的作用和工作方式演示。#include<iostream.h>

classTest

{public:

voidSet(int);

voidShow(); //成員函數(shù)

private:

intx;

};

voidTest::Set(inta){x=a;}運行結(jié)果:

x=12 this->x=12 (*this).x=12

//三種表現(xiàn)形式完全等價,輸出結(jié)果一樣

x=24 this->x=24 (*this).x=24

從輸出的兩行數(shù)據(jù)可知,加與不加this,結(jié)果都一樣,它通過隱含的this指針來區(qū)分不同對象的數(shù)據(jù)成員。

this指針也可以使被屏蔽的對象重現(xiàn)。對于類成員函數(shù)中出現(xiàn)的變量(對象)名,編譯器的查找過程是:首先在該成員函數(shù)中尋找匹配,接著在類成員中尋找匹配,然后考慮在該成員函數(shù)定義之前的名字空間域中尋找匹配。運行結(jié)果:

x=6

由于在Test函數(shù)中定義了局部變量x,因此執(zhí)行x=8時編譯器首先匹配到了局部變量x,于是x=8就作用到了局部變量x。若要使其作用到類數(shù)據(jù)成員x,就要用this->x。要注意this指針不是一個常規(guī)的變量,不能取得this的地址或者給它賦值。1.7.1作用域

類的作用域是指類定義和相應(yīng)的成員函數(shù)定義的作用范圍。在該范圍內(nèi),一個類中的成員之間可以相互訪問。在類的成員函數(shù)之外對類的數(shù)據(jù)進行訪問是有限制的。

1.在成員函數(shù)內(nèi)部

在成員函數(shù)內(nèi)部,對該類的數(shù)據(jù)成員或成員函數(shù)的訪問沒有什么限制與不同。1.7作用域、可見性及命名規(guī)則

2.在成員函數(shù)外部

在類的成員函數(shù)之外對類的數(shù)據(jù)成員進行訪問是有限制的。對于private或protected的數(shù)據(jù)成員,只能通過成員函數(shù)進行訪問。對于public的數(shù)據(jù)成員,可以用Jonas.x進行直接訪問。按上面的類和成員函數(shù)的定義,可以添加main函數(shù)如下:voidmain()

{Student Jonas; //定義Student類的對象Jonas

Jonas.x=6; //公有成員可以進行直接訪問

Jonas.StudyA(5);

//私有成員只能通過成員函數(shù)進行有限訪問

}1.7.2可見性

類的作用域確定了變量名或者函數(shù)名等標(biāo)識符的可見性,當(dāng)標(biāo)識符在作用域內(nèi)可見時,就可以使用該標(biāo)識符。但是當(dāng)成員名與程序中的其他變量名或者函數(shù)名同名時,就要用下面的方法進行訪問。

1.同名的局部變量的可見性

如果在成員函數(shù)中定義了同名的局部變量,則將原變量屏蔽,即不可訪問原變量。在本例中,Student類的成員函數(shù)Study可以訪問Student類的私有數(shù)據(jù)成員num,但是在Study中又定義了同名的局部變量num,此時將原變量num屏蔽而使其不可訪問,即使加上域區(qū)分符也不行,因為num不是全局數(shù)據(jù),所以::num=123非法。正確的方法是:Student::num=123或this->num=123。

2.類名可見性

如果一個非類名隱藏了類名,則類名通過加前綴class即可見。

voidfun()

{intStudent; //定義一個變量Student,是變量名而非類名

classStudentstu;//定義一個對象stu,非類名隱藏了類名

Student=8; //對變量賦值

}在本例中,在fun函數(shù)之前已經(jīng)定義了Student類,而在fun內(nèi)又將Student定義為變量名。這在語法上是成立的,其實際效果是這個變量名隱藏了類名,使類名不可見。要使類名可見,就要加前綴class。

3.非類名可見性

如果一個類名隱藏了一個非類名,則用一般作用域規(guī)則即可。

intStudent;

//全局變量

voidfun()

{

classStudent //定義一個局部類

{inta;};

Studentstu; //定義一個對象stu

::Student=8;

//對全局變量賦值,要加前綴域區(qū)分符

}在本例中,類名Student隱藏了全局變量名Student,對變量的訪問要加域區(qū)分符。這個Student類屬于函數(shù)中定義的局部類,它的成員函數(shù)必須在類定義內(nèi)部定義。在面向?qū)ο蟮某绦蛟O(shè)計中,這種情況很少出現(xiàn)。1.7.3命名規(guī)則

C++中要求一個名字必須有唯一的作用域,因此就存在有關(guān)命名的規(guī)則。這些規(guī)則包括:

(1)一個名字不能同時指定為兩種類型。如:

??classStudent

{…};

typedefintStudent;

//error,把Student同時定義為類類型和整型

因為typedef并沒有創(chuàng)建新的類型,所以Student同時被指定為兩種類型。

(2)類名不能重名。

(3)非類名(常量名、變量名、函數(shù)名、對象名和枚舉成員名)不能同名。如:

Studentstu;

voidstu()

//error,函數(shù)名同對象名

{…}1.8C++程序結(jié)構(gòu)1.8.1類庫的構(gòu)成

一個商業(yè)性C++類庫包括類定義和成員函數(shù)定義。類定義以頭文件的方式提供,成員函數(shù)則以代碼的方式提供。該方式以一定的計算機硬件或操作系統(tǒng)為背景編譯實現(xiàn)。

在設(shè)計類時要考慮到封裝,往往把數(shù)據(jù)成員作為私有或保護的,而將成員函數(shù)作為公有的。需要多少數(shù)據(jù)成員,主要由參加運算的數(shù)據(jù)量來決定。

面向?qū)ο髴?yīng)用程序設(shè)計方法常常能夠減少函數(shù)調(diào)用所需傳遞的參數(shù)個數(shù)。這一優(yōu)點得益于這樣一個事實:既將數(shù)據(jù)成員和成員函數(shù)封裝在類的內(nèi)部,又賦予了成員函數(shù)訪問數(shù)據(jù)成員的權(quán)利。1.8.2程序開發(fā)

C++的程序設(shè)計方法是:首先要設(shè)計類,對于想要實現(xiàn)的各功能,可添加成員函數(shù)并在函數(shù)體內(nèi)完成功能的設(shè)計;然后再定義對象,通過對象來調(diào)用成員函數(shù),使該對象表現(xiàn)出所需行為。

【例1-7】演示一個完整的程序開發(fā)過程。

【例1-8】建立一個計算類,用面向?qū)ο蟪绦蛟O(shè)計的觀點實現(xiàn)三項要求:已知月球上的物體重量是地球上的1/17,編寫程序計算在地球上重量數(shù)為1~100(間隔為10)的物體在月球上的對應(yīng)重量數(shù);編寫程序求出1到X之間的所有素數(shù);顯示計算結(jié)果。方法二:添加可選擇操作菜單。若選擇1就計算1~100之間地球與月球上的物體重量數(shù)對應(yīng)關(guān)系;若選擇2就求出1~100之間的素數(shù);若選擇3就輸出結(jié)果。

//cou.h類頭文件名,類的外部接口

#ifndefCOU_H

#defineCOU_H

classCount

{private://cou.cpp類的內(nèi)部實現(xiàn)

#include"cou.h"

#include<iostream.h>

boolCount::Begin()

{charch;

cout<<"1.countweight\n";

cout<<"2.countdata\n";

cout<<"3.countshow\n";

cout<<"Chooseone(qtoquit):";

cin>>ch;

if(ch<'1'||ch>'3'&&ch!='q') //選擇q就退出通過以上兩例可以看出,面向?qū)ο蟪绦蛟O(shè)計包含類庫開發(fā)和應(yīng)用程序設(shè)計兩個環(huán)節(jié),其中的大量工作就是類庫開發(fā),應(yīng)用程序設(shè)計要盡量簡單明了。在定義類時,要將所需的屬性(數(shù)據(jù)成員)和行為(成員函數(shù))加入其中。在應(yīng)用程序設(shè)計時,就由類來定義對象并讓對象表現(xiàn)自己(調(diào)用成員函數(shù))。例1-8中的程序片段可以用圖1-5表示。

圖1-5中將程序分成三個模塊。用戶代碼放在第三個文件user.cpp中。在cou.cpp和user.cpp中的代碼共享由cou.h提供的界面信息,除此之外這兩個文件就是互不相關(guān)的,可以分別編譯。分別編譯在實際開發(fā)應(yīng)用程序中是相當(dāng)重要的,它可以幫助我們更好地實現(xiàn)模塊化。圖1-5程序結(jié)構(gòu)●?C++是C的超集,C中可用的語法規(guī)則在C++中都可用。

●?在面向?qū)ο蟪绦蛟O(shè)計中,程序被描述為:對象=(算法+數(shù)據(jù)結(jié)構(gòu)),程序=(對象+對象+…)。

●?C++是一種流行的面向?qū)ο蟮某绦蛟O(shè)計語言。它通過類機制,最有效地實現(xiàn)了面向?qū)ο蟮脑?。它使得我們能從真實生活的角度來理解、開發(fā)應(yīng)用程序。

●?類是對現(xiàn)實世界中的實體進行抽象的結(jié)果。類是一個抽象的概念,是一個抽象的數(shù)據(jù)類型。本章要點●?定義類由關(guān)鍵字class開始,后加類名和用“{”及“}”括住的類定義體,最后加“;”。

●?類名要符合標(biāo)識符的命名規(guī)定。建議其第一個字母要大寫,以區(qū)分類名和對象名。

●?對象是一個客觀的實體,是類的一個實例。

●?對象的特性:對象是類的一個實例,它具有成員函數(shù)和數(shù)據(jù)成員。其中成員函數(shù)表現(xiàn)了對象的行為

溫馨提示

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

評論

0/150

提交評論