《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 張力生 第1、2章 類與對(duì)象、封裝與職責(zé)_第1頁
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 張力生 第1、2章 類與對(duì)象、封裝與職責(zé)_第2頁
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 張力生 第1、2章 類與對(duì)象、封裝與職責(zé)_第3頁
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 張力生 第1、2章 類與對(duì)象、封裝與職責(zé)_第4頁
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 張力生 第1、2章 類與對(duì)象、封裝與職責(zé)_第5頁
已閱讀5頁,還剩103頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1章類與對(duì)象《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》--從抽象到編程第1章類與對(duì)象1.1抽象第1章類與對(duì)象1.2類和對(duì)象的概念1.3類的聲明和對(duì)象的定義本節(jié)學(xué)習(xí)目標(biāo)能夠運(yùn)用語文知識(shí)解釋類和對(duì)象及其抽象(概念思維)能夠運(yùn)用數(shù)學(xué)和計(jì)算機(jī)知識(shí)解釋類和對(duì)象(計(jì)算思維)能夠使用C++聲明類、定義對(duì)象、訪問屬性1.1.1語文中的抽象抽象有概念、判斷、推理等思維形式,語文中一般使用詞語或語句來記錄(或表示)抽象的過程。如:張三是一個(gè)人概念:人,電腦,手機(jī)判斷:張三是一個(gè)人推理:張三不是電腦抽象:從客觀世界到符號(hào)世界的映射概念思維1.1.1語文中的抽象語義:從符號(hào)世界到客觀世界的映射概念:人,電腦,手機(jī)判斷:張三是一個(gè)人推理:張三不是電腦文字的語義?讀書:讀文字還是其語義?1.1.2數(shù)學(xué)中的抽象數(shù)學(xué)中一般將客觀世界中的事物抽象為數(shù)在第6章中討論。自然數(shù)的理論主要有基數(shù)理論和皮亞諾公理,它們從不同角度回答了“自然數(shù)及其運(yùn)算是什么?”這個(gè)基本問題。例如,“8是一個(gè)自然數(shù)”,其中,“自然數(shù)”是一個(gè)概念,代表一個(gè)集合,“8”是自然數(shù)這個(gè)集合中的一個(gè)元素。計(jì)算思維1.2類和對(duì)象的概念1.2.1屬性與屬性值1.2.2行為與函數(shù)1.2.3類的結(jié)構(gòu)及其表示方法1.2.4對(duì)象的結(jié)構(gòu)及其表示方法1.2.1屬性與屬性值數(shù)據(jù)類型形容詞等詞語屬性值1.2.2行為與函數(shù)函數(shù)對(duì)象中為什么沒有函數(shù)?一般用動(dòng)詞表示行為1.2.3-4類和對(duì)象的表示方法來源于中文、數(shù)學(xué)以及計(jì)算機(jī)語言1.3類的聲明和對(duì)象的定義classPerson//人{(lán)public: voideat(charobj[]){};//吃(東西) voidsleep(void){}; //睡覺()

public: charname[20];//姓名 boolsex; //性別 intage; //年齡 floatheight; //身高 floatweight;//體重};1.3.1類的聲明1.3.2定義對(duì)象Personp1;//全局對(duì)象voidmain(){ //設(shè)置張三("張三",1,18,180.5,65.3)的屬性 strncpy(,"張三",sizeof()); p1.sex=1;//男 p1.age=18; p1.height=180.5; p1.weight=65.3;

//定義類Person的對(duì)象p2,并設(shè)置屬性值

