面向?qū)ο笳n件_第1頁
面向?qū)ο笳n件_第2頁
面向?qū)ο笳n件_第3頁
面向?qū)ο笳n件_第4頁
面向?qū)ο笳n件_第5頁
已閱讀5頁,還剩438頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο蟮脑O(shè)計(jì)方法面向?qū)ο蟮腃++程序設(shè)計(jì)基礎(chǔ)21.1面向?qū)ο蟮乃枷胍?、面向?qū)ο蟮暮x

“面向?qū)ο蟆笔擒浖O(shè)計(jì)的一種新思想,旨在使人們分析、設(shè)計(jì)系統(tǒng)的方法更接近認(rèn)識(shí)系統(tǒng)的方法;

面向?qū)ο蠓椒ň褪菫橛?jì)算機(jī)軟件的創(chuàng)建提出了一種模型化世界的抽象方法;軟件工程專家給出了面向?qū)ο蟮拿枋觯?/p>

面向?qū)ο?/p>

=對(duì)象

+分類

+繼承

+消息通信

即面向?qū)ο缶褪鞘褂脤?duì)象、類、繼承等機(jī)制,對(duì)象之間僅能通過消息的傳遞實(shí)現(xiàn)通信。3

二、面向?qū)ο蟮某绦蛟O(shè)計(jì)

面向過程的程序設(shè)計(jì)

基本思想:模塊分解和功能抽象,復(fù)雜的程序必然包含一組數(shù)據(jù)以及用來處理這些數(shù)據(jù)的函數(shù),但函數(shù)是獨(dú)立的。程序自身不清楚哪些函數(shù)處理了這些數(shù)據(jù),即數(shù)據(jù)與處理這些數(shù)據(jù)的操作相分離。缺點(diǎn)是:1、程序修改麻煩:例如程序修改了一個(gè)變量名,則要修改所有使用該變量的語句;2、可靠性差,一致性難以保證:數(shù)據(jù)沒有封裝,數(shù)據(jù)可能被分散于程序各處的函數(shù)改變,數(shù)據(jù)從整體上很難保證可靠和一致。

面向?qū)ο蟮乃枷?

面向?qū)ο蟮某绦蛟O(shè)計(jì)

基本思想:將客觀世界抽象為多個(gè)對(duì)象,將要設(shè)計(jì)的系統(tǒng)表示為對(duì)象的集合;對(duì)同類對(duì)象抽象出其共性,形成類;類是封裝了“數(shù)據(jù)和處理這些數(shù)據(jù)的操作”的一個(gè)整體,對(duì)象是類的實(shí)例;類通過外部接口與外界聯(lián)系,對(duì)象之間通過消息進(jìn)行通訊。

類和對(duì)象是實(shí)現(xiàn)數(shù)據(jù)封裝的具體機(jī)制,通過這種機(jī)制,把數(shù)據(jù)以及與其相關(guān)的操作進(jìn)行封裝(或捆綁),外界不能隨意修改和任意使用這些量,只有滿足一定的訪問權(quán)限才能進(jìn)行訪問操作,增強(qiáng)了數(shù)據(jù)的安全性(解決了數(shù)據(jù)與操作相分離)。二、面向?qū)ο蟮某绦蛟O(shè)計(jì)面向?qū)ο蟮乃枷?面向?qū)ο蟮幕靖拍?/p>

——對(duì)象一般意義上的對(duì)象:是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物。可以是有形的(比如一輛汽車),也可以是無形的(比如一項(xiàng)計(jì)劃)。是構(gòu)成世界的一個(gè)獨(dú)立單位,具有:靜態(tài)特征:可以用某種數(shù)據(jù)來描述動(dòng)態(tài)特征:對(duì)象所表現(xiàn)的行為或具有的功能6面向?qū)ο蟮幕靖拍?/p>

——對(duì)象面向?qū)ο蠓椒ㄖ械膶?duì)象:是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,它是用來構(gòu)成系統(tǒng)的一個(gè)基本單位。對(duì)象由一組屬性和一組行為構(gòu)成。屬性:用來描述對(duì)象靜態(tài)特征的數(shù)據(jù)項(xiàng)。行為:用來描述對(duì)象動(dòng)態(tài)特征的操作序列。7一、現(xiàn)實(shí)世界中的對(duì)象對(duì)象是現(xiàn)實(shí)世界的一個(gè)實(shí)體,它具有如下特征:1、有一個(gè)名字以區(qū)別于其他對(duì)象;2、有一個(gè)狀態(tài)用來描述它的某些特征;3、有一組操作,每一個(gè)操作決定了對(duì)象的一種功能或行為;對(duì)象的操作分為兩類:1)自身所承受的操作。2)是它施加于其它對(duì)象的操作。(例如人可以接受知識(shí),人可以駕駛汽車)面向?qū)ο蟮幕靖拍?二、計(jì)算機(jī)世界中的對(duì)象在計(jì)算機(jī)世界中,可以把對(duì)象看成是存儲(chǔ)器中一個(gè)可標(biāo)識(shí)的區(qū)域,它能保存固定或可變數(shù)目的數(shù)值(或數(shù)值的集合),這些數(shù)值代表對(duì)象的屬性數(shù)據(jù)和對(duì)象的成員函數(shù)代碼。從軟件形式上看,對(duì)象是系統(tǒng)程序員、應(yīng)用程序員或用戶所定義的抽象數(shù)據(jù)類型的變量。面向?qū)ο蟮幕靖拍?對(duì)象的狀態(tài)指對(duì)象自身所具有的那些特征(屬性);這些狀態(tài)的存在,使對(duì)象能對(duì)自身以及對(duì)外界對(duì)象施加操作;對(duì)象的狀態(tài)并不是完全用來直接為外界服務(wù)的,但它們本身是能夠?yàn)橥饨绶?wù)的基礎(chǔ)。

對(duì)象的狀態(tài)面向?qū)ο蟮幕靖拍?0模塊獨(dú)立性對(duì)象是獨(dú)立存在的模塊,封裝了數(shù)據(jù)和操作。外部使用時(shí)只需了解它具有哪些功能。模塊間的依賴性極小或幾乎沒有。動(dòng)態(tài)連接性對(duì)象之間有聯(lián)系,通過消息激活機(jī)制,把一個(gè)個(gè)對(duì)象動(dòng)態(tài)地連接在一起。易維護(hù)性對(duì)象修改、功能完善及實(shí)現(xiàn)的細(xì)節(jié)都被局限于對(duì)象的內(nèi)部,不會(huì)涉及到外部。

對(duì)象的特性面向?qū)ο蟮幕靖拍?1面向?qū)ο蟮幕靖拍?/p>

——類分類——人類通常的思維方法分類所依據(jù)的原則——抽象忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個(gè)抽象的概念。例如,石頭、樹木、汽車、房屋等都是人們?cè)陂L期的生產(chǎn)和生活實(shí)踐中抽象出的概念。12面向?qū)ο蟮幕靖拍?/p>

——類面向?qū)ο蠓椒ㄖ械?類"具有相同屬性和服務(wù)的一組對(duì)象的集合為屬于該類的全部對(duì)象提供了抽象的描述,包括屬性和行為兩個(gè)主要部分。類與對(duì)象的關(guān)系:

猶如模具與鑄件之間的關(guān)系,一個(gè)屬于某類的對(duì)象稱為該類的一個(gè)實(shí)例。面向?qū)ο蟮幕靖拍?3

類與對(duì)象的關(guān)系類(模板)與對(duì)象(實(shí)例)的關(guān)系是抽象與具體的關(guān)系;同一類的不同實(shí)例之間,必有如下特點(diǎn):相同的操作集合;相同的屬性集合;不同的對(duì)象名。面向?qū)ο蟮幕靖拍?4

類的確定與描述類的確定采用歸納法,基于對(duì)所遇到對(duì)象的總體分析中,歸納出其共同的特征來定義類;類是數(shù)據(jù)和對(duì)這些數(shù)據(jù)進(jìn)行操作的函數(shù)的封裝體,它是一種同時(shí)含有數(shù)據(jù)和函數(shù)的構(gòu)造數(shù)據(jù)類型(結(jié)構(gòu));類的描述同時(shí)包括數(shù)據(jù)和函數(shù)定義,類中的數(shù)據(jù)和函數(shù)稱為類的成員(數(shù)據(jù)成員、成員函數(shù));數(shù)據(jù)成員是類的那些成員函數(shù)需要用到的變量,成員函數(shù)是對(duì)數(shù)據(jù)成員進(jìn)行處理的程序段。面向?qū)ο蟮幕靖拍?5面向?qū)ο蟮幕咎匦?/p>

