《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 03 關(guān)聯(lián)與連接_第1頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 03 關(guān)聯(lián)與連接_第2頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 03 關(guān)聯(lián)與連接_第3頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 03 關(guān)聯(lián)與連接_第4頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》-從抽象到編程 課件 03 關(guān)聯(lián)與連接_第5頁(yè)
已閱讀5頁(yè),還剩55頁(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)介

關(guān)聯(lián)和連接及其實(shí)現(xiàn)《C++面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》--從抽象到編程第3章關(guān)聯(lián)與連接3.1關(guān)聯(lián)與連接的概念3.2關(guān)聯(lián)的實(shí)現(xiàn)第3章關(guān)聯(lián)與連接本節(jié)學(xué)習(xí)目標(biāo)能夠運(yùn)用語(yǔ)文知識(shí)和數(shù)學(xué)知識(shí)解釋關(guān)聯(lián)和連接及其表述能夠運(yùn)用關(guān)聯(lián)和連接描述事物之間的關(guān)系能夠使用指針實(shí)現(xiàn)關(guān)聯(lián)及其連接能夠運(yùn)用集合論解釋關(guān)聯(lián)和連接的實(shí)現(xiàn)方法連接(Link)是對(duì)客觀事物之間的一個(gè)關(guān)系的抽象,是一個(gè)關(guān)系在計(jì)算機(jī)世界中的反映關(guān)聯(lián)(Association)是對(duì)連接的抽象,是一種關(guān)系在計(jì)算機(jī)世界中的反映。關(guān)聯(lián)和連接是面向?qū)ο笏枷胫械膬蓚€(gè)基本概念3.1關(guān)聯(lián)與連接的概念語(yǔ)文中,使用陳述語(yǔ)句描述客觀事物及其相互關(guān)系,陳述語(yǔ)句主要采用“主動(dòng)賓”格式數(shù)學(xué)中,使用元素之間的對(duì)應(yīng)關(guān)系來(lái)描述客觀事物及其相互關(guān)系3.1關(guān)聯(lián)與連接的概念(表示)3.2.1使用指針實(shí)現(xiàn)多對(duì)一關(guān)聯(lián)3.2.2使用指針數(shù)組實(shí)現(xiàn)多對(duì)多關(guān)聯(lián)數(shù)學(xué)中,對(duì)應(yīng)關(guān)系有一對(duì)一、多對(duì)一和多對(duì)多三種類型3.2關(guān)聯(lián)的實(shí)現(xiàn)導(dǎo)航(Navigation)角色(Role)重?cái)?shù)(Multiplicity)一個(gè)人喜歡一種體育運(yùn)動(dòng)一種體育運(yùn)動(dòng)可被多個(gè)人喜歡使用工具有助于發(fā)現(xiàn)解決問(wèn)題的關(guān)鍵因素3.2.1使用指針實(shí)現(xiàn)多對(duì)一關(guān)聯(lián)使用指針Sport*sport實(shí)現(xiàn)多對(duì)一關(guān)聯(lián)like編碼實(shí)現(xiàn)#include

"Sport.h"class

Person{public: Person(); Person(char*pName); ~Person();

boollike(Sport*likeSport); Sport*likedSport();

voidprint();

private:

charname[20];

Sport*sport;//指向最喜歡的運(yùn)動(dòng)};【例3.1】使用成員指針表示多對(duì)一關(guān)聯(lián)中的連接class

Sport{public: Sport(); Sport(char*pName);

voidprint(); ~Sport();

private:

charname[20];};#include

<iostream>#include

<string.h>#include

"Sport.h"using

namespacestd;

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

Sport::print(){ cout<<name<<endl;}Sport::~Sport(){}【例3.1】使用成員指針表示多對(duì)一關(guān)聯(lián)中的連接#include

<iostream>#include

<string.h>#include

"Sport.h"#include

"Person.h"using

namespacestd;

Person::Person(){}Person::Person(char*pName){ strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]='\0';}Person::~Person(){}voidPerson::like(Sport*likeSport){ sport=likeSport;}Sport*Person::likedSport(){

returnsport;}voidPerson::print(){ cout<<name;}#include<iostream>#include"Sport.h"#include"Person.h"usingnamespacestd;

