《C++面向?qū)ο蟪绦蛟O(shè)計導論》-從抽象到編程 課件 02 封裝與職責_第1頁
《C++面向?qū)ο蟪绦蛟O(shè)計導論》-從抽象到編程 課件 02 封裝與職責_第2頁
《C++面向?qū)ο蟪绦蛟O(shè)計導論》-從抽象到編程 課件 02 封裝與職責_第3頁
《C++面向?qū)ο蟪绦蛟O(shè)計導論》-從抽象到編程 課件 02 封裝與職責_第4頁
《C++面向?qū)ο蟪绦蛟O(shè)計導論》-從抽象到編程 課件 02 封裝與職責_第5頁
已閱讀5頁,還剩47頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

類的封裝《C++面向?qū)ο蟪绦蛟O(shè)計導論》--從抽象到編程第2章封裝與職責2.1.1事物的邊界2.1類的封裝2.1.2封裝的概念2.1.4接口與實現(xiàn)分離2.1.3接口的聲明本節(jié)學習目標能夠運用語文、數(shù)學知識解釋如何抽象事物的邊界能夠運用事物的邊界解釋封裝、接口的概念能夠使用C++聲明接口能夠使用多源文件結(jié)構(gòu)聲明類的接口并實現(xiàn)2.1.1事物的邊界邊界的劃分:物VS事邊界?邊界的作用:區(qū)分內(nèi)外、事物?邊界的抽象:語文VS數(shù)學?事物的邊界是指一個事物與其它事物的界限從身體、知識和能力三個側(cè)面來劃分人的邊界事物的屬性和行為能夠反映事物的邊界2.1.2封裝的概念封裝類的基本原理是從不同的側(cè)面劃分事物的邊界,并使用屬性和行為來反映劃分出的邊界。一般將類的屬性和行為稱為該類的邊界。classPerson//人{public: voideat(charobj[]){};//吃(東西) voidsleep(void){}; //睡覺()

public: charname[20];//姓名 boolsex; //性別 intage; //年齡 floatheight; //身高 floatweight;//體重};邊界:屬性和行為內(nèi)部:屬性值和函數(shù)體封裝是指從客觀世界中抽象出類的過程。顧名思義,通過屬性和行為將一個事物“包裝”起來,并通過這些屬性和行為反映這個事物的內(nèi)部事物。2.1.3接口的聲明接口(Interface):內(nèi)部事物與外部事物進行交互的這部分邊界可見性public(公開的)private(私有的)protected(保護的)classPerson{public: Person(charnameV[],boolsexV,intageV,floatheightV,floatweightV); ~Person(); voideat(charobj[]); voidsleep(void); voidprint();

private: charname[20];//姓名 boolsex; //性別 intage; //年齡 floatheight; //身高 floatweight;//體重};2.1.3接口的聲明classPerson//人{public:

Person(charnameV[],boolsexV,intageV,floatheightV,floatweightV); ~Person(); voideat(charobj[]); voidsleep(void); voidprint();

private: charname[20];//姓名 boolsex; //性別 intage; //年齡 floatheight;//身高 floatweight;//體重}編譯器通過限制選擇成員運算(.或->)來實現(xiàn)成員的可見性2.1.4接口與實現(xiàn)分離使用多源文件結(jié)構(gòu),將類的聲明代碼與成員函數(shù)的實現(xiàn)代碼分離到不同源文件Person.h使用多源文件結(jié)構(gòu),將類的聲明代碼與實現(xiàn)代碼分離classPerson//人{public: Person(charnameV[],boolsexV,intageV,floatheightV,floatweightV); ~Person(); voidprint(); voideat(charobj[]); voidsleep(void);

private: charname[20];//姓名 boolsex; //性別 intage; //年齡 floatheight; //身高 floatweight;//體重};Person.cpp#include<iostream>#include<string.h>#include"Person.h"usingnamespacestd;Person::Person(charnameV[],boolsexV,intageV,floatheightV,floatweightV){

cout<<"我知道怎么設(shè)置人的屬性,我已完成!"<<endl; strncpy(name,nameV,sizeof(name));//姓名

sex=sexV;//性別