——封裝性把對(duì)象的屬性和服務(wù)結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單元。盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。對(duì)外形成一個(gè)邊界(或者說一道屏障),只保留有限的對(duì)外接口使之與外部發(fā)生聯(lián)系。16

什么是封裝性?在面向?qū)ο笾?,封裝是將一段程序代碼“包裝”起來,只需知道這段“代碼”完成的功能,而不必關(guān)心功能的實(shí)現(xiàn)細(xì)節(jié);“代碼”包括一組數(shù)據(jù)和與這組數(shù)據(jù)相關(guān)的操作;封裝是指將一組數(shù)據(jù)(對(duì)象屬性)和與這組數(shù)據(jù)相關(guān)的操作(對(duì)象服務(wù))集合在一起,形成一個(gè)不可分割、獨(dú)立的實(shí)體—對(duì)象,用戶不必知道對(duì)象行為的實(shí)現(xiàn)細(xì)節(jié),只需根據(jù)對(duì)象提供的外部接口訪問對(duì)象的服務(wù)。面向?qū)ο蟮幕咎匦?7

1.有一個(gè)清楚的邊界,對(duì)象的所有私有數(shù)據(jù)、內(nèi)部程序(成員函數(shù))細(xì)節(jié)都被限定在這個(gè)邊界內(nèi);

封裝應(yīng)該具有以下幾個(gè)條件:2.至少有一個(gè)接口,這個(gè)接口描述了該與其它對(duì)象之間的相互作用、請(qǐng)求和響應(yīng),它就是消息;3.對(duì)象行為的內(nèi)部實(shí)現(xiàn)代碼受封裝殼的保護(hù),其他對(duì)象不能直接修改該對(duì)象所擁有的數(shù)據(jù)和相關(guān)程序代碼。面向?qū)ο蟮幕咎匦?8

面向?qū)ο笙到y(tǒng)的封裝性

面向?qū)ο笙到y(tǒng)的封裝性是一種信息隱藏技術(shù)。它的目的在于將對(duì)象的使用者與設(shè)計(jì)者分開,使用者不必知道對(duì)象行為實(shí)現(xiàn)的細(xì)節(jié);

封裝機(jī)制提供了一種共享代碼的手段。通過封裝,把一段代碼定義在一個(gè)類中,并且在另一個(gè)類所定義的操作中,可以通過創(chuàng)建該類的實(shí)例,并向它發(fā)送消息而啟動(dòng)這段程序代碼,達(dá)到共享代碼的目的。面向?qū)ο蟮幕咎匦?9面向?qū)ο蟮幕咎匦?/p>

——繼承性繼承對(duì)于軟件復(fù)用有著重要意義,是面向?qū)ο蠹夹g(shù)能夠提高軟件開發(fā)效率的重要原因之一。定義:特殊類的對(duì)象擁有其一般類的全部屬性與服務(wù),稱作特殊類對(duì)一般類的繼承。例如:將輪船作為一個(gè)一般類,客輪便是一個(gè)特殊類。201、繼承表達(dá)了對(duì)象之間的相交關(guān)系,即某類對(duì)象可以繼承另一類對(duì)象的特征和能力。具有繼承關(guān)系的類有如下特征:☆類間具有共享特征(包括數(shù)據(jù)和程序代碼共享);☆類間具有細(xì)微的差別或新增部分(包括非共享的程序代碼和數(shù)據(jù));☆類間具有層次結(jié)構(gòu)(包含關(guān)系)。2、繼承的作用:在定義子類時(shí)不必重復(fù)在父類中定義的數(shù)據(jù)和操作,可減少代碼冗余,提高軟件復(fù)用性;增強(qiáng)一致性,減少模塊之間的接口和界面,易于程序維護(hù)。

繼承的含義面向?qū)ο蟮幕咎匦?1

繼承的分類

從繼承源上可劃分為單繼承和多繼承;

單繼承:一個(gè)類只允許有一個(gè)父類時(shí),這種類的繼承為單繼承;多繼承:一個(gè)類同時(shí)允許有2個(gè)以上的父類時(shí),這種類的繼承為多繼承。面向?qū)ο蟮幕咎匦?2

單繼承與多繼承ABCDE單繼承多繼承FEDCBA23

面向?qū)ο笙到y(tǒng)的繼承性能清晰體現(xiàn)相關(guān)類之間的層次結(jié)構(gòu)關(guān)系;能減小代碼和數(shù)據(jù)的冗余度,增加程序重用性;能通過增強(qiáng)一致性來減少模塊間的接口和界面,增加程序的易維護(hù)性;繼承是能自動(dòng)傳播代碼的有力工具;繼承還是在一些比較一般的類的基礎(chǔ)上進(jìn)行構(gòu)造、建立和擴(kuò)充新類的最有效的手段,利于軟件設(shè)計(jì)的逐步細(xì)化,即先進(jìn)行公共特性的設(shè)計(jì),再自頂向下開發(fā)子類,逐步加入新內(nèi)容。24面向?qū)ο蟮幕咎匦?/p>

——多態(tài)性多態(tài)是指在一般類中定義的屬性或行為,被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或行為在一般類及其各個(gè)特殊類中具有不同的語義。例如:數(shù)的加法->實(shí)數(shù)的加法

->復(fù)數(shù)的加法25

多態(tài)性的含義多態(tài)性(Polymorphism)是指同一名字(函數(shù)、運(yùn)算符)在不同的場合具有不同的語義,或者同一界面有多種實(shí)現(xiàn);C++中的多態(tài)性是指不同的對(duì)象收到相同的消息時(shí)產(chǎn)生不同的動(dòng)作或行為;C++支持兩種多態(tài)性:

1、編譯時(shí)的多態(tài)性:通過函數(shù)重載來實(shí)現(xiàn)。

2、運(yùn)行時(shí)的多態(tài)性:通過虛函數(shù)來實(shí)現(xiàn)。面向?qū)ο蟮幕咎匦?6

重載(Overloading)C++允許為已有的函數(shù)和運(yùn)算符重新賦予新的含義,即具有相同名字的函數(shù)和運(yùn)算符在不同的場合可以表現(xiàn)為不同的行為;重載的含義是指通過為函數(shù)和運(yùn)算符創(chuàng)建附加定義而使它們的名字重載,即相同名字的函數(shù)或運(yùn)算符在不同的場合可以表現(xiàn)出不同的功能;函數(shù)重載:同一個(gè)作用域內(nèi)若干個(gè)參數(shù)特征不同的函數(shù)可以使用相同的名字,定義重載函數(shù)時(shí),函數(shù)名相同,函數(shù)參數(shù)類型、個(gè)數(shù)、順序必須不同;運(yùn)算符重載:同一個(gè)運(yùn)算符可以施加在兩個(gè)任意類型的操作數(shù)(例如結(jié)構(gòu)變量或?qū)ο螅┥稀?7

虛函數(shù)虛函數(shù)是指在類等級(jí)的不同層次中說明的名字、參數(shù)特征和返回值類型都相同但實(shí)現(xiàn)算法不同的函數(shù);虛函數(shù)使用戶在一個(gè)類等級(jí)中可以使用相同函數(shù)的多個(gè)版本,每個(gè)版本均屬于類等級(jí)中不同的類,究竟使用的是哪一個(gè)特定的版本需要在運(yùn)行中決定;虛函數(shù)的各個(gè)版本中,其返回值、函數(shù)參數(shù)的個(gè)數(shù)和類型必須一致。28計(jì)算機(jī)程序計(jì)算機(jī)的工作是用程序來控制的程序是指令的集合。指令是計(jì)算機(jī)可以識(shí)別的命令。計(jì)算機(jī)語言的發(fā)展29機(jī)器語言與匯編語言由計(jì)算機(jī)硬件系統(tǒng)可以識(shí)別的二進(jìn)制指令組成的語言稱為機(jī)器語言。計(jì)算機(jī)發(fā)展的初期,軟件工程師們只能用機(jī)器語言來編寫程序。這一階段,在人類的自然語言和計(jì)算機(jī)編程語言之間存在著巨大的鴻溝。匯編語言將機(jī)器指令映射為一些可以被人讀懂的助記符,如ADD、SUB等。此時(shí)編程語言與人類自然語言間的鴻溝略有縮小,但仍與人類的思維相差甚遠(yuǎn)。因?yàn)樗某橄髮哟翁?,程序員需要考慮大量的機(jī)器細(xì)節(jié)。計(jì)算機(jī)語言的發(fā)展30高級(jí)語言高級(jí)語言屏蔽了機(jī)器的細(xì)節(jié),提高了語言的抽象層次,程序中可以采用具有一定涵義的數(shù)據(jù)命名和容易理解的執(zhí)行語句。這使得在書寫程序時(shí)可以聯(lián)系到程序所描述的具體事物。計(jì)算機(jī)語言的發(fā)展31面向?qū)ο蟮恼Z言出發(fā)點(diǎn):更直接地描述客觀世界中存在的事物(對(duì)象)以及它們之間的關(guān)系。特點(diǎn):是高級(jí)語言。將客觀事物看作具有屬性和行為的對(duì)象。通過抽象找出同一類對(duì)象的共同屬性和行為,形成類。通過類的繼承與多態(tài)實(shí)現(xiàn)代碼重用。計(jì)算機(jī)語言的發(fā)展32面向?qū)ο蟮恼Z言優(yōu)點(diǎn):使程序能夠比較直接地反問題域的本來面目,軟件開發(fā)人員能夠利用人類認(rèn)識(shí)事物所采用的一般思維方法來進(jìn)行軟件開發(fā)。計(jì)算機(jī)語言的發(fā)展33