Personp2;//李四("李四",0,16,165,46.5) strncpy(,"李四",sizeof()); p2.sex=0;//女 p2.age=16; p2.height=165; p2.weight=46.5;}1.3.3訪問對(duì)象的成員變量 strncpy(,"張三",sizeof()); p1.sex=1;//男 p1.age=18; p1.height=180.5; p1.weight=65.3;.成員選擇(對(duì)象)Memberselection(object)從左到右exp.xx計(jì)算exp得到對(duì)象ob,得到ob的成員xx–>成員選擇(指針)Memberselection(pointer)從左到右exp->xx計(jì)算exp得到指到成員變量的指針p,得到指針p指向的成員變量的成員xx練習(xí)讀懂這幾張圖的語義VS2013上編輯調(diào)試【例1.1】中的代碼總結(jié)及進(jìn)一步學(xué)習(xí)思維:語文的概念抽象,數(shù)學(xué)中的數(shù)學(xué)抽象設(shè)計(jì):類和對(duì)象的概念以及表達(dá)方法編碼:使用C++聲明類、定義對(duì)象,訪問成員變量1.4成員函數(shù)的定義和調(diào)用進(jìn)一步學(xué)習(xí)第1章類與對(duì)象1.4.1定義成員函數(shù)1.4成員函數(shù)的定義和調(diào)用1.4.2調(diào)用成員函數(shù)1.4.3成員函數(shù)與普通函數(shù)的區(qū)別1.4.4成員函數(shù)調(diào)用的內(nèi)部實(shí)現(xiàn)學(xué)習(xí)目標(biāo)能夠運(yùn)用數(shù)學(xué)知識(shí)解釋成員函數(shù)能夠運(yùn)用計(jì)算機(jī)知識(shí)解釋成員函數(shù)的內(nèi)部實(shí)現(xiàn)原理能夠使用C++定義和調(diào)用成員函數(shù)1.4.1定義成員函數(shù)將類中聲明或定義的函數(shù)稱為類的成員函數(shù)。定義成員函數(shù)的方法與定義函數(shù)非常類似。按照定義函數(shù)的方法來定義類的成員函數(shù),并在成員函數(shù)中直接使用類的屬性名訪問屬性的值。【例1.2】定義和調(diào)用成員函數(shù)classPerson//人{(lán)public:

voidsetValue(charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"我知道怎么設(shè)置人的屬性,我已完成!"<<endl; strncpy(name,nameV,sizeof(name));//姓名

sex=sexV;//性別 age=ageV;//年齡 height=heightV;//身高 weight=weightV;//體重 } voidprint(){ cout<<"我是一個(gè)人,我的屬性值為:"<<name<<"," <<sex<<"," <<age<<"," <<height<<"," <<weight<<endl; } voideat(charobj[]){//吃(東西) cout<<"我是一個(gè)人"<<name<<",但我還沒有學(xué)會(huì)怎么吃:"<<obj<<endl; }; voidsleep(void){//睡覺() cout<<"我是一個(gè)人"<<name<<",我會(huì)睡覺,但還說不清楚是怎么睡覺的。"<<endl; }

public: charname[20];//姓名

boolsex; //性別 intage; //年齡 floatheight; //身高 floatweight;//體重};1.4.2調(diào)用成員函數(shù)Personp1;//張三

voidmain(){

//設(shè)置張三("張三",1,18,180.5,65.3)的屬性

p1.setValue("張三",1,18,180.5,65.3);

p1.eat("西瓜"); p1.sleep(); p1.print();

Personp2;//李四 cout<<endl; p2.setValue("李四",0,16,165,46.5); p2.print();}對(duì)象名.成員函數(shù)名(實(shí)參列表)調(diào)用成員函數(shù)的執(zhí)行過程Personp1;//張三

voidmain(){ //設(shè)置張三("張三",1,18,180.5,65.3)的屬性

p1.setValue("張三",1,18,180.5,65.3); p1.eat("西瓜"); p1.sleep(); p1.print();

Personp2;//李四 cout<<endl;

p2.setValue("李四",0,16,165,46.5); p2.print();}跟蹤調(diào)試代碼,理解調(diào)用成員函數(shù)的執(zhí)行過程對(duì)象名.成員函數(shù)名(實(shí)參列表)1.4.3成員函數(shù)與普通函數(shù)的區(qū)別Personp1;//張三

voidsetValue(Person*p, charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"我知道怎么設(shè)置人的屬性,我已完成!"<<endl; strncpy(p->name,nameV,sizeof(p->name));//姓名

p->sex=sexV;//性別 p->age=ageV;//年齡 p->height=heightV;//身高 p->weight=weightV;//體重}

voidmain(){ //設(shè)置張三("張三",1,18,180.5,65.3)的屬性

setValue(&p1,"張三",1,18,180.5,65.3); p1.print();

Personp2;//李四 cout<<endl; setValue(&p2,"李四",0,16,165,46.5); p2.print();}p1.setValue("張三",1,18,180.5,65.3);功能相同但函數(shù)原型不同,調(diào)用語句不同1.4.4成員函數(shù)調(diào)用的內(nèi)部實(shí)現(xiàn)classPerson//人{(lán)public:

voidsetValue(charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"我知道怎么設(shè)置人的屬性,我已完成!"<<endl; strncpy(name,nameV,sizeof(name));//姓名 sex=sexV;//性別 age=ageV;//年齡 height=heightV;//身高 weight=weightV;//體重 }};按照下面代碼的語義編譯setValue()成員函數(shù)voidsetValue(Person*this,charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"我知道怎么設(shè)置人的屬性,我已完成!"<<endl; strncpy(this->name,nameV,sizeof(this->name));//姓名

this->sex=sexV;//性別 this->age=ageV;//年齡 this->height=heightV;//身高 this->weight=weightV;//體重}p1.setValue("張三",1,18,180.5,65.3)按照下面代碼的語義編譯成員函數(shù)調(diào)用setValue(&p1,"張三",1,18,180.5,65.3);this練習(xí)讀懂這幾張圖的語義VS2013上編輯調(diào)試【例1.2】中的代碼總結(jié)及進(jìn)一步學(xué)習(xí)設(shè)計(jì):成員函數(shù)的概念、作用和表述方法編碼:使用C++定義和調(diào)用成員函數(shù)調(diào)試:編譯成員函數(shù)的原理和內(nèi)部實(shí)現(xiàn)機(jī)制1.5創(chuàng)建和刪除對(duì)象進(jìn)一步學(xué)習(xí)第1章類與對(duì)象1.5.1構(gòu)造對(duì)象1.5創(chuàng)建和刪除對(duì)象1.5.2全局對(duì)象和靜態(tài)對(duì)象1.5.3堆對(duì)象和對(duì)象數(shù)組1.5.4語義的實(shí)現(xiàn)和優(yōu)化學(xué)習(xí)目標(biāo)能夠理解創(chuàng)建和刪除對(duì)象的原理,理解構(gòu)造函數(shù)和析構(gòu)函數(shù)的概念和作用能夠使用C++定義構(gòu)造函數(shù)和析構(gòu)函數(shù),并創(chuàng)建和刪除對(duì)象能夠理解創(chuàng)建和刪除對(duì)象的內(nèi)部實(shí)現(xiàn)機(jī)制,并使用時(shí)序圖描述對(duì)象的創(chuàng)建和刪除過程1.5.1構(gòu)造對(duì)象在計(jì)算機(jī)中創(chuàng)建一個(gè)對(duì)象時(shí),應(yīng)該同時(shí)指明這個(gè)對(duì)象代表的是哪個(gè)客觀事物,這就要求在定義一個(gè)對(duì)象時(shí)設(shè)置對(duì)象的屬性值。構(gòu)造函數(shù)(Constructor)是特殊成員函數(shù),用于初始化對(duì)象。Person(charnameV[],boolsexV,intageV,floatheightV,floatweightV)析構(gòu)函數(shù)(Destructor)是特殊成員函數(shù),用于處理一些善后工作。創(chuàng)建一個(gè)對(duì)象p1,語句為:Personp1("張三",0,18,180.5,65.3)語義為:①為對(duì)象p1分配內(nèi)存;②按照p1.Person("張三",0,18,180.5,65.3)的語義調(diào)用構(gòu)造函數(shù),作用是給對(duì)象p1的成員變量賦初值。【例1.4】自動(dòng)調(diào)用構(gòu)造函數(shù)classPerson//人{(lán)public:

Person(charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"構(gòu)造:我知道怎么設(shè)置人的屬性,我已完成!"<<endl; strncpy(name,nameV,sizeof(name));//姓名 sex=sexV;//性別 age=ageV;//年齡 height=heightV;//身高 weight=weightV;//體重 }

~Person()

{ cout<<"析構(gòu):"<<name<<endl; } …….};Personp1("張三",0,18,180.5,65.3);//張三

voidmain(){ p1.print();

cout<<endl; Personp2("李四",1,16,165,46.5);//李四 p2.print();}【例1.4】自動(dòng)調(diào)用構(gòu)造函數(shù)Personp1("張三",0,18,180.5,65.3);//張三

voidmain(){ p1.print();

cout<<endl; Personp2("李四",1,16,165,46.5);//李四 p2.print();}描述對(duì)象的創(chuàng)建過程創(chuàng)建對(duì)象作為一個(gè)整體(簡(jiǎn)潔)創(chuàng)建對(duì)象中的兩個(gè)步驟(詳細(xì))選擇適合的描述粒度1.5.2全局對(duì)象和靜態(tài)對(duì)象#include

<iostream>using

namespacestd;

class

Point{public: Point(double

dx,double

dy){ cout<<"調(diào)用Point("<<dx<<","<<dy<<")"<<endl; x=dx; y=dy; } ~Point(){ cout<<"析構(gòu)Point("<<x<<","<<y<<")"<<endl; }private:

doublex;

doubley;};【例1.5】全局對(duì)象、靜態(tài)對(duì)象和局部對(duì)象1.5.2全局對(duì)象和靜態(tài)對(duì)象Pointg(0,0); //全局對(duì)象voidfn(){

static

Pointsf(1,1);//靜態(tài)對(duì)象

Pointf(2,2); //局部對(duì)象}intmain(){

cout<<endl<<"第一次調(diào)用fn()函數(shù)"<<endl; fn();

cout<<endl<<"第二次調(diào)用fn()函數(shù)"<<endl; fn();

cout<<endl<<"退出main()函數(shù)"<<endl;}1.5.3堆對(duì)象和對(duì)象數(shù)組intmain(){ cout<<endl<<"創(chuàng)建對(duì)象"<<endl;

Point*ph=new

Point(3,3);

cout<<endl<<"創(chuàng)建對(duì)象數(shù)組"<<endl;

PointmA[3];//局部對(duì)象數(shù)組

Point*phA=new

Point[5];

cout<<endl<<"釋放堆對(duì)象"<<endl;

delete[]phA; //釋放堆中對(duì)象數(shù)組

deleteph;

//釋放堆對(duì)象}1.5.4語義的實(shí)現(xiàn)和優(yōu)化正確理解每條代碼的語義是讀懂程序的基礎(chǔ),也是編寫代碼的前提。計(jì)算機(jī)世界中的語義(數(shù)學(xué))Pointg(0,0); //全局對(duì)象voidfn(){

static

Pointsf(1,1);//靜態(tài)對(duì)象

Pointf(2,2); //局部對(duì)象}intmain(){

cout<<endl<<"第一次調(diào)用fn()函數(shù)"<<endl; fn();

cout<<endl<<"第二次調(diào)用fn()函數(shù)"<<endl; fn();

cout<<endl<<"退出main()函數(shù)"<<endl;}計(jì)算機(jī)世界客觀世界中語義(語文)練習(xí)讀懂這幾張圖的語義VS2013上編輯調(diào)試【例1.5】中的代碼總結(jié)及進(jìn)一步學(xué)習(xí)設(shè)計(jì):構(gòu)造函數(shù)和析構(gòu)函數(shù)的概念、作用和表述方法編碼:定義構(gòu)造函數(shù)和析構(gòu)函數(shù),定義并初始化對(duì)象調(diào)試:創(chuàng)建和刪除對(duì)象的原理和內(nèi)部實(shí)現(xiàn)機(jī)制1.6程序設(shè)計(jì)思想和描述工具進(jìn)一步學(xué)習(xí)第1章類與對(duì)象1.6.1程序設(shè)計(jì)思想的變遷1.6程序設(shè)計(jì)思想和描述工具1.6.2UML圖形語言1.6.3面向?qū)ο蟪绦蛟O(shè)計(jì)言語學(xué)習(xí)目標(biāo)能夠使用類圖描述類及其屬性和行為的抽象過程能夠使用對(duì)象圖描述對(duì)象及其屬性值的抽象過程學(xué)會(huì)一種建模軟件的使用(PowerDesigner15.3)1.6.1程序設(shè)計(jì)思想的變遷1.結(jié)構(gòu)化程序設(shè)計(jì)思想2.面向?qū)ο蟪绦蛟O(shè)計(jì)思想程序=數(shù)據(jù)結(jié)構(gòu)+算法程序=對(duì)象(數(shù)據(jù)結(jié)構(gòu)+算法)+對(duì)象….程序設(shè)計(jì)導(dǎo)論:從計(jì)算到編程程序設(shè)計(jì)導(dǎo)論:從抽象到編程面向?qū)ο蟪绦虻慕Y(jié)構(gòu)主要工作是設(shè)計(jì)和編寫類1.6.2UML圖形語言統(tǒng)一建模語言(UnifiedModelingLanguage,UML)是國(guó)際標(biāo)準(zhǔn)化組織OMG(ObjectManagementGroup)制定的一種圖形語言,是目前常用的圖形工具,并廣泛應(yīng)用于軟件的分析設(shè)計(jì)。UML中,定義了類圖、對(duì)象圖、時(shí)序圖、狀態(tài)圖、活動(dòng)圖等一系列的圖及圖標(biāo),并規(guī)定圖的作用及圖標(biāo)的語義,可用這些圖及圖標(biāo)從不同角度、不同層次上描述程序及其運(yùn)行過程。本書主要使用類圖、對(duì)象圖、時(shí)序圖描述程序的類、對(duì)象和程序運(yùn)行過程。有關(guān)UML的知識(shí),可查閱標(biāo)準(zhǔn)文本或其他資料。圖形語言也是一種語言,其根本作用是人與人之間交流,因此,在畫UML圖時(shí),應(yīng)專注于表達(dá)自己的想法,而不能過度追求圖形的美觀,應(yīng)以別人能夠理解為度。選擇:PowerDesigner15.3PowerDesigner15.3界面學(xué)習(xí)使用PowerDesigner15.3首選PD幫助文檔PD使用知識(shí)學(xué)習(xí)專業(yè)英語網(wǎng)上學(xué)習(xí)資料UML知識(shí)軟件建模方法UML標(biāo)準(zhǔn)文本深入學(xué)習(xí)自學(xué)演示:使用PD進(jìn)行分析設(shè)計(jì)分析應(yīng)用場(chǎng)景中事物抽象類及屬性和行為增加計(jì)算機(jī)特性描述類的對(duì)象練習(xí)分析應(yīng)用場(chǎng)景中事物抽象類及屬性和行為增加計(jì)算機(jī)特性描述類的對(duì)象自主練習(xí)多練習(xí),繪制教材中的圖總結(jié)及進(jìn)一步學(xué)習(xí)分析:使用PD記錄類和對(duì)象的中間抽象結(jié)果設(shè)計(jì):使用PD描述類和對(duì)象編碼:使用PD描述編碼所需的關(guān)鍵因素1.6.3面向?qū)ο蟪绦蛟O(shè)計(jì)言語(VisualStudio2013)進(jìn)一步學(xué)習(xí)第1章類與對(duì)象1.6.1程序設(shè)計(jì)思想的變遷1.6程序設(shè)計(jì)思想和描述工具1.6.2UML圖形語言1.6.3面向?qū)ο蟪绦蛟O(shè)計(jì)語言學(xué)習(xí)目標(biāo)學(xué)會(huì)一種計(jì)算機(jī)語言(C++)和集成開發(fā)環(huán)境

VisualStudio2013能夠在VS2013中編輯代碼、編譯連接、跟蹤調(diào)試能夠使用時(shí)序圖描述程序的執(zhí)行過程能夠使用對(duì)象圖描述對(duì)象及其屬性值1.6.3面向?qū)ο蟪绦蛟O(shè)計(jì)言語選擇:C++語言,VisualStudio2013面向?qū)ο蟪绦蛟O(shè)計(jì)言語C++JAVAC#......功能大同小異描述能力也沒有本質(zhì)上的區(qū)別怎樣描述類怎樣描述類的屬性怎樣描述實(shí)現(xiàn)成員函數(shù)的算法編程方法面向?qū)ο笏枷朊嫦驅(qū)ο笤O(shè)計(jì)的基本思路理解分析設(shè)計(jì)的成果物面向?qū)ο蟪绦蛟O(shè)計(jì)言編程的基本方法學(xué)習(xí)使用VisualStudio2013編輯代碼學(xué)習(xí)語法學(xué)習(xí)編碼規(guī)范編譯連接跟蹤調(diào)試?yán)斫獯a的語義管理程序代碼多練習(xí)查閱VisualStudio2013幫助文檔首選MSDN幫助文檔學(xué)習(xí)C++語言知識(shí)學(xué)習(xí)專業(yè)英語網(wǎng)上學(xué)習(xí)資料編程知識(shí)C++標(biāo)準(zhǔn)文本深入學(xué)習(xí)學(xué)會(huì)查閱資料演示:使用VS2013編碼調(diào)試根據(jù)類圖聲明類和定義成員函數(shù)根據(jù)對(duì)象圖定義和使用對(duì)象跟蹤程序的執(zhí)行過程,觀察內(nèi)存中的對(duì)象使用時(shí)序圖描述成員函數(shù)的調(diào)用過程和對(duì)象的創(chuàng)建過程練習(xí)根據(jù)類圖聲明類和定義成員函數(shù)根據(jù)對(duì)象圖定義和使用對(duì)象跟蹤程序的執(zhí)行過程,觀察內(nèi)存中的對(duì)象使用時(shí)序圖描述成員函數(shù)的調(diào)用過程和對(duì)象的創(chuàng)建過程VS2013上編輯調(diào)試【例1.5】中的代碼本節(jié)總結(jié)及進(jìn)一步學(xué)習(xí)設(shè)計(jì):PD中使用時(shí)序圖、對(duì)象圖描述描述程序執(zhí)行過程及其創(chuàng)建的對(duì)象編碼:VS2013中使用C++編輯代碼調(diào)試:VS2013中編譯連接、跟蹤調(diào)試代碼第2章封裝與職責(zé)進(jìn)一步學(xué)習(xí)THANKS《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論:從抽象到編程》第1章類的封裝《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》--從抽象到編程第2章封裝與職責(zé)2.1.1事物的邊界2.1類的封裝2.1.2封裝的概念2.1.4接口與實(shí)現(xiàn)分離2.1.3接口的聲明本節(jié)學(xué)習(xí)目標(biāo)能夠運(yùn)用語文、數(shù)學(xué)知識(shí)解釋如何抽象事物的邊界能夠運(yùn)用事物的邊界解釋封裝、接口的概念能夠使用C++聲明接口能夠使用多源文件結(jié)構(gòu)聲明類的接口并實(shí)現(xiàn)2.1.1事物的邊界邊界的劃分:物VS事邊界?邊界的作用:區(qū)分內(nèi)外、事物?邊界的抽象:語文VS數(shù)學(xué)?事物的邊界是指一個(gè)事物與其它事物的界限從身體、知識(shí)和能力三個(gè)側(cè)面來劃分人的邊界事物的屬性和行為能夠反映事物的邊界2.1.2封裝的概念封裝類的基本原理是從不同的側(cè)面劃分事物的邊界,并使用屬性和行為來反映劃分出的邊界。一般將類的屬性和行為稱為該類的邊界。classPerson//人{(lán)public: voideat(charobj[]){};//吃(東西) voidsleep(void){}; //睡覺()