age=ageV;//年齡

height=heightV;//身高

weight=weightV;//體重}Person::~Person() {

cout<<"析構(gòu):"<<name<<endl;}voidPerson::print(){ cout<<"我是一個人,我的屬性值為:"<<name<<"," <<sex<<"," <<age<<"," <<height<<endl;}voidPerson::eat(charobj[]){//吃(東西) cout<<"我是一個人"<<name<<",但我還沒有學會怎么吃。"<<obj<<endl;}voidPerson::sleep(void){//睡覺() cout<<"我是一個人"<<name<<",我會睡覺,但還說不清楚是怎么睡覺的。"<<endl;}Person.cpp#include<iostream>#include"Person.h"usingnamespacestd;Personp1("張三",0,18,180.5,65.3voidmain(){ p1.print(); cout<<endl;

Personp2("李四",1,16,165,46.5);//李四

p2.print();}練習在VS2013中編輯、跟蹤調(diào)試例2.2中的代碼,并使用PD描述類Person和程序的執(zhí)行過程總結(jié)及進一步學習2.2封裝的作用進一步學習思維:事物的邊界,類的封裝和接口設(shè)計:如何抽象事物的邊界,如何封裝類編碼:使用C++(多源文件結(jié)構(gòu))聲明類及其接口第2章封裝與職責2.2.1保護內(nèi)部數(shù)據(jù)2.2封裝的作用2.2.2屏蔽內(nèi)部計算學習目標能夠運用類的封裝和接口等知識解釋如何保護內(nèi)部能夠運用數(shù)學、計算機知識解釋如何屏蔽內(nèi)部計算能夠解釋接口的作用2.2.1保護內(nèi)部數(shù)據(jù)從計算的角度,封裝主要有保護內(nèi)部數(shù)據(jù)和屏蔽內(nèi)部計算兩個作用。保護內(nèi)部數(shù)據(jù)指不能從對象的外部直接訪問對象中的數(shù)據(jù),只能通過接口中的成員函數(shù)間接訪問2.2.1保護內(nèi)部數(shù)據(jù)//ch2-3.cpp#include"Point.h"#include<iostream>usingnamespacestd;

voidmain(){ doublex,y; cout<<"輸入x和y:\n"; cin>>x>>y; Pointp(x,y); cout<<"極坐標:Point("<<p.angle()<<","<<p.radius()<<")"<<endl; cout<<"直角坐標:Point("<<p.xOffset()<<","<<p.yOffset()<<")"<<endl;}防止在main函數(shù)中訪問對象p的成員變量,即保護對象p中的數(shù)據(jù)2.2.2屏蔽內(nèi)部計算Point::Point(doubledX,doubledY){ x=dX; y=dY;}doublePoint::xOffset(){ returnx;}Point::Point(doubleix,doubleiy){ a=atan2(iy,dX); r=sqrt(ix*ix+iy*iy);}doublePoint::xOffset(){ returnr*cos(a);}兩個類中,計算方法不同導致成員函數(shù)的函數(shù)體不同兩個類的接口相同,無論使用哪個類都不需要修改main函數(shù)中的代碼練習1.編寫類Point的代碼,并調(diào)試通過。2.將直角坐標改為極坐標,并編碼實現(xiàn)總結(jié)及進一步學習設(shè)計:使用類的接口保護對象的內(nèi)部數(shù)據(jù)、屏蔽內(nèi)部計算編碼:保持接口不變的情況下,編寫不同的實現(xiàn)代碼2.3對象的職責進一步學習第2章封裝與職責2.3.1管理自己的數(shù)據(jù)2.3對象的職責2.3.2完成特定的任務(wù)2.3.4與其它對象共存的能力2.3.3參與計算的能力學習目標能夠運用結(jié)構(gòu)化程序設(shè)計知識解釋對象的職責和能力能夠運用封裝和接口等概念解釋如何賦予對象的職責能夠使用拷貝構(gòu)造函數(shù)提高對象的自我管理能力2.3.1管理自己的數(shù)據(jù)封裝一個類時,應(yīng)從基本職責和基本能力兩個方面給對象賦予職責和能力,并以職責為導向評價屬性和行為的完備性和合理性。一個對象應(yīng)承擔兩個基本職責,為了完成這兩個基本職責,還應(yīng)具備兩個基本能力。inta=1,c;int*pa=&a;c=a;Personinit;Persona=init,c;Person*pa=&a;c=a;像數(shù)據(jù)類型一樣使用類,像變量一樣使用對象兩個基本職責:第一、管理自己的數(shù)據(jù),以反映客觀事物第二、完成特定的任務(wù),承擔客觀事物的職責。兩個基本能力:第一、參與計算的能力第二、與其他對象共存與協(xié)作的能力。1.使用對象創(chuàng)建對象Point::Point(const

Point&oldPoint){ cout<<"調(diào)用拷貝構(gòu)造函數(shù)Point(constPoint&)"<<endl;

memcpy(this,&oldPoint,sizeof(Point)); cout<<"新創(chuàng)建點("<<this->x<<","<<this->y<<")"<<endl;};voidmain(){ cout<<"創(chuàng)建點a(1.2,2.3)"<<endl;

Pointa(1.2,2.3); cout<<endl<<"創(chuàng)建點b,并通過a初始化"<<endl;

Pointb=a;//等價于Pointb(a)}拷貝構(gòu)造函數(shù)Point(const

Point&

oldPoint)2.使用字符數(shù)組創(chuàng)建對象Student::Student(char*pName){

cout<<"constructingstudent"<<pName<<endl;

strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]='\0';}Student::Student(char*pName,intxHours,floatxgpa){

cout<<"constructingstudent"<<pName<<endl;

strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]='\0';