LISP語言:以表處理為特色,是一種人工智能語言。

Simula67語言:引入了幾個(gè)面向?qū)ο蟪绦蛟O(shè)計(jì)語言中的重要概念和特性,即數(shù)據(jù)抽象、類機(jī)構(gòu)和繼承機(jī)制。

SmallTalk語言:源于Simula語言,體現(xiàn)了純粹的面向?qū)ο蟪绦蛟O(shè)計(jì)思想,是真正的面向?qū)ο笳Z言。

C++語言:1980年AT&T設(shè)計(jì)了混合型的面向?qū)ο蟪绦蛟O(shè)計(jì)語言C++,在C的基礎(chǔ)上擴(kuò)展了類、對(duì)象等機(jī)制,并兼容C語言,應(yīng)用最為廣泛。面向?qū)ο蟮恼Z言計(jì)算機(jī)語言的發(fā)展34程序設(shè)計(jì)方法的發(fā)展歷程

——面向過程的程序設(shè)計(jì)方法程序的目的:用于數(shù)學(xué)計(jì)算主要工作:設(shè)計(jì)求解問題的過程缺點(diǎn):對(duì)于龐大、復(fù)雜的程序難以開發(fā)和維護(hù)35程序設(shè)計(jì)方法的發(fā)展歷程

——面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法設(shè)計(jì)思路自頂向下、逐步求精。采用模塊分解與功能抽象,自頂向下、分而治之。程序結(jié)構(gòu):按功能劃分為若干個(gè)基本模塊,形成一個(gè)樹狀結(jié)構(gòu)。各模塊間的關(guān)系盡可能簡單,功能上相對(duì)獨(dú)立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成。其模塊化實(shí)現(xiàn)的具體方法是使用子程序。36程序設(shè)計(jì)方法的發(fā)展歷程

——面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法優(yōu)點(diǎn):有效地將一個(gè)較復(fù)雜的程序系統(tǒng)設(shè)計(jì)任務(wù)分解成許多易于控制和處理的子任務(wù),便于開發(fā)和維護(hù)。面向?qū)ο蟮姆椒?7程序設(shè)計(jì)方法的發(fā)展歷程

——面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法缺點(diǎn):可重用性差、數(shù)據(jù)安全性差、難以開發(fā)大型軟件和圖形界面的應(yīng)用軟件把數(shù)據(jù)和處理數(shù)據(jù)的過程分離為相互獨(dú)立的實(shí)體。當(dāng)數(shù)據(jù)結(jié)構(gòu)改變時(shí),所有相關(guān)的處理過程都要進(jìn)行相應(yīng)的修改。每一種相對(duì)于老問題的新方法都要帶來額外的開銷。圖形用戶界面的應(yīng)用程序,很難用過程來描述和實(shí)現(xiàn),開發(fā)和維護(hù)也都很困難。38程序設(shè)計(jì)方法的發(fā)展歷程

——面向?qū)ο蟮姆椒▽?shù)據(jù)及對(duì)數(shù)據(jù)的操作方法封裝在一起,作為一個(gè)相互依存、不可分離的整體——對(duì)象。對(duì)同類型對(duì)象抽象出其共性,形成類。類通過一個(gè)簡單的外部接口,與外界發(fā)生關(guān)系。對(duì)象與對(duì)象之間通過消息進(jìn)行通訊。39程序設(shè)計(jì)方法的發(fā)展歷程

——面向?qū)ο蟮姆椒▋?yōu)點(diǎn):程序模塊間的關(guān)系更為簡單,程序模塊的獨(dú)立性、數(shù)據(jù)的安全性就有了良好的保障。通過繼承與多態(tài)性,可以大大提高程序的可重用性,使得軟件的開發(fā)和維護(hù)都更為方便。40面向?qū)ο蟮能浖こ堂嫦驅(qū)ο蟮能浖こ淌敲嫦驅(qū)ο蠓椒ㄔ谲浖こ填I(lǐng)域的全面應(yīng)用。它包括:面向?qū)ο蟮姆治觯∣OA)面向?qū)ο蟮脑O(shè)計(jì)(OOD)面向?qū)ο蟮木幊蹋∣OP)面向?qū)ο蟮臏y試(OOT)面向?qū)ο蟮能浖S護(hù)(OOSM)面向?qū)ο蟮能浖_發(fā)41系統(tǒng)分析系統(tǒng)分析階段應(yīng)該扼要精確地抽象出系統(tǒng)必須做什么,但是不關(guān)心如何去實(shí)現(xiàn)。面向?qū)ο蟮南到y(tǒng)分析,直接用問題域中客觀存在的事物建立模型中的對(duì)象,對(duì)單個(gè)事物及事物之間的關(guān)系,都保留他們的原貌,不做轉(zhuǎn)換,也不打破原有界限而重新組合,因此能夠很好地映射客觀事物。面向?qū)ο蟮能浖_發(fā)42設(shè)計(jì)針對(duì)系統(tǒng)的一個(gè)具體實(shí)現(xiàn)運(yùn)用面向?qū)ο蟮姆椒?。其中包括兩方面的工作:把OOA模型直接搬到OOD,作為OOD的一部分針對(duì)具體實(shí)現(xiàn)中的人機(jī)界面、數(shù)據(jù)存儲(chǔ)、任務(wù)管理等因素補(bǔ)充一些與實(shí)現(xiàn)有關(guān)的部分。面向?qū)ο蟮能浖_發(fā)43編程OOP工作就是用一種面向?qū)ο蟮木幊陶Z言把OOD模型中的每個(gè)成份書寫出來,是面向?qū)ο蟮能浖_發(fā)最終落實(shí)的重要階段。面向?qū)ο蟮能浖_發(fā)44測試測試的任務(wù)是發(fā)現(xiàn)軟件中的錯(cuò)誤。在面向?qū)ο蟮能浖y試中繼續(xù)運(yùn)用面向?qū)ο蟮母拍钆c原則來組織測試,以對(duì)象的類作為基本測試單位,可以更準(zhǔn)確的發(fā)現(xiàn)程序錯(cuò)誤并提高測試效率。面向?qū)ο蟮能浖_發(fā)45維護(hù)將軟件交付使用后,工作并沒有完結(jié),還要根據(jù)軟件的運(yùn)行情況和用戶的需求,不斷改進(jìn)系統(tǒng)。使用面向?qū)ο蟮姆椒ㄩ_發(fā)的軟件,其程序與問題域是一致的,因此,在維護(hù)階段運(yùn)用面向?qū)ο蟮姆椒梢源蟠筇岣哕浖S護(hù)的效率。面向?qū)ο蟮能浖_發(fā)46C++語言的產(chǎn)生C++是從C語言發(fā)展演變而來的,首先是一個(gè)更好的C引入了類的機(jī)制,最初的C++被稱為“帶類的C”1983年正式取名為C++從1989年開始C++語言的標(biāo)準(zhǔn)化工作于1994年制定了ANSIC++標(biāo)準(zhǔn)草案于1998年11月被國際標(biāo)準(zhǔn)化組織(ISO)批準(zhǔn)為國際標(biāo)準(zhǔn),成為目前的C++C++的初步知識(shí)47C++的特點(diǎn)全面兼容C它保持了C的簡潔、高效和接近匯編語言等特點(diǎn)對(duì)C的類型系統(tǒng)進(jìn)行了改革和擴(kuò)充C++也支持面向過程的程序設(shè)計(jì),不是一個(gè)純正的面向?qū)ο蟮恼Z言支持面向?qū)ο蟮姆椒–++的初步知識(shí)48從C到C++最簡單的C++程序C++程序的構(gòu)成和書寫格式C++程序的編寫和實(shí)現(xiàn)C++(Cplusplus)是C語言的超集,完全兼容C語言,但在概念上不同于C,應(yīng)按C++自己的方式來使用它,掌握C++的思維方式、程序設(shè)計(jì)方法和編程習(xí)慣。那么,C++對(duì)C做了哪些修改和增強(qiáng)?C++的初步知識(shí)49函數(shù)原形說明變量的說明輸入輸出const說明符void類型從C到C++C++的初步知識(shí)50