public: charname[20];//姓名 boolsex; //性別 intage; //年齡 floatheight; //身高 floatweight;//體重};邊界:屬性和行為內(nèi)部:屬性值和函數(shù)體封裝是指從客觀世界中抽象出類的過程。顧名思義,通過屬性和行為將一個(gè)事物“包裝”起來,并通過這些屬性和行為反映這個(gè)事物的內(nèi)部事物。2.1.3接口的聲明接口(Interface):內(nèi)部事物與外部事物進(jìn)行交互的這部分邊界可見性public(公開的)private(私有的)protected(保護(hù)的)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//人{(lán)public:

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

private: charname[20];//姓名 boolsex; //性別 intage; //年齡 floatheight;//身高 floatweight;//體重}編譯器通過限制選擇成員運(yùn)算(.或->)來實(shí)現(xiàn)成員的可見性2.1.4接口與實(shí)現(xiàn)分離使用多源文件結(jié)構(gòu),將類的聲明代碼與成員函數(shù)的實(shí)現(xiàn)代碼分離到不同源文件Person.h使用多源文件結(jié)構(gòu),將類的聲明代碼與實(shí)現(xiàn)代碼分離classPerson//人{(lán)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<<"我是一個(gè)人,我的屬性值為:"<<name<<"," <<sex<<"," <<age<<"," <<height<<endl;}voidPerson::eat(charobj[]){//吃(東西) cout<<"我是一個(gè)人"<<name<<",但我還沒有學(xué)會(huì)怎么吃。"<<obj<<endl;}voidPerson::sleep(void){//睡覺() cout<<"我是一個(gè)人"<<name<<",我會(huì)睡覺,但還說不清楚是怎么睡覺的。"<<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();}練習(xí)在VS2013中編輯、跟蹤調(diào)試?yán)?.2中的代碼,并使用PD描述類Person和程序的執(zhí)行過程總結(jié)及進(jìn)一步學(xué)習(xí)2.2封裝的作用進(jìn)一步學(xué)習(xí)思維:事物的邊界,類的封裝和接口設(shè)計(jì):如何抽象事物的邊界,如何封裝類編碼:使用C++(多源文件結(jié)構(gòu))聲明類及其接口第2章封裝與職責(zé)2.2.1保護(hù)內(nèi)部數(shù)據(jù)2.2封裝的作用2.2.2屏蔽內(nèi)部計(jì)算學(xué)習(xí)目標(biāo)能夠運(yùn)用類的封裝和接口等知識(shí)解釋如何保護(hù)內(nèi)部能夠運(yùn)用數(shù)學(xué)、計(jì)算機(jī)知識(shí)解釋如何屏蔽內(nèi)部計(jì)算能夠解釋接口的作用2.2.1保護(hù)內(nèi)部數(shù)據(jù)從計(jì)算的角度,封裝主要有保護(hù)內(nèi)部數(shù)據(jù)和屏蔽內(nèi)部計(jì)算兩個(gè)作用。保護(hù)內(nèi)部數(shù)據(jù)指不能從對(duì)象的外部直接訪問對(duì)象中的數(shù)據(jù),只能通過接口中的成員函數(shù)間接訪問2.2.1保護(hù)內(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<<"極坐標(biāo):Point("<<p.angle()<<","<<p.radius()<<")"<<endl; cout<<"直角坐標(biāo):Point("<<p.xOffset()<<","<<p.yOffset()<<")"<<endl;}防止在main函數(shù)中訪問對(duì)象p的成員變量,即保護(hù)對(duì)象p中的數(shù)據(jù)2.2.2屏蔽內(nèi)部計(jì)算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);}兩個(gè)類中,計(jì)算方法不同導(dǎo)致成員函數(shù)的函數(shù)體不同兩個(gè)類的接口相同,無論使用哪個(gè)類都不需要修改main函數(shù)中的代碼練習(xí)1.編寫類Point的代碼,并調(diào)試通過。2.將直角坐標(biāo)改為極坐標(biāo),并編碼實(shí)現(xiàn)總結(jié)及進(jìn)一步學(xué)習(xí)設(shè)計(jì):使用類的接口保護(hù)對(duì)象的內(nèi)部數(shù)據(jù)、屏蔽內(nèi)部計(jì)算編碼:保持接口不變的情況下,編寫不同的實(shí)現(xiàn)代碼2.3對(duì)象的職責(zé)進(jìn)一步學(xué)習(xí)第2章封裝與職責(zé)2.3.1管理自己的數(shù)據(jù)2.3對(duì)象的職責(zé)2.3.2完成特定的任務(wù)2.3.4與其它對(duì)象共存的能力2.3.3參與計(jì)算的能力學(xué)習(xí)目標(biāo)能夠運(yùn)用結(jié)構(gòu)化程序設(shè)計(jì)知識(shí)解釋對(duì)象的職責(zé)和能力能夠運(yùn)用封裝和接口等概念解釋如何賦予對(duì)象的職責(zé)能夠使用拷貝構(gòu)造函數(shù)提高對(duì)象的自我管理能力2.3.1管理自己的數(shù)據(jù)封裝一個(gè)類時(shí),應(yīng)從基本職責(zé)和基本能力兩個(gè)方面給對(duì)象賦予職責(zé)和能力,并以職責(zé)為導(dǎo)向評(píng)價(jià)屬性和行為的完備性和合理性。一個(gè)對(duì)象應(yīng)承擔(dān)兩個(gè)基本職責(zé),為了完成這兩個(gè)基本職責(zé),還應(yīng)具備兩個(gè)基本能力。inta=1,c;int*pa=&a;c=a;Personinit;Persona=init,c;Person*pa=&a;c=a;像數(shù)據(jù)類型一樣使用類,像變量一樣使用對(duì)象兩個(gè)基本職責(zé):第一、管理自己的數(shù)據(jù),以反映客觀事物第二、完成特定的任務(wù),承擔(dān)客觀事物的職責(zé)。兩個(gè)基本能力:第一、參與計(jì)算的能力第二、與其他對(duì)象共存與協(xié)作的能力。1.使用對(duì)象創(chuàng)建對(duì)象Point::Point(const

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

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

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

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