semesHours=xHours;

gpa=xgpa;}voidfn(){ Studentss("Jenny");}voidmain(){ fn(); Students1("Randy",22,3.5);}2.3.2完成特定的任務(wù)boolTdate::isLeapYear(){ return(year%4==0&&year%100!=0)||(year%400==0);}日期相關(guān)的運算:加減運算等2.3.3參與計算的能力voidf(Tdateobj){

cout<<"傳對象,地址:"<<&obj<<",值";

obj.print();//obj是對象

if(obj.isLeapYear())

cout<<"是閏年\n"; else

cout<<"不是閏年\n";}voidfRef(Tdate&ref){

cout<<"傳引用,地址:"<<&ref<<",值";

ref.print();//ref是對象的引用}voidfAddress(Tdate*ptr){

cout<<"傳指針,地址:"<<ptr<<",值";

ptr->print();//ptr是對象的指針}voidmain(){

cout<<endl<<"創(chuàng)建對象d"<<endl;

Tdated(1,1,2000);

cout<<"地址:"<<&d<<",值:"<<endl;

cout<<endl<<"創(chuàng)建對象dd"<<endl;

Tdatedd;

cout<<"地址:"<<&dd<<",值:"<<endl;

cout<<endl<<"將對象d賦值給對象dd"<<endl; dd=d; //將一個對象賦值給另一個對象

cout<<"地址:"<<&dd<<",值:";

dd.print();

cout<<endl<<"對象作為參數(shù)傳遞"<<endl;

fAddress(&d);

cout<<endl; f(d);

cout<<endl;

fRef(d);}計算能力:對象在函數(shù)之間正確傳遞2.3.4與其它對象共存的能力#include"Desk"#include"Stool"voidfn(){ Deskda(10,5,5,5);//創(chuàng)建Desk的對象da Stoolsa(6,3,3,3);//創(chuàng)建Stool的對象sa}voidmain(){ fn();}對象在內(nèi)存中相互獨立函數(shù)調(diào)用也相互獨立練習編寫調(diào)試例2.7的代碼,說明對象的職責和能力觀察Tdate對象在函數(shù)參數(shù)傳遞的過程總結(jié)及進一步學習設(shè)計:賦予對象的職責,提高對象的能力編碼:使用拷貝構(gòu)造函數(shù)提升對象的能力2.4自定義數(shù)據(jù)類型Tdate進一步學習第2章封裝與職責2.4.1定義數(shù)據(jù)類型Tdate2.4.2Tdate的對象作為成員對象2.4自定義數(shù)據(jù)類型學習目標能夠以職責和能力為導向封裝數(shù)據(jù)類型能夠運用拷貝構(gòu)造函數(shù)解釋函數(shù)調(diào)用中如何傳遞和返回對象能夠運用構(gòu)造函數(shù)解釋如何創(chuàng)建成員對象能夠使用C++自定義數(shù)據(jù)類型2.4.1定義數(shù)據(jù)類型Tdate數(shù)據(jù)類型是面向計算的,需要賦予其對象參與計算能力使用拷貝構(gòu)造函數(shù)賦予對象參與計算能力Tdate::Tdate(constTdate&oldTdate){ cout<<"拷貝構(gòu)造:"<<this<<"->";; oldTdate.print(); memcpy(this,&oldTdate,sizeof(Tdate));}TdateTdate::add(intid){ Tdatert(*this); rt.day+=id;//省略增加日期的邏輯,讀者自己完善