函數(shù)原形說明C++要求為函數(shù)提供完全的原型,包括所有參數(shù)的類型和返回值類型,目的在于:編譯系統(tǒng)可以對(duì)函數(shù)的定義和使用之間的一致性進(jìn)行嚴(yán)格的檢查,保證函數(shù)使用的正確性;在函數(shù)定義和聲明時(shí),必須提供全部信息:

voiddisplay(int,char*,float);intmixture(int,float,char*);C++的初步知識(shí)51

變量的說明在C中,變量的定義必須出現(xiàn)在函數(shù)或復(fù)合語句的最前面,在正常執(zhí)行語句后面不能再定義變量。intm,n,k;m=10;n=9;k=m*n;….在C++中,變量的定義可以出現(xiàn)在任何位置。intm,n,k;m=10;n=9;k=m*n;….intx,y;y=k+m;…C++的初步知識(shí)52

輸入和輸出C++中除了保留C標(biāo)準(zhǔn)庫中的各種輸入和輸出函數(shù)外,還提供了一套新的輸入和輸出函數(shù)—流式輸入輸出。使用時(shí)包含頭文件“iostream.h”。例:

#include<iostream.h>intx,y;floatz;cin>>x>>y>>z;//從標(biāo)準(zhǔn)終端輸入數(shù)據(jù)

char*str=“Hello,howareyou!”;cout<<“Pleaseoutputtheinfoofthestring:”<<str<<“\n”;//向屏幕輸出字符串53

const說明符定義常量時(shí),C語言用#define,而C++用const說明符,const在C++中的作用:1.代替#define宏定義常量例:#defineMAX100

可替代為:

constintMAX=100;或intconstMAX=100;2.定義常量數(shù)組

constfloatdata[]={1.2,2.5,3.6,4.8,5.5};C++的初步知識(shí)54

const說明符3.

const說明符與函數(shù)參數(shù)相連接。例:voidprint_value(constintvalue){cout<<value;}

試圖在該函數(shù)體中改變const參量value的是非法的。C++的初步知識(shí)55

const說明符4.定義指針常量,根據(jù)const位置的不同含義也不同,有三種方式:(1)指向常量的指針:說明一個(gè)指針變量指向的數(shù)據(jù)是常量。(name是指向字符串常量的指針,name指向的字符串不能更改,但name可以更新)

const

char*name=“Richard”;name=“Martin”;對(duì)

name[0]=‘C’;錯(cuò)C++的初步知識(shí)56

const說明符(2)常指針:把指針本身聲明為一個(gè)常量,而不是將它指向的對(duì)象聲明為常量。(name不能更改,name指向的內(nèi)容可更新)

char*constname=“Richard”;name=“Martin”;錯(cuò)

name[0]=‘C’;對(duì)(3)指向常量的常指針:

這個(gè)指針本身不能改變,它指向的值也不能改變。(name不能更改,name指向的內(nèi)容也不能更新)

constchar*constname=“Richard”;name=“Martin”;錯(cuò)

name[0]=‘C’;錯(cuò)57

void類型void是指沒有數(shù)值的數(shù)據(jù)類型,沒有任何返回值的函數(shù)應(yīng)說明為void類型。例如:voidfun(int*);void也可表示一個(gè)函數(shù)不需要任何入口參數(shù)。例如:intgraph(void);將C程序轉(zhuǎn)換成與C++兼容的最常見的工作就是將沒有返回值的函數(shù)說明為void類型。C++嚴(yán)格檢查所有的函數(shù)原型是否包括:返回值類型、函數(shù)名和各個(gè)參數(shù)的類型。C++的初步知識(shí)58例1.4.1輸出一行字符:“ThisisaC++program.”程序如下:#include<iostream>//用cout輸出時(shí)需要用此頭文件usingnamespacestd;//使用命名空間std

intmain(){

cout<<“ThisisaC++program.\n”;//用C++的

//方法輸出一行信息

return0;}程序運(yùn)行時(shí)輸出:ThisisaC++program.最簡單的C++程序#include<iostream.h>59命名空間(Namespace)一個(gè)命名空間將不同的標(biāo)識(shí)符集合在一個(gè)命名作用域(namedscope)內(nèi)為了解決命名沖突例如,聲明一個(gè)命名空間NS:namspaceNS{classFile;voidFun();}

則引用標(biāo)識(shí)符的方式如下,NS::Fileobj;NS::Fun();沒有聲明命名空間的標(biāo)識(shí)符都處于無名的命名空間中60命名空間(Namespace)可以用using來指定命名空間例如,經(jīng)過以下聲明:

usingNS::File;

在當(dāng)前作用域中就可以直接引用Fileusingnamespacestd;

命名空間std中所有標(biāo)識(shí)符都可直接引用在新的C++標(biāo)準(zhǔn)程序庫中,所有標(biāo)識(shí)符都聲明在命名空間std中,頭文件都不使用擴(kuò)展名61最簡單的C++程序例1.4.2求a、b兩個(gè)數(shù)之和。//求兩個(gè)數(shù)之和(本行是注釋)#include<iostream>//用cout輸出時(shí)需要用此頭文件usingnamespacestd;//使用命名空間std

intmain()//主函數(shù)首部{inta,b,sum;//定義變量

cin>>a>>b;//輸入語句

sum=a+b;

cout<<“a+b=”<<sum<<endl;//輸出語句

return0;}注:1825(輸入18和25給a、b),a、b之間一個(gè)空格62C++程序的書寫格式一個(gè)C++程序可以由一個(gè)程序單位或多個(gè)程序單位構(gòu)成。每一個(gè)程序單位作為一個(gè)文件,每個(gè)文件由若干個(gè)函數(shù)組成。由函數(shù)構(gòu)成的C++程序中,必須只有一個(gè)主函數(shù)main(),它是程序執(zhí)行的入口。需要指出兩點(diǎn):1、C++函數(shù)(包括main)的定義和聲明,必須提供函數(shù)的全部信息:返回值、函數(shù)參數(shù)類型和個(gè)數(shù)。無返回值或無參的情況用void;2、注釋形式:在一行語句內(nèi),“//”后面的字符被視為注釋在多行語句內(nèi),“/*”和“*/”中間的所有字符被視為注釋。63C++程序的編寫和實(shí)現(xiàn)用C++語言編寫源程序*.cpp;對(duì)源程序進(jìn)行編譯,形成*.obj文件。如果編譯出錯(cuò),再修改源程序,直到編譯正確;將目標(biāo)文件與C++編譯器提供的庫文件進(jìn)行連接,形成可執(zhí)行的二進(jìn)制文件*.exe;運(yùn)行程序;分析運(yùn)行結(jié)果。642.1類的聲明和對(duì)象定義C++類及其對(duì)象的封裝性類是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。利用類可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。652.1類的聲明和對(duì)象定義C++類及其對(duì)象的封裝性類是對(duì)象共性特征的抽象,對(duì)象的類型稱為類,類是對(duì)象的模板,對(duì)象是類的具體實(shí)例;先聲明一個(gè)類,再定義對(duì)象,類是抽象的,不占用內(nèi)存,對(duì)象是具體的,占用實(shí)際的存儲(chǔ)空間;可以看作是一種特殊的構(gòu)造數(shù)據(jù)類型,是結(jié)構(gòu)體的擴(kuò)充形式;類是數(shù)據(jù)和對(duì)這些數(shù)據(jù)進(jìn)行操作的函數(shù)的封裝體,是包括數(shù)據(jù)和函數(shù)的數(shù)據(jù)類型;類的定義包括數(shù)據(jù)和函數(shù)的定義,類中的數(shù)據(jù)和函數(shù)都是類的成員;在C++中,類用class來構(gòu)造。66類的聲明

//聲明結(jié)構(gòu)體類型struct

Student{intnum;

charname[20];

charsex;

};//定義2個(gè)結(jié)構(gòu)變量Studentstud1,stud2;class

Student//聲明類,以class開頭

{intnum;

charname[20];

charsex;//以上3行是數(shù)據(jù)成員

voiddisplay()//成員函數(shù)

{cout<<“num:”<<num<<endl;

cout<<“name:”<<name<<endl;

cout<<“sex:”<<sex<<endl;}};

//定義Student類的對(duì)象stud1,stud2Student