voidmain(){ Sports1("足球"); Sports2("籃球"); Sports3("乒乓球");

Personp1("張三"); p1.like(&s1); p1.print(); cout<<"最喜歡"; p1.likedSport()->print();

Personp2("李四"); p2.like(&s2); p2.print(); cout<<"最喜歡"; p2.likedSport()->print();

Personp3("王五"); p3.like(&s2); p3.print(); cout<<"最喜歡"; p3.likedSport()->print();}【例3.2】維護(hù)多對(duì)一關(guān)聯(lián)中的連接#include<iostream>#include<string.h>#include"Sport.h"#include"Person.h"usingnamespacestd;

Person::Person(){}Person::Person(char*pName){ strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]='\0';}Person::~Person(){}voidPerson::like(Sport*likeSport){ sport=likeSport;}Sport*Person::likedSport(){ returnsport;}voidPerson::print(){ cout<<name;}#include<iostream>#include"Sport.h"#include"Person.h"usingnamespacestd;

voidmain(){ Sports1("足球"); Sports2("籃球"); Sports3("乒乓球");

Personp1("張三"); p1.like(&s1); p1.print();

cout<<"最喜歡"; p1.likedSport()->print();

Personp2("李四"); p2.like(&s2); p2.print(); cout<<"最喜歡"; p2.likedSport()->print();

Personp3("王五"); p3.like(&s2); p3.print(); cout<<"最喜歡"; p3.likedSport()->print();}【例3.2】維護(hù)多對(duì)一關(guān)聯(lián)中的連接#include<iostream>#include"Sport.h"#include"Person.h"usingnamespacestd;voidmain(){ Sports1("足球"); Sports2("籃球"); Sports3("乒乓球");

Personp1("張三"); p1.like(&s1); p1.print(); cout<<"最喜歡"; p1.likedSport()->print();

Personp2("李四"); p2.like(&s2); p2.print(); cout<<"最喜歡"; p2.likedSport()->print();

Personp3("王五"); p3.like(&s2); p3.print(); cout<<"最喜歡"; p3.likedSport()->print();}【例3.2】維護(hù)多對(duì)一關(guān)聯(lián)中的連接//Person.h#include

"Sport.h"class