returnrt;}#include"Tdate.h"#include<iostream>usingnamespacestd;Tdatefadd(Tdated11,intad){ returnd11.add(ad);}Tdatefn(Tdated){//fn(d2)時按照Tdated(d2)的語義傳遞對象

returnd;//按照Tdate(d)的語義返回無名對象}voidmain(){ cout<<"****創(chuàng)建d1(1,2,2000)****"<<endl; Tdated1(1,2,2000); cout<<endl<<"****t創(chuàng)建d2(d1)****"<<endl; Tdated2(d1); cout<<endl<<"****fn(d2).print()****"<<endl; fn(d2).print(); cout<<endl<<"****d2.add(3).print()****"<<endl; d2.add(3).print(); cout<<endl<<"****fadd(d2,3)****"<<endl; fadd(d2,3).print(); cout<<"****main語句結(jié)束****"<<endl;}使用構(gòu)造函數(shù)初始化對象Tdatefadd(Tdated11,intad){ returnd11.add(ad);}Tdatefn(Tdated){//fn(d2)時按照Tdated(d2)的語義傳遞對象

returnd;//按照Tdate(d)的語義返回無名對象}voidmain(){ cout<<"****創(chuàng)建d1(1,2,2000)****"<<endl; Tdated1(1,2,2000); cout<<endl<<"****t創(chuàng)建d2(d1)****"<<endl; Tdated2(d1); cout<<endl<<"****fn(d2).print()****"<<endl; fn(d2).print(); cout<<endl<<"****d2.add(3).print()****"<<endl; d2.add(3).print(); cout<<endl<<"****fadd(d2,3)****"<<endl; fadd(d2,3).print(); cout<<"****main語句結(jié)束****"<<endl;}1.函數(shù)調(diào)用中傳遞對象和返回對象#include"Tdate.h"#include<iostream>usingnamespacestd;Tdatefadd(Tdated11,intad){ returnd11.add(ad);}Tdatefn(Tdated){//fn(d2)時按照Tdated(d2)的語義傳遞對象

returnd;//按照Tdate(d)的語義返回無名對象}voidmain(){ cout<<"****創(chuàng)建d1(1,2,2000)****"<<endl; Tdated1(1,2,2000); cout<<endl<<"****t創(chuàng)建d2(d1)****"<<endl; Tdated2(d1); cout<<endl<<"****fn(d2).print()****"<<endl; fn(d2).print(); cout<<endl<<"****d2.add(3).print()****"<<endl; d2.add(3).print(); cout<<endl<<"****fadd(d2,3)****"<<endl; fadd(d2,3).print(); cout<<"****main語句結(jié)束****"<<endl;}請畫出fadd(d2,3).print()計算順序圖2.函數(shù)調(diào)用中的傳值方式classPerson{public: Person(){}; Person(Tdated):birthday(d){}; ~Person(){}; voidprint(){ cout<<"Person:"; birthday.print(); };private:

Tdatebirthday;//類Tdate作為數(shù)據(jù)類型};2.4.2Tdate的對象作為成員對象創(chuàng)建Person對象時要創(chuàng)建Tdate對象Personfn(Personp){ returnp;}Person*fnPtr(Person*p){ ret

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論