stud1,stud2;672.1類的聲明和對(duì)象定義上述類定義中未限定成員的訪問屬性,對(duì)象stud1的數(shù)據(jù)和函數(shù)都是private的,數(shù)據(jù)安全了。但外界不能調(diào)用stud1中的函數(shù)和功能,因?yàn)闆]有提供類的對(duì)外的接口,類有何用?不能把類中的全部成員與外界隔離,一般將類中的數(shù)據(jù)隱藏起來,聲明為私有的(private),把成員函數(shù)作為對(duì)外界的接口,聲明為公有的(public)。例如,上述類聲明改為:classStudent//聲明類類型{private://聲明以下部分為私有

intnum;

charname[20];

charsex;

public://聲明以下部分為公有

voiddisplay(){cout<<“num:”<<num<<endl;

cout<<“name:”<<name<<endl;

cout<<“sex:”<<sex<<endl;}};Student

stud1,stud2;68在C++中,定義類的一般格式為:class

類名{

private:

//私有類型只限于通過自己的成員函數(shù)

//來訪問,即只有類本身能夠訪問它數(shù)據(jù)成員和成員函數(shù)說明

public:

//公有類型提供了類的外部接口,允許類

//的使用者來訪問它數(shù)據(jù)成員和成員函數(shù)說明

protected:

//保護(hù)類型只允許本類成員函數(shù)或派生

//類成員函數(shù)訪問,用于類的繼承和派生數(shù)據(jù)成員和成員函數(shù)};69公有類型成員在關(guān)鍵字public后面聲明,它們是類與外部的接口,任何外部函數(shù)都可以訪問公有類型數(shù)據(jù)和函數(shù)。類的聲明和對(duì)象的定義70私有類型成員在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。類的聲明和對(duì)象的定義71保護(hù)類型與private類似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類的影響不同。類的聲明和對(duì)象的定義72在類的定義中應(yīng)注意以下幾點(diǎn):1、“類名”是一個(gè)合法的標(biāo)識(shí)符;2、關(guān)鍵字private,public和protected說明類成員的三種訪問權(quán)限;3、{}以內(nèi)的部分是“類內(nèi)”,{}以外的部分為“類外”;4、類定義的聲明部分在“類內(nèi)”,類的成員函數(shù)既可以在“類內(nèi)”定義,也可以在“類外”定義;5、在“類內(nèi)”不允許對(duì)所聲明的數(shù)據(jù)成員進(jìn)行初始化,類的數(shù)據(jù)成員的類型可以任意。73classCArea//聲明一個(gè)類{private://私有部分

intx,y,area;public://公有部分

voidsquarea(intvx,intvy);};例題2.1.174類的成員classClock{public:

voidSetTime(intNewH,intNewM,

intNewS);

voidShowTime();private:intHour,Minute,Second;};成員數(shù)據(jù)成員函數(shù)類的聲明和對(duì)象的定義75voidClock::SetTime(intNewH,intNewM,

intNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}類的聲明和對(duì)象的定義76數(shù)據(jù)成員與一般的變量聲明相同,但需要將它放在類的聲明體中。類的聲明和對(duì)象的定義77成員函數(shù)在類中說明原形,可以在類外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)置成員函數(shù)。允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)類的聲明和對(duì)象的定義78類和結(jié)構(gòu)體的異同1、均為構(gòu)造類型;2、結(jié)構(gòu)體用struct、類用class作為標(biāo)識(shí);2、結(jié)構(gòu)體中的成員只有數(shù)據(jù)成員,且訪問權(quán)限默認(rèn)為public的;3、類的成員包括數(shù)據(jù)和函數(shù),且訪問權(quán)限可以設(shè)置為private、public和protected的;4、結(jié)構(gòu)沒有實(shí)現(xiàn)數(shù)據(jù)封裝,數(shù)據(jù)可以被任何外部函數(shù)訪問。類實(shí)現(xiàn)了數(shù)據(jù)封裝,可以將數(shù)據(jù)限定為只能被本身的成員函數(shù)訪問。類的聲明和對(duì)象的定義79定義對(duì)象的方法1、先聲明類類型,然后再定義對(duì)象:如Student

stud1,stud2;在聲明類類型之后,定義對(duì)象有2種方法:class類名對(duì)象名;如classStudentstud1,stud2;類名對(duì)象名;如Student

stud1,stud2;類的聲明和對(duì)象的定義80定義對(duì)象的方法2、在聲明類類型的同時(shí)定義對(duì)象:classStudent

//聲明類類型{public://先聲明公用部分

voiddisplay()

{cout<<“num:”<<num<<endl;

cout<<“name:”<<name<<endl;

cout<<“sex:”<<sex<<endl;}

private://后聲明私有部分

intnum;

charname[20];

charsex;}stud1,stud2;//定義Student類的對(duì)象stud1,stud2類的聲明和對(duì)象的定義81定義對(duì)象的方法3、不出現(xiàn)類名,直接定義對(duì)象:class

//聲明類類型{public://聲明公用部分

……

private://聲明私有部分

……

protected://聲明保護(hù)部分

……}stud1,stud2;//定義對(duì)象stud1,stud2

定義多個(gè)對(duì)象時(shí),對(duì)象名之間用逗號(hào)隔開;對(duì)象名可以是一般的對(duì)象、指向?qū)ο蟮闹羔樆蛞妹?,也可以是?duì)象數(shù)組。

類的聲明和對(duì)象的定義82例2.1.2定義一個(gè)日期類CDate,再創(chuàng)建一個(gè)生日對(duì)象。classCDate{intyear;

intmonth;

intday;public:

voidSetDate(int,int,int);

voidShowDate();}myBirthday;//同時(shí)創(chuàng)建對(duì)象myBirthday或者定義類之后:CDate

myBirthday,*p,q[5];類的聲明和對(duì)象的定義83

2.2

類的成員函數(shù)C++類及其對(duì)象的封裝性類的成員函數(shù)具有一般函數(shù)的性質(zhì),它同時(shí)屬于某個(gè)類的成員,出現(xiàn)在類定義體中,可被限定為具有private、public和protected三種訪問屬性;成員函數(shù)可以訪問本類中的任何成員(包括private和public特性),可以引用在本作用域中有效的數(shù)據(jù);private屬性的成員函數(shù)只能被本類其它的成員函數(shù)調(diào)用,不能被外界調(diào)用;public屬性的成員函數(shù)可以被外界調(diào)用,它是類的對(duì)外接口。84在類外定義成員函數(shù)類的成員函數(shù)類的成員函數(shù)可以在“類內(nèi)”聲明,在“類外”定義;類外定義成員函數(shù)的一般形式如下:

返回值類型

類名::成員函數(shù)名(參數(shù)表){…

…//函數(shù)體

}

其中::是作用域運(yùn)算符。85例2.2.1classStudent

{public:

voiddisplay();//公用成員函數(shù)原型聲明

private:

intnum;

stringname;

charsex;//以上3行是私有數(shù)據(jù)成員};voidStudent

::display()//在類外定義成員函數(shù){cout<<“num:”<<num<<endl;

cout<<“name:”<<name<<endl;

cout<<“sex:”<<sex<<endl;}Student

stud1,stud2;//定義2個(gè)類對(duì)象類的成員函數(shù)86內(nèi)置(inline)成員函數(shù)有些簡單的成員函數(shù)可以直接在類定義中定義,在類定義體中定義的成員函數(shù)稱為內(nèi)置函數(shù)(內(nèi)聯(lián)函數(shù));內(nèi)置函數(shù)可以減少函數(shù)調(diào)用時(shí)的內(nèi)存開銷,不用記錄函數(shù)調(diào)用返回地址,只將代碼嵌入到函數(shù)調(diào)用點(diǎn)。內(nèi)置函數(shù)的定義有兩種方法:1、隱式定義將成員函數(shù)的定義體放在“類內(nèi)”中。2、顯式定義在“類內(nèi)”聲明,在“類外”定義時(shí)在函數(shù)名前加關(guān)鍵字inline。類的成員函數(shù)87內(nèi)置成員函數(shù)舉例(一)classPoint{public:voidInit(intinitX,intinitY)

{X=initX;Y=initY;}intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};類的成員函數(shù)88內(nèi)置成員函數(shù)舉例(二)classPoint{public:voidInit(intinitX,intinitY);intGetX();

intGetY();

private:intX,Y;};類的成員函數(shù)inlinevoidPoint::

Init(intinitX,intinitY){X=initX;Y=initY;}inlineintPoint::GetX(){returnX;}inlineintPoint::GetY(){returnY;}90成員函數(shù)的存儲(chǔ)方式定義類對(duì)象時(shí),系統(tǒng)會(huì)為每個(gè)對(duì)象分配存儲(chǔ)空間,包括為類對(duì)象的數(shù)據(jù)和函數(shù)代碼分配空間;如果定義同類的10個(gè)對(duì)象,那么如何為這10個(gè)對(duì)象分配不同的空間?10個(gè)同類對(duì)象占用存儲(chǔ)單元的情況類的成員函數(shù)91成員函數(shù)的存儲(chǔ)方式為了節(jié)約內(nèi)存,只用一段存儲(chǔ)空間來存放10個(gè)對(duì)象擁有的共同的函數(shù)代碼段,如下圖:

10個(gè)同類對(duì)象成員函數(shù)的存儲(chǔ)方式C++規(guī)定:對(duì)象占用的存儲(chǔ)空間只是對(duì)象數(shù)據(jù)成員占用的存儲(chǔ)空間,可用sizeof函數(shù)驗(yàn)證;共同的成員函數(shù)代碼存儲(chǔ)在對(duì)象空間之外。類的成員函數(shù)92成員函數(shù)的存儲(chǔ)方式調(diào)用不同對(duì)象的成員函數(shù)時(shí)都是執(zhí)行同一段函數(shù)代碼,但其執(zhí)行結(jié)果一般不同(常與數(shù)據(jù)有關(guān));不同對(duì)象使用同一段函數(shù)代碼,它們?nèi)绾螌?duì)不同對(duì)象中的數(shù)據(jù)進(jìn)行操作呢?C++專門為此設(shè)計(jì)了一個(gè)this指針,用來指向不同的對(duì)象;調(diào)用哪個(gè)對(duì)象,this就指向哪個(gè)對(duì)象,就訪問它的成員。類的成員函數(shù)93類中成員的訪問方式類中成員互訪直接使用成員名類外訪問使用“對(duì)象名.成員名”方式訪問

public

屬性的成員類的成員函數(shù)94例:類的應(yīng)用舉例#include<iostream>usingnamespacestd;classClock{//類的聲明略}//類的實(shí)現(xiàn)略voidmain(void){ClockmyClock;

myClock.SetTime(8,30,30);

myClock.ShowTime();}類的成員函數(shù)95對(duì)象成員的引用訪問對(duì)象中的成員有3種方法:1、通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員,即:

對(duì)象名.數(shù)據(jù)成員名

or對(duì)象名.成員函數(shù)名(參數(shù)表)例如:stud1.num=1001;

stud1.display();

//設(shè)num和display函數(shù)為public成員

類的成員函數(shù)96對(duì)象成員的引用定義一個(gè)日期類,使其具有輸出當(dāng)前日期的功能。見p-27例2.3.1:引用對(duì)象的成員2、通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員,即:對(duì)象指針->數(shù)據(jù)成員名

or對(duì)象指針->成員函數(shù)名(參數(shù)表)

例如:Timet,*p=&t;cout<<p->hour;//hour是t中的成員3、通過對(duì)象的引用變量訪問對(duì)象中的成員。類的成員函數(shù)97類的封裝性類將一組數(shù)據(jù)和操作這些數(shù)據(jù)的算法封裝在自定義的抽象數(shù)據(jù)類型中。一般將類的所有數(shù)據(jù)聲明為private(與外界隔離),將成員函數(shù)聲明為public(外界可以調(diào)用),外界通過調(diào)用公用成員函數(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)的操作;公用成員函數(shù)是用戶使用類的公用接口(publicinterface),用戶只需知道如何調(diào)用公用成員函數(shù),不需了解函數(shù)的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),此即接口與實(shí)現(xiàn)分離;通過成員函數(shù)對(duì)數(shù)據(jù)成員進(jìn)行操作稱為類的實(shí)現(xiàn)。為了防止用戶隨意修改公用成員函數(shù),一般不向用戶公開公用成員函數(shù)的源代碼,用戶只能接觸到其目標(biāo)代碼;類中被操作的數(shù)據(jù)是私有的,實(shí)現(xiàn)的細(xì)節(jié)對(duì)用戶隱蔽,此即私有實(shí)現(xiàn)(privateimplementation)?!邦惖墓媒涌谂c私有實(shí)現(xiàn)的分離”形成了信息隱蔽。

類的封裝和信息隱藏98封裝性的好處軟件工程的一個(gè)最基本的原則就是將接口與實(shí)現(xiàn)分離,信息隱蔽是軟件工程的重要概念,其好處在于:(1)如果想修改或擴(kuò)充類的功能,只需修改本類中有關(guān)的數(shù)據(jù)成員和與它有關(guān)的成員函數(shù),程序中類外的部分可以不必修改。(2)如果在編譯時(shí)發(fā)現(xiàn)類中的數(shù)據(jù)讀寫有錯(cuò),不必檢查整個(gè)程序,只需檢查本類中訪問這些數(shù)據(jù)的少數(shù)成員函數(shù)。這樣,就極大方便了程序(特別是大程序)的設(shè)計(jì)、修改和調(diào)試。類的封裝和信息隱藏99類聲明和成員函數(shù)定義的分離類被一個(gè)程序使用,將類的聲明和成員函數(shù)的定義寫在文件開頭;類被多個(gè)程序使用,需要重復(fù)將其寫在多個(gè)文件開頭;將類的聲明(包含成員函數(shù)的聲明)放在指定的頭文件中,用戶使用類時(shí),只要包含相應(yīng)的頭文件,即可定義該類的對(duì)象、調(diào)用對(duì)象的公用成員函數(shù);為了實(shí)現(xiàn)信息隱蔽,將類的成員函數(shù)定義放在另一個(gè)文件中。這時(shí),一個(gè)程序有兩個(gè)模塊:類的成員函數(shù)定義文件student.cpp和主模塊main.cpp,它們都包含類聲明頭文件student.h;將student.cpp編譯成目標(biāo)文件student.obj,形成用戶類庫,與main.obj和系統(tǒng)資源庫鏈接而成main.exe。類的封裝和信息隱藏100類聲明和成員函數(shù)定義的分離//student.hclassStudent{public:

voiddisplay();

private:

intnum;

charname[20];

charsex;};類的封裝和信息隱藏101類聲明和成員函數(shù)定義的分離//student.cpp#include<iostream.h>#include“student.h”voidStudent::display()

{cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;}//main.cpp#include<iostream.h>#include“student.h”intmain(){Student

stud;

stud.Display();

return0;}類的封裝和信息隱藏102類聲明和成員函數(shù)定義的分離圖2.4.1包含多個(gè)源文件程序的編譯和連接過程類的封裝和信息隱藏103類聲明和成員函數(shù)定義的分離使用類庫將減少用戶對(duì)類和成員函數(shù)定義的工作量;類庫包括兩個(gè)部分:(1)類聲明頭文件;(2)已經(jīng)編譯過的成員函數(shù)定義文件-目標(biāo)文件;用戶只需將類庫裝入到自己的計(jì)算機(jī)系統(tǒng)(裝在C++編譯系統(tǒng)所在的子目錄),并在程序中用#include命令將有關(guān)類聲明的頭文件包含到程序中,即可使用這些類和其中的成員函數(shù)了;接口與實(shí)現(xiàn)的分離,為軟件開發(fā)商給用戶提供類庫創(chuàng)造了條件,而類實(shí)現(xiàn)的程序代碼得到了保護(hù)。類的封裝和信息隱藏104構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說將對(duì)象初始化為一個(gè)特定的狀態(tài)。在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)默認(rèn)形式的構(gòu)造函數(shù)允許為內(nèi)置函數(shù)、重載函數(shù)、帶默認(rèn)形參值的函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)105構(gòu)造函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的名字必須與類名相同;構(gòu)造函數(shù)一般聲明為public,無返回值,無需定義返回類型;構(gòu)造函數(shù)是系統(tǒng)自動(dòng)調(diào)用的,且執(zhí)行一次;構(gòu)造函數(shù)不能被繼承,但允許重載(overloading);構(gòu)造函數(shù)的功能是對(duì)對(duì)象進(jìn)行初始化,一般構(gòu)造函數(shù)用于對(duì)象的初始化,每當(dāng)對(duì)象被聲明時(shí)對(duì)數(shù)據(jù)成員做初始化,不做賦值外的事情。106構(gòu)造函數(shù)的幾種形式構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)可為內(nèi)聯(lián)函數(shù),可以為無參數(shù)或帶參數(shù),還可以缺省參數(shù),例如:無參的構(gòu)造函數(shù)參數(shù)化的構(gòu)造函數(shù)缺省參數(shù)的構(gòu)造函數(shù)多構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)107classCArea{public:CArea(){x=0;y=0;}//無參數(shù)的構(gòu)造函數(shù)

CArea(intrx,intry=0);//帶缺省參數(shù)的構(gòu)造函數(shù)

CArea(floatrr){rr=0;}//帶一個(gè)參數(shù)的構(gòu)造函數(shù)