Person{public: Person(); Person(char*pName); ~Person();

voidlike(Sport*likeSport); Sport**likedSport();

voidprint();

private:

charname[20];

Sport*sport[3];//指向喜歡的3項(xiàng)運(yùn)動(dòng)};3.2.2使用指針數(shù)組實(shí)現(xiàn)多對(duì)多關(guān)聯(lián)一個(gè)人喜歡0到3種體育運(yùn)動(dòng)//Person.cpp#include<iostream>#include<string.h>#include"Sport.h"#include"Person.h"usingnamespacestd;

Person::Person(){ for(inti=0;i<3;i++) sport[i]=NULL;//設(shè)置為空,表示沒(méi)有指向?qū)ο髛Person::Person(char*pName){ strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]='\0'; for(inti=0;i<3;i++) sport[i]=NULL;}Person::~Person(){}boolPerson::like(Sport*likeSport){ inti=0; while(i<3&&sport[i]) i++; if(i<3){ sport[i]=likeSport; returntrue; }else{ returnfalse;//超過(guò)3項(xiàng)返回錯(cuò)誤 }}Sport**Person::likedSport(){ returnsport;}voidPerson::print(){ cout<<name; cout<<"喜歡"; for(inti=0;i<3;i++) sport[i]->print();}//app.cpp#include"Sport.h"#include"Person.h"usingnamespacestd;voidmain(){ Sports1("足球"); Sports2("籃球"); Sports3("乒乓球"); Sports4("跳高");

Personp1("張三"); p1.like(&s1); p1.like(&s2); p1.like(&s3); p1.like(&s4);//超過(guò)3項(xiàng)不存儲(chǔ) p1.print();

Personp2("李四"); p2.like(&s4); p2.like(&s3); p2.like(&s2); p2.like(&s1);//超過(guò)3項(xiàng)不存儲(chǔ) p2.print();}【例3.4】維護(hù)多對(duì)多關(guān)聯(lián)中的連接張三喜歡足球籃球乒乓球李四喜歡跳高乒乓球籃球請(qǐng)使用時(shí)序圖描述程序運(yùn)行過(guò)程。例3.4程序的輸出結(jié)果練習(xí)調(diào)試通過(guò)例3.4的代碼按照下面的語(yǔ)義重做分析設(shè)計(jì)和編碼實(shí)現(xiàn)一個(gè)人喜歡0到5種體育運(yùn)動(dòng)總結(jié)及進(jìn)一步學(xué)習(xí)分析:使用關(guān)聯(lián)和連接抽象事物之間的關(guān)系設(shè)計(jì):使用關(guān)聯(lián)、連接等UML工具描述類及對(duì)象之間的關(guān)系編碼:使用指針編程實(shí)現(xiàn)關(guān)聯(lián)及其連接3.3組合與聚合關(guān)聯(lián)進(jìn)一步學(xué)習(xí)第3章關(guān)聯(lián)與連接3.3組合與聚合關(guān)聯(lián)3.2關(guān)聯(lián)的實(shí)現(xiàn)第3章關(guān)聯(lián)與連接學(xué)習(xí)目標(biāo)能夠運(yùn)用組合關(guān)聯(lián)和聚合關(guān)聯(lián)等知識(shí)解釋事物的內(nèi)部構(gòu)成能夠使用組合關(guān)聯(lián)、聚合關(guān)聯(lián)等UML工具描述事物的內(nèi)部關(guān)系能夠使用對(duì)象和指針實(shí)現(xiàn)組合關(guān)聯(lián)能夠使用代碼實(shí)現(xiàn)聚合關(guān)聯(lián)關(guān)聯(lián)分為一般關(guān)聯(lián)(Association)、聚合(Aggregation)和組合(Composition)三種3.3組合與聚合關(guān)聯(lián)組合關(guān)聯(lián):具有相同的生命周期聚合關(guān)聯(lián):具有不同的生命周期3.3組合與聚合關(guān)聯(lián)3.3.1使用對(duì)象實(shí)現(xiàn)組合關(guān)聯(lián)3.3.2使用指針實(shí)現(xiàn)組合關(guān)聯(lián)3.3.3使用代碼實(shí)現(xiàn)聚合關(guān)聯(lián)使用對(duì)象StudentIDstudentID實(shí)現(xiàn)組合關(guān)聯(lián)3.3.1使用對(duì)象實(shí)現(xiàn)組合關(guān)聯(lián)3.3.1使用對(duì)象實(shí)現(xiàn)組合關(guān)聯(lián)//Student.h#include

"StudentID.h"

class

Student{public:Student();Student(intid);Student(intid,char*pName);Student(intid,char*pName,intxHours,floatxgpa);~Student();

private:

charname[20];intsemesHours;floatgpa;

StudentIDstudentID;//表示多對(duì)一組合關(guān)聯(lián)中的連接};【例3.5】使用對(duì)象表示多對(duì)一組合關(guān)聯(lián)的連接//StudentID.hclass

StudentID{public: StudentID(); StudentID(intid); ~StudentID();

voidprint();

private:

boolisValid(void);

intvalue;};//StudentID.cpp#include

<iostream>#include

<string.h>#include

"StudentID.h"using

namespacestd;

StudentID::StudentID(){ cout<<"\t"<<"調(diào)用構(gòu)造函數(shù)StudentID()"<<endl;}StudentID::StudentID(int

id){ cout<<"\t"<<"調(diào)用構(gòu)造函數(shù)StudentID("<<id<<")"<<endl;

if(isValid()) value=id;}StudentID::~StudentID(){ cout<<"析構(gòu)StudentID:"<<value<<endl;}void

StudentID::print(){ cout<<value<<endl;}bool

StudentID::isValid(){

//可增加判斷學(xué)號(hào)是否符合編碼規(guī)則的代碼

return

true;}

【例3.5】使用對(duì)象表示多對(duì)一組合關(guān)聯(lián)的連接//Student.cpp#include

<iostream>#include

<string.h>#include

"StudentID.h"#include

"Student.h"using

namespacestd;

Student::Student(){ cout<<"調(diào)用構(gòu)造函數(shù)Student()"<<endl<<endl;}

Student::Student(int

id):studentID(id)//增加了新的語(yǔ)法{ cout<<"調(diào)用構(gòu)造函數(shù)Student("<<id<<")"<<endl<<endl;}

Student::Student(int

id,char*pName):studentID(id){ cout<<"調(diào)用構(gòu)造函數(shù)Student("<<id<<","<<pName <<")"<<endl<<endl;

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

Student::Student(int

id,char*pName,int

xHours,float

xgpa):studentID(id){ cout<<"調(diào)用構(gòu)造函數(shù)Student("<<id<<","<<pName <<","<<xHours<<","<<xgpa <<")"<<endl<<endl; strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]='\0'; semesHours=xHours; gpa=xgpa;}

Student::~Student(){ cout<<"析構(gòu)Student:"; studentID.print();}//app.cpp#include

"StudentID.h"#include

"Student.h"

voidmain(){ Students1(210101,"Randy"); Students2(210102,"Randy"); Students3(210103,"Jenny",10,3.5);}運(yùn)行過(guò)程和結(jié)果3.3.2使用指針實(shí)現(xiàn)組合關(guān)聯(lián)編寫(xiě)代碼同步生命周期Person對(duì)象管理Tdate對(duì)象構(gòu)造函數(shù)析構(gòu)函數(shù)【例3.7】使用指針實(shí)現(xiàn)組合關(guān)聯(lián)#include

<iostream>#include

"Tdate.h"#include

<iostream>using

namespacestd;class

Person{public: Person(){};

Person(char

n[],Tdated){ strncpy(name,n,sizeof(name)); name[sizeof(name)-1]='\0';

birthday=newTdate(d);//創(chuàng)建一個(gè)新的Tdate對(duì)象 };

~Person(){

deletebirthday;//刪除連接的Tdate對(duì)象 };

voidprint(){ cout<<"Person:"<<name<<","; birthday->print(); }; TdategetBirthday()const{

returnTdate(*birthday);//返回一個(gè)新對(duì)象而沒(méi)有返回指針birthday,以保證安全 }

Person(const

Person&oldPerson){ memcpy(this,&oldPerson,sizeof(Person));//將oldPerson的內(nèi)存中的數(shù)據(jù)復(fù)制內(nèi)存

birthday=newTdate(oldPerson.getBirthday());//創(chuàng)建一個(gè)新的Tdate對(duì)象 };private:

Tdate*birthday;//使用指針表示多對(duì)一組合關(guān)聯(lián)

charname[20];};Personfn(Person

p){

return

p;}Person*fnPtr(Person*p){

return

p;}voidmain(){ Tdated1(1,2,2000); Tdated2(1,2,2021);

cout<<"****Person對(duì)象****"<<endl;

Personp1("張三",d1);

Personp2("李四",d1);

cout<<"****傳遞*Person對(duì)象****"<<endl;

fn(p1).print();

cout<<"****傳遞*Person對(duì)象指針****"<<endl;

fnPtr(&p2)->print();

cout<<"****main語(yǔ)句結(jié)束****"<<endl;}運(yùn)行過(guò)程和結(jié)果在組合關(guān)聯(lián)中,由于“整體”和“部分”的生命周期相同,在創(chuàng)建“整體”時(shí)需要同時(shí)創(chuàng)建“部分”,在刪除“整體”時(shí)需要同時(shí)刪除“部分”,創(chuàng)建和刪除“部分”的職責(zé)自然而然地賦予了構(gòu)造函數(shù)和析構(gòu)函數(shù)。3.3.3使用代碼實(shí)現(xiàn)聚合關(guān)聯(lián)生命周期不同“部分”可以獨(dú)立存在程序員的責(zé)任只維護(hù)連接不必維護(hù)對(duì)象語(yǔ)言編譯器不提供編碼實(shí)現(xiàn)語(yǔ)義【例3.8】類Motor和Wheel//Motor.hclass

Motor{public: Motor(intsn,floatfPower); ~Motor();

voidprint();

private:

intserialNumber;//產(chǎn)品序列號(hào)

floatpower;//發(fā)動(dòng)機(jī)的排量};//Motor.cpp#include

<iostream>#include

"Motor.h"using

namespacestd;

Motor::Motor(int

sn,float

fPower){

cout<<"調(diào)用構(gòu)造函數(shù)Motor("<<sn<<","<<fPower<<")"<<endl;

serialNumber=sn; power=fPower;}Motor::~Motor(){

cout<<"析構(gòu)Motor:"<<serialNumber<<endl;}void

Motor::print(){ cout<<serialNumber<<","<<power;}【例3.9】類Motor和Wheel//Wheel.hclass

Wheel{public: Wheel(intsn,floatfSize); ~Wheel();

voidprint();private:

intserialNumber;//產(chǎn)品序列號(hào)

floatsize;//車輪大小};//Wheel.cpp#include

"Wheel.h"#include

<iostream>using

namespacestd;Wheel::Wheel(int

sn,float

fSize){

cout<<"調(diào)用構(gòu)造函數(shù)Wheel("<<sn<<","<<fSize<<")"<<endl;

serialNumber=sn; size=fSize;}Wheel::~Wheel(){

cout<<"析構(gòu)Wheel:"<<serialNumber<<endl;}void

Wheel::print(){

cout<<serialNumber<<","<<size;}【例3.9】類Car//Car.h#include"Wheel.h"#include

"Motor.h"

class

Car{public: Car(Motor&mMotor,Wheel**aWheel); ~Car();

Motor&set(Motor&depart);

Wheel&set(Wheel&depart,intposition);

voidprint();

private:

Wheel*wheel[4];//指向4個(gè)車輪

Motor*motor;//指向發(fā)動(dòng)機(jī)};//Car.cpp#include

"Motor.h"#include

"Wheel.h"#include

"Car.h"#include

<iostream>using

namespacestd;Car::Car(Motor&mMotor,Wheel*aWheel[]):motor(&mMotor){ cout<<"調(diào)用構(gòu)造函數(shù)Car(";

mMotor.print(); cout<<")"<<endl;

for(inti=0;i<4;i++){ wheel[i]=aWheel[i]; }}Car::~Car(){ cout<<"析構(gòu)Car:"<<endl;

for(inti=0;i<4;i++){ //刪除4個(gè)車輪對(duì)象

deletewheel[i]; }

deletemotor; //刪除發(fā)動(dòng)機(jī)對(duì)象}Motor&Car::set(Motor&depart){

Motor&rt=*motor;

motor=&depart;

returnrt;}Wheel&Car::set(Wheel&depart,int

position){

Wheel&rt=*wheel[position];

wheel[position]=&depart;

returnrt;}void

Car::print(){ cout<<"汽車\t發(fā)動(dòng)機(jī):"; motor->print(); cout<<"\t\t車輪:";

for(inti=0;i<4;i++){ wheel[i]->print(); cout<<"|"; } cout<<endl;}【例3.10】主程序//CarApp.cpp #include

"Motor.h"#include

"Wheel.h"#include

"Car.h"#include

<iostream>using

namespacestd;

voidmain(){ cout<<"***********創(chuàng)建發(fā)動(dòng)機(jī)***********"<<endl;

Motor&m1=*(new

Motor(101,1.6));//為堆中的對(duì)象取了一個(gè)名稱,以便后面使用

Motor&m2=*(new

Motor(102,2.0));

Motor&m3=*(new

Motor(103,1.6)); cout<<"***********創(chuàng)建車輪***********"<<endl;

const

intlen=10;

Wheel*wBase[len];

for(inti=0;i<len;i++){ wBase[i]=new

Wheel(201+i,10); } cout<<"***********創(chuàng)建汽車***********"<<endl;

Car&c1=*(newCar(m1,wBase)); c1.print(); Car&c2=*(newCar(m2,wBase+4)); c2.print(); cout<<"***********更換并報(bào)廢部件***********"<<endl;

Wheel&w1=c1.set(*wBase[8],1);//換第一個(gè)車輪

delete&w1; //報(bào)廢車輪,刪除它

Motor&t=c1.set(m3);//換發(fā)動(dòng)機(jī)

delete&t; //報(bào)廢發(fā)動(dòng)機(jī),刪除它 cout<<"***********報(bào)廢汽車***********"<<endl;

delete&c1;

delete&c2; cout<<"***********刪除庫(kù)存中沒(méi)有使用的車輪***********"<<endl;

deletewBase[9];}運(yùn)行結(jié)果***********創(chuàng)建發(fā)動(dòng)機(jī)***********調(diào)用構(gòu)造函數(shù)Motor(101,1.6)調(diào)用構(gòu)造函數(shù)Motor(102,2)調(diào)用構(gòu)造函數(shù)Motor(103,1.6)***********創(chuàng)建車輪***********調(diào)用構(gòu)造函數(shù)Wheel(201,10)調(diào)用構(gòu)造函數(shù)Wheel(202,10)調(diào)用構(gòu)造函數(shù)Wheel(203,10)調(diào)用構(gòu)造函數(shù)Wheel(204,10)調(diào)用構(gòu)造函數(shù)Wheel(205,10)調(diào)用構(gòu)造函數(shù)Wheel(206,10)調(diào)用構(gòu)造函數(shù)Wheel(207,10)調(diào)用構(gòu)造函數(shù)Wheel(208,10)調(diào)用構(gòu)造函數(shù)Wheel(209,10)調(diào)用構(gòu)造函數(shù)Wheel(210,10)***********創(chuàng)建汽車***********調(diào)用構(gòu)造函數(shù)Car(101,1.6)汽車

發(fā)動(dòng)機(jī):101,1.6車輪:201,10|202,10|203,10|204,10|調(diào)用構(gòu)造函數(shù)Car(102,2)汽車

發(fā)動(dòng)機(jī):102,2車輪:205,10|206,10|207,10|208,10|***********更換并報(bào)廢部件***********析構(gòu)Wheel:202析構(gòu)Motor:101***********報(bào)廢汽車***********析構(gòu)Wheel:201析構(gòu)Wheel:209析構(gòu)Wheel:203析構(gòu)Wheel:204析構(gòu)Motor:103析構(gòu)Car:析構(gòu)Wheel:205析構(gòu)Wheel:206析構(gòu)Wheel:207析構(gòu)Wheel:208析構(gòu)Motor:102析構(gòu)Car:***********刪除庫(kù)存中沒(méi)有使用的車輪***********析構(gòu)Wheel:210

擴(kuò)展:編寫(xiě)一些程序來(lái)專門(mén)管理內(nèi)存中的對(duì)象練習(xí)調(diào)試通過(guò)例3.6的代碼參照書(shū)中的思路,按照自己的理解重做例3.10總結(jié)及進(jìn)一步學(xué)習(xí)分析:使用組合關(guān)聯(lián)和聚合關(guān)聯(lián)描述事物的構(gòu)成設(shè)計(jì):使用關(guān)聯(lián)、連接等UML工具表示類及對(duì)象的內(nèi)部關(guān)系編碼:選用對(duì)象或指針(存儲(chǔ))實(shí)現(xiàn)組合關(guān)聯(lián)及其連接,使用代碼(邏輯)實(shí)現(xiàn)聚合關(guān)聯(lián)3.4深入理解類及其對(duì)象(映射關(guān)系)3.5字符串進(jìn)一步學(xué)習(xí)第3章關(guān)聯(lián)與連接3.2關(guān)聯(lián)的實(shí)現(xiàn)第3章關(guān)聯(lián)與連接3.4深入理解類及其對(duì)象3.5字符串學(xué)習(xí)目標(biāo)能夠運(yùn)用映射等知識(shí)解釋類及其對(duì)象的本質(zhì)能夠運(yùn)用組合關(guān)聯(lián)等知識(shí)解釋字符串的數(shù)據(jù)結(jié)構(gòu)能夠使用類、組合關(guān)聯(lián)等UML工具封裝字符串能夠使用C++代碼自定義字符串3.4深入理解類及其對(duì)象(映射關(guān)系)Students1(210101,"Randy",3.5)3.4深入理解類及其對(duì)象(映射)Students1(210101,"Randy",3.5)3.5字符串3.5.1數(shù)組中的概念及其關(guān)系3.5.2字符數(shù)組的語(yǔ)義3.5.3自定義字符串類myString3.5.1數(shù)組中的概念及其關(guān)系數(shù)組名數(shù)組元素元素類型內(nèi)存結(jié)構(gòu)邏輯結(jié)構(gòu)3.5.2字符數(shù)組的語(yǔ)義語(yǔ)義:面向應(yīng)用vs面向計(jì)算機(jī)實(shí)現(xiàn)方法:數(shù)據(jù)類型存儲(chǔ)字符數(shù)組存儲(chǔ)數(shù)組的指針3.5.2字符數(shù)組的語(yǔ)義動(dòng)態(tài)數(shù)組:存儲(chǔ)數(shù)組的指針3.5.3自定義字符串類myString封裝為類動(dòng)態(tài)數(shù)組【例3.11】字符串類myString//myString.hclass

myString{public: myString(chars[]); ~myString();

voidprint()const;

intgetLen()const;

char*getString()const; myString(const

myString&oldMyString);private:

char*ptrCharArray;

intlen;};//myString.cpp#include

"myString.h"#include

<iostream>using

namespacestd;

myString::myString(char

s[]){ len=strlen(s);

ptrCharArray=new

char[len+1]; strncpy(ptrCharArray,s,len+1); ptrCharArray[len]='\0';}myString::~myString(){

deleteptrCharArray;}void

myString::print()const{ cout<<ptrCharArray<<endl;}int

myString::getLen()const{

returnlen;}const

char*myString::getString()const{

returnptrCharArray;}myString::myString(const

myString&oldMyString){ len=oldMyString.getLen();

ptrCharArray=new

char[len+1]; strncpy(ptrCharArray,oldMyString.getString(),len+1);}【例3.12】類Person中使用類myString//Person.cpp#include

"myString.h"#include

<iostream>using

namespacestd;class

Person{public: Person(){} Person(myStringn):name(n.getString()){}

voidprint(){ cout<<"Person:"; name.print(); } Person(const

Person&oldPerson):name(oldPerson.name){}private:

myStringname;//表示到myString的組合關(guān)聯(lián)};Personfn(Person

p){

return

p;}myStringfn(myStringp){

return

p;}voidmain(){ cout<<"****創(chuàng)建myString對(duì)象****"<<endl;

myStrings1("張三"); s1.print();

myStrings2(s1); s2.print();

cout<<endl<<"****傳遞*myString對(duì)象****"<<endl;

fn(s1).print();

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

Personp1("李四"); p1.print();

Personp2(s1); p2.print();

cout<<endl<<"****傳遞*Person對(duì)象****"<<endl; fn(p1).print();

cout<<endl<<"***堆中創(chuàng)建*Person對(duì)象****"<<endl;

Person*p3=new

Person("王五"); p3->print();

cout<<"****main語(yǔ)句結(jié)束****"<<endl;}練習(xí)調(diào)試通過(guò)例3.11和3.12的代碼使用動(dòng)態(tài)數(shù)組存儲(chǔ)一個(gè)人的姓名,類Person的對(duì)象負(fù)責(zé)管理其中存儲(chǔ)的姓名,并編程實(shí)現(xiàn)??偨Y(jié)及進(jìn)一步學(xué)習(xí)分析:運(yùn)用組合關(guān)聯(lián)等知識(shí)抽象封裝字符串設(shè)計(jì):使用組合關(guān)聯(lián)及連接等UML工具描述類myString的內(nèi)部結(jié)構(gòu)編碼:使用C++編碼實(shí)現(xiàn)字符串3.6鏈表進(jìn)一步學(xué)習(xí)第3章關(guān)聯(lián)與連接3.2關(guān)聯(lián)的實(shí)現(xiàn)第3章關(guān)聯(lián)與連接3.6應(yīng)用舉例:鏈表3.5字符串學(xué)習(xí)目標(biāo)能夠運(yùn)用關(guān)聯(lián)等知識(shí)解釋鏈表的數(shù)據(jù)結(jié)構(gòu)能夠使用關(guān)聯(lián)、連接等UML工具描述鏈表的數(shù)據(jù)結(jié)構(gòu)能夠解釋封裝鏈表的思路及方法能夠使用C++編碼實(shí)現(xiàn)鏈表3.6應(yīng)用舉例:鏈表【例3.13】使用鏈表管理學(xué)生#include

"myString.h"#include

"Student.h"

#i

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論