Point&

oldPoint)2.使用字符數(shù)組創(chuàng)建對(duì)象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)的運(yùn)算:加減運(yùn)算等2.3.3參與計(jì)算的能力voidf(Tdateobj){

cout<<"傳對(duì)象,地址:"<<&obj<<",值";

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

if(obj.isLeapYear())

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

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

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

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

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

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

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

Tdated(1,1,2000);

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

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

Tdatedd;

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

cout<<endl<<"將對(duì)象d賦值給對(duì)象dd"<<endl; dd=d; //將一個(gè)對(duì)象賦值給另一個(gè)對(duì)象

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

dd.print();

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

fAddress(&d);

cout<<endl; f(d);

cout<<endl;

fRef(d);}計(jì)算能力:對(duì)象在函數(shù)之間正確傳遞2.3.4與其它對(duì)象共存的能力#include"Desk"#include"Stool"voidfn(){ Deskda(10,5,5,5);//創(chuàng)建Desk的對(duì)象da Stoolsa(6,3,3,3);//創(chuàng)建Stool的對(duì)象sa}voidmain(){ fn();}對(duì)象在內(nèi)存中相互獨(dú)立函數(shù)調(diào)用也相互獨(dú)立練習(xí)編寫調(diào)試?yán)?.7的代碼,說明對(duì)象的職責(zé)和能力觀察Tdate對(duì)象在函數(shù)參數(shù)傳遞的過程總結(jié)及進(jìn)一步學(xué)習(xí)設(shè)計(jì):賦予對(duì)象的職責(zé),提高對(duì)象的能力編碼:使用拷貝構(gòu)造函數(shù)提升對(duì)象的能力2.4自定義數(shù)據(jù)類型Tdate進(jìn)一步學(xué)習(xí)第2章封裝與職責(zé)2.4.1定義數(shù)據(jù)類型Tdate2.4.2Tdate的對(duì)象作為成員對(duì)象2.4自定義數(shù)據(jù)類型學(xué)習(xí)目標(biāo)能夠以職責(zé)和能力為導(dǎo)向封裝數(shù)據(jù)類型能夠運(yùn)用拷貝構(gòu)造函數(shù)解釋函數(shù)調(diào)用中如何傳遞和返回對(duì)象能夠運(yùn)用構(gòu)造函數(shù)解釋如何創(chuàng)建成員對(duì)象能夠使用C++自定義數(shù)據(jù)類型2.4.1定義數(shù)據(jù)類型Tdate數(shù)據(jù)類型是面向計(jì)算的,需要賦予其對(duì)象參與計(jì)算能力使用拷貝構(gòu)造函數(shù)賦予對(duì)象參與計(jì)算能力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)時(shí)按照Tdated(d2)的語義傳遞對(duì)象

returnd;//按照Tdate(d)的語義返回?zé)o名對(duì)象}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ù)初始化對(duì)象Tdatefadd(Tdated11,intad){ returnd11.add(ad);}Tdatefn(Tdated){//fn(d2)時(shí)按照Tdated(d2)的語義傳遞對(duì)象

returnd;//按照Tdate(d)的語義返回?zé)o名對(duì)象}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)用中傳遞對(duì)象和返回對(duì)象#include"T

溫馨提示

  • 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)論