CArea(floatrr,char*ra);//帶兩個(gè)參數(shù)的構(gòu)造函數(shù)

};例2.5.1在類中定義構(gòu)造函數(shù),見p33在類中聲明的多種構(gòu)造函數(shù):例108構(gòu)造函數(shù)舉例classClock{public:

Clock(intNewH,intNewM,intNewS);//構(gòu)造函數(shù)

voidSetTime(intNewH,intNewM,intNewS); voidShowTime();private: intHour,Minute,Second;};構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的實(shí)現(xiàn):Clock::Clock(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:voidmain(){

Clockc(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。

c.ShowTime();}31110

構(gòu)造函數(shù)的使用何時(shí)調(diào)用構(gòu)造函數(shù)?在類對(duì)象進(jìn)入其作用域時(shí)調(diào)用構(gòu)造函數(shù);構(gòu)造函數(shù)沒有返回值,不要在定義構(gòu)造函數(shù)時(shí)聲明類型;構(gòu)造函數(shù)不需要用戶調(diào)用,也不能被用戶調(diào)用;在構(gòu)造函數(shù)體中,不僅可以對(duì)數(shù)據(jù)成員賦初值,還可以包含其他語句如cout;如果用戶沒有定義構(gòu)造函數(shù),C++系統(tǒng)會(huì)自動(dòng)生成一個(gè)構(gòu)造函數(shù),其函數(shù)體為空,不執(zhí)行初始化操作;要想初始化一個(gè)對(duì)象,需要重新定義構(gòu)造函數(shù),否則對(duì)象的狀態(tài)將是隨機(jī)的。構(gòu)造函數(shù)和析構(gòu)函數(shù)111帶參數(shù)的構(gòu)造函數(shù)定義對(duì)象時(shí),通過不同參數(shù)值的傳遞實(shí)現(xiàn)不同對(duì)象的不同初始化,可以使用帶參數(shù)的構(gòu)造函數(shù);一般格式:構(gòu)造函數(shù)名(類型1形參1,類型2形參2,……)用戶不能顯式地調(diào)用構(gòu)造函數(shù),也無法采用常規(guī)的調(diào)用函數(shù)的方法給出實(shí)參(如fun(a,b))。實(shí)參只能在定義對(duì)象時(shí)給出,定義對(duì)象的一般格式:類名對(duì)象名(實(shí)參1,實(shí)參2,……);例2.5.2:有兩個(gè)長方體,長、寬、高分別為:(1)12,25,30;(2)15,30,21。用帶參數(shù)的構(gòu)造函數(shù)編寫程序求其體積。構(gòu)造函數(shù)和析構(gòu)函數(shù)112使用參數(shù)初始化表

在定義對(duì)象時(shí),可使用參數(shù)初始化表來實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的初始化,在函數(shù)首部實(shí)現(xiàn):Box::Box(inth,intw,intlen):height(h),width(w),length(len){}

其含義是:用形參h的值初始化數(shù)據(jù)成員height,用形參w的值初始化數(shù)據(jù)成員width,用形參len的值初始化數(shù)據(jù)成員length。構(gòu)造函數(shù)和析構(gòu)函數(shù)113構(gòu)造函數(shù)的重載

一個(gè)類可以定義多個(gè)構(gòu)造函數(shù),使用戶選用不同的方式完成對(duì)象數(shù)據(jù)的初始化;重載的所有構(gòu)造函數(shù)同名,但其參數(shù)類型、參數(shù)個(gè)數(shù)必須有所區(qū)別。構(gòu)造函數(shù)和析構(gòu)函數(shù)114例2.5.3

在例2.5.2的基礎(chǔ)上定義兩個(gè)構(gòu)造函數(shù),其中一個(gè)無參數(shù),一個(gè)有參數(shù),見p37

重載構(gòu)造函數(shù)的例子例,可以在類中聲明的多種構(gòu)造函數(shù):classCArea{public:CArea(){x=0;y=0;}//無參數(shù)的構(gòu)造函數(shù)

CArea(intrx,intry=0);//帶缺省參數(shù)的構(gòu)造函數(shù)

CArea(floatrr){rr=0;}//帶一個(gè)參數(shù)的構(gòu)造函數(shù)

CArea(floatrr,char*ra);//帶兩個(gè)參數(shù)的構(gòu)造函數(shù)

};115

缺省構(gòu)造函數(shù)在調(diào)用構(gòu)造函數(shù)時(shí)不必給出實(shí)參的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù)(DefaultConstructor)或缺省構(gòu)造函數(shù);無參數(shù)的構(gòu)造函數(shù)屬于缺省構(gòu)造函數(shù);如果在定義對(duì)象時(shí)選用無參構(gòu)造函數(shù),應(yīng)按以下形式定義對(duì)象:

Boxbox1;//調(diào)用無參構(gòu)造函數(shù)建立對(duì)象在一個(gè)類中可以包含多個(gè)構(gòu)造函數(shù),但是在創(chuàng)建每個(gè)對(duì)象時(shí),只執(zhí)行其中一個(gè)匹配版本的構(gòu)造函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)116默認(rèn)形參值的作用函數(shù)在聲明時(shí)可以預(yù)先給出默認(rèn)的形參值,調(diào)用時(shí)如給出實(shí)參,則采用實(shí)參值,否則采用預(yù)先給出的默認(rèn)形參值。例如:intadd(intx=5,inty=6){returnx+y;}voidmain(void){add(10,20);//10+20add(10);//10+6add();//5+6}117默認(rèn)形參值的說明次序默認(rèn)形參值必須從右向左順序聲明,并且在默認(rèn)形參值的右面不能有非默認(rèn)形參值的參數(shù)。因?yàn)檎{(diào)用時(shí)實(shí)參取代形參是從左向右的順序。例:intadd(intx,inty=5,intz=6);//正確intadd(intx=1,inty=5,intz);//錯(cuò)誤intadd(intx=1,inty,intz=6);//錯(cuò)誤118默認(rèn)形參值與函數(shù)的調(diào)用位置調(diào)用出現(xiàn)在函數(shù)體實(shí)現(xiàn)之前時(shí),默認(rèn)形參值必須在函數(shù)原形中給出;而當(dāng)調(diào)用出現(xiàn)在函數(shù)體實(shí)現(xiàn)之后時(shí),默認(rèn)形參值需在函數(shù)實(shí)現(xiàn)時(shí)給出。例:intadd(intx=5,inty=6);voidmain(void){add();

//調(diào)用在實(shí)現(xiàn)前}intadd(intx,inty){returnx+y;}intadd(intx=5,inty=6){returnx+y;}voidmain(void){add();

//調(diào)用在實(shí)現(xiàn)后}119默認(rèn)形參值的作用域在相同的作用域內(nèi),默認(rèn)形參值的說明應(yīng)保持唯一,但如果在不同的作用域內(nèi),允許說明不同的默認(rèn)形參。例:intadd(intx=1,inty=2);voidmain(void){intadd(intx=3,inty=4);add();//使用局部默認(rèn)形參值(實(shí)現(xiàn)3+4)}voidfun(void){...

add();//使用全局默認(rèn)形參值(實(shí)現(xiàn)1+2)}120

使用默認(rèn)參數(shù)的構(gòu)造函數(shù)使用默認(rèn)參數(shù)的構(gòu)造函數(shù),即構(gòu)造函數(shù)的參數(shù)表中沒有參數(shù);如果創(chuàng)建對(duì)象時(shí)不需要通過傳遞參數(shù)來初始化對(duì)象,可以使用它。例2.5.4:將例2.5.3的構(gòu)造函數(shù)改為含默認(rèn)值參數(shù)值,長、寬、高的默認(rèn)值均為10。構(gòu)造函數(shù)和析構(gòu)函數(shù)121

使用默認(rèn)參數(shù)的構(gòu)造函數(shù)注意:在構(gòu)造函數(shù)中使用默認(rèn)參數(shù)提供了建立對(duì)象的多種初始化方法,相當(dāng)于多個(gè)重載的構(gòu)造函數(shù);應(yīng)該在聲明構(gòu)造函數(shù)時(shí)指定參數(shù)的默認(rèn)值,而不能只在定義構(gòu)造函數(shù)時(shí)指定默認(rèn)值;如果構(gòu)造函數(shù)的全部參數(shù)都指定了默認(rèn)值,則在定義對(duì)象時(shí)可以不給出,或給出一個(gè)、幾個(gè)實(shí)參;在一個(gè)類中定義了全部默認(rèn)參數(shù)的構(gòu)造函數(shù)后,不能再定義重載構(gòu)造函數(shù),否則會(huì)出現(xiàn)二義性。Box(int=10,int=10,int=10);//指定全部參數(shù)為默認(rèn)參數(shù)Box();

//聲明無參構(gòu)造函數(shù),是重載構(gòu)造函數(shù)Box(int,int);

//聲明有2個(gè)參數(shù)的構(gòu)造函數(shù)若有以下語句:Boxbox1;

//無法確定調(diào)用第1個(gè)、還是第2個(gè)構(gòu)造函數(shù)?Boxbox2(15,30);

//無法確定調(diào)用第1個(gè)、還是第3個(gè)構(gòu)造函數(shù)?例2.5.5。

析構(gòu)函數(shù)(destructor)也是一個(gè)特殊的成員函數(shù),它的作用與構(gòu)造函數(shù)相反.它的名字是類名的前面加一個(gè)“~”符號(hào)。在C++中“~”是位取反運(yùn)算符,從這點(diǎn)也可以想到:析構(gòu)函數(shù)是與構(gòu)造函數(shù)作用相反的函數(shù)。當(dāng)對(duì)象的生命期結(jié)束時(shí),會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。比如說如果在一個(gè)函數(shù)中定義了一個(gè)對(duì)象(它是自動(dòng)局部對(duì)象),當(dāng)這個(gè)函數(shù)被調(diào)用結(jié)束時(shí),對(duì)象應(yīng)該釋放,在對(duì)象釋放前自動(dòng)執(zhí)行析構(gòu)函數(shù)。析構(gòu)函數(shù)析構(gòu)函數(shù)的作用并不是刪除對(duì)象,而是在撤銷對(duì)象占用的內(nèi)存之前完成一些清理工作。最典型的情況是構(gòu)造對(duì)象時(shí),在構(gòu)造函數(shù)中分配了資源,例如動(dòng)態(tài)申請(qǐng)了一些內(nèi)存單元,在對(duì)象消失時(shí)就要釋放這些內(nèi)存單元。一般由一系列的delete組成。析構(gòu)函數(shù)不返回任何值,沒有函數(shù)類型,也沒有函數(shù)參數(shù)。因此它不能被重載。一個(gè)類可以有多個(gè)構(gòu)造函數(shù),但只能有一個(gè)析構(gòu)函數(shù)。析構(gòu)函數(shù)一般情況下,類的設(shè)計(jì)者應(yīng)當(dāng)在聲明類的同時(shí)定義析構(gòu)函數(shù),以指定如何完成“清理”的工作。如果用戶沒有定義析構(gòu)函數(shù),C++編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),但它只是徒有析構(gòu)函數(shù)的名稱和形式,實(shí)際上什么操作都不進(jìn)行。想讓析構(gòu)函數(shù)完成任何工作,都必須在定義的析構(gòu)函數(shù)中指定。析構(gòu)函數(shù)125析構(gòu)函數(shù)析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)相反。析構(gòu)函數(shù)的特點(diǎn):(1)析構(gòu)函數(shù)不能接受任何參數(shù),也沒有返回類型說明;(2)一個(gè)類只有一個(gè)析構(gòu)函數(shù),如果用戶未編寫析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)缺省的析構(gòu)函數(shù),此函數(shù)不做任何事情;(3)析構(gòu)函數(shù)不能重載。構(gòu)造函數(shù)和析構(gòu)函數(shù)126何時(shí)執(zhí)行析構(gòu)函數(shù)?(1)一個(gè)函數(shù)中定義的對(duì)象(自動(dòng)局部的),在這個(gè)函數(shù)結(jié)束調(diào)用時(shí),對(duì)象應(yīng)該釋放,并在對(duì)象釋放前自動(dòng)執(zhí)行析構(gòu)函數(shù);(2)static類型的局部對(duì)象在函數(shù)調(diào)用結(jié)束時(shí)并不釋放,也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時(shí),才調(diào)用static局部對(duì)象的析構(gòu)函數(shù);(3)一個(gè)全局對(duì)象,在程序離開其作用域時(shí)(如main函數(shù)結(jié)束或調(diào)用exit函數(shù)),調(diào)用該全局對(duì)象的析構(gòu)函數(shù);(4)用new運(yùn)算符動(dòng)態(tài)建立的對(duì)象,當(dāng)用delete運(yùn)算符釋放該對(duì)象時(shí),先調(diào)用該對(duì)象的析構(gòu)函數(shù);(5)如果用戶沒定義析構(gòu)函數(shù),C++編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),只是它實(shí)際上不執(zhí)行任何操作。127構(gòu)造函數(shù)和析構(gòu)函數(shù)共同點(diǎn)都沒有返回值,無需指出返回類型;不能被繼承;構(gòu)造函數(shù)可以有缺省參數(shù);不能用常規(guī)調(diào)用方法調(diào)用構(gòu)造函數(shù);當(dāng)使用完全的限定名(包括對(duì)象名、類名、函數(shù)名)時(shí)可以調(diào)用析構(gòu)函數(shù);定義對(duì)象時(shí),編譯程序自動(dòng)調(diào)用構(gòu)造函數(shù),刪除對(duì)象時(shí),編譯程序自動(dòng)調(diào)用析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)128

構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)的次序相反,最先被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的(同一對(duì)象中的)析構(gòu)函數(shù)最后被調(diào)用,而最后被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的析構(gòu)函數(shù)最先被調(diào)用;“先構(gòu)造的后析構(gòu)、后構(gòu)造的先析構(gòu)”的先進(jìn)后出的特征。構(gòu)造函數(shù)和析構(gòu)函數(shù)129圖2.7.1構(gòu)造函數(shù)與析構(gòu)函數(shù)調(diào)用順序調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序構(gòu)造函數(shù)和析構(gòu)函數(shù)

例2.6.1

包含構(gòu)造函數(shù)和析構(gòu)函數(shù)的C++程序。130

指向?qū)ο蟮闹羔槍?duì)象存儲(chǔ)空間的起始地址叫對(duì)象指針;可以定義一個(gè)指針變量,存放對(duì)象空間的起始地址,如:

Timet1;//創(chuàng)建Time類對(duì)象t1Time*pt=&t1;//定義指向Time類對(duì)象

//的指針pt,并將t1的起始地址賦給pt對(duì)象指針131

指向?qū)ο蟮闹羔樋梢酝ㄟ^對(duì)象指針訪問對(duì)象和對(duì)象的成員,如:

*pt//pt所指向?qū)ο髏1

(*pt).hour//pt所指向?qū)ο笾械膆our成員,即t1.hourpt->hour//pt所指向?qū)ο笾械膆our成員,即t1.hour

(*pt).get_time()//調(diào)用pt所指向的對(duì)象中的get_time函數(shù),即t1.get_time

pt->get_time()//調(diào)用pt所指向的對(duì)象中的

get_time函數(shù),即t1.get_time對(duì)象指針132

指向?qū)ο蟪蓡T的指針指向?qū)ο髷?shù)據(jù)成員的指針:數(shù)據(jù)類型名*指針變量名;

p1=&t1.hour;

//將對(duì)象t1的數(shù)據(jù)成員hour的地址賦給p1,p1指向t1.hourcout<<*p1<<endl;

//輸出t1.hour的值對(duì)象指針133

指向?qū)ο蟪蓡T的指針指向?qū)ο蟪蓡T函數(shù)的指針:1、普通函數(shù):數(shù)據(jù)類型名(*指針變量名)(參數(shù)表列);

2、指向公用成員函數(shù)的指針變量:數(shù)據(jù)類型名(類::*指針變量名)(參數(shù)表列);3、使指針變量指向一個(gè)公用成員函數(shù)的一般形式為:

指針變量名=&類名::成員函數(shù)名;例2.8.1。對(duì)象指針每個(gè)對(duì)象中的數(shù)據(jù)成員都分別占有存儲(chǔ)空間,如果對(duì)同一個(gè)類定義了n個(gè)對(duì)象,則有n組同樣大小的空間以存放n個(gè)對(duì)象中的數(shù)據(jù)成員。但是,不同對(duì)象都調(diào)用同一個(gè)函數(shù)代碼段。當(dāng)不同對(duì)象的成員函數(shù)引用數(shù)據(jù)成員時(shí),怎么能保證引用的是所指定的對(duì)象的數(shù)據(jù)成員呢?假如,對(duì)于定義的Box類,定義了3個(gè)同類對(duì)象a,b,c。如果有a.volume(),應(yīng)該是引用對(duì)象a中的height,width和length,計(jì)算出長方體a的體積。如果有b.volume(),應(yīng)該是引用對(duì)象b中的height,width和length,計(jì)算出長方體b的體積。而現(xiàn)在都用同一個(gè)函數(shù)段,系統(tǒng)怎樣使它分別引用a或b中的數(shù)據(jù)成員呢?this指針在每一個(gè)成員函數(shù)中都包含一個(gè)特殊的指針,這個(gè)指針的名字是固定的,稱為this。它是指向本類對(duì)象的指針,它的值是當(dāng)前被調(diào)用的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論