




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章类与对象《C++面向对象程序设计导论》--从抽象到编程第1章类与对象1.1抽象第1章类与对象1.2类和对象的概念1.3类的声明和对象的定义本节学习目标能够运用语文知识解释类和对象及其抽象(概念思维)能够运用数学和计算机知识解释类和对象(计算思维)能够使用C++声明类、定义对象、访问属性1.1.1语文中的抽象抽象有概念、判断、推理等思维形式,语文中一般使用词语或语句来记录(或表示)抽象的过程。如:张三是一个人概念:人,电脑,手机判断:张三是一个人推理:张三不是电脑抽象:从客观世界到符号世界的映射概念思维1.1.1语文中的抽象语义:从符号世界到客观世界的映射概念:人,电脑,手机判断:张三是一个人推理:张三不是电脑文字的语义?读书:读文字还是其语义?1.1.2数学中的抽象数学中一般将客观世界中的事物抽象为数在第6章中讨论。自然数的理论主要有基数理论和皮亚诺公理,它们从不同角度回答了“自然数及其运算是什么?”这个基本问题。例如,“8是一个自然数”,其中,“自然数”是一个概念,代表一个集合,“8”是自然数这个集合中的一个元素。计算思维1.2类和对象的概念1.2.1属性与属性值1.2.2行为与函数1.2.3类的结构及其表示方法1.2.4对象的结构及其表示方法1.2.1属性与属性值数据类型形容词等词语属性值1.2.2行为与函数函数对象中为什么没有函数?一般用动词表示行为1.2.3-4类和对象的表示方法来源于中文、数学以及计算机语言1.3类的声明和对象的定义classPerson//人{public: voideat(charobj[]){};//吃(东西) voidsleep(void){}; //睡觉()
public: charname[20];//姓名 boolsex; //性别 intage; //年龄 floatheight; //身高 floatweight;//体重};1.3.1类的声明1.3.2定义对象Personp1;//全局对象voidmain(){ //设置张三("张三",1,18,180.5,65.3)的属性 strncpy(,"张三",sizeof()); p1.sex=1;//男 p1.age=18; p1.height=180.5; p1.weight=65.3;
//定义类Person的对象p2,并设置属性值
Personp2;//李四("李四",0,16,165,46.5) strncpy(,"李四",sizeof()); p2.sex=0;//女 p2.age=16; p2.height=165; p2.weight=46.5;}1.3.3访问对象的成员变量 strncpy(,"张三",sizeof()); p1.sex=1;//男 p1.age=18; p1.height=180.5; p1.weight=65.3;.成员选择(对象)Memberselection(object)从左到右exp.xx计算exp得到对象ob,得到ob的成员xx–>成员选择(指针)Memberselection(pointer)从左到右exp->xx计算exp得到指到成员变量的指针p,得到指针p指向的成员变量的成员xx练习读懂这几张图的语义VS2013上编辑调试【例1.1】中的代码总结及进一步学习思维:语文的概念抽象,数学中的数学抽象设计:类和对象的概念以及表达方法编码:使用C++声明类、定义对象,访问成员变量1.4成员函数的定义和调用进一步学习第1章类与对象1.4.1定义成员函数1.4成员函数的定义和调用1.4.2调用成员函数1.4.3成员函数与普通函数的区别1.4.4成员函数调用的内部实现学习目标能够运用数学知识解释成员函数能够运用计算机知识解释成员函数的内部实现原理能够使用C++定义和调用成员函数1.4.1定义成员函数将类中声明或定义的函数称为类的成员函数。定义成员函数的方法与定义函数非常类似。按照定义函数的方法来定义类的成员函数,并在成员函数中直接使用类的属性名访问属性的值。【例1.2】定义和调用成员函数classPerson//人{public:
voidsetValue(charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"我知道怎么设置人的属性,我已完成!"<<endl; strncpy(name,nameV,sizeof(name));//姓名
sex=sexV;//性别 age=ageV;//年龄 height=heightV;//身高 weight=weightV;//体重 } voidprint(){ cout<<"我是一个人,我的属性值为:"<<name<<"," <<sex<<"," <<age<<"," <<height<<"," <<weight<<endl; } voideat(charobj[]){//吃(东西) cout<<"我是一个人"<<name<<",但我还没有学会怎么吃:"<<obj<<endl; }; voidsleep(void){//睡觉() cout<<"我是一个人"<<name<<",我会睡觉,但还说不清楚是怎么睡觉的。"<<endl; }
public: charname[20];//姓名
boolsex; //性别 intage; //年龄 floatheight; //身高 floatweight;//体重};1.4.2调用成员函数Personp1;//张三
voidmain(){
//设置张三("张三",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();}对象名.成员函数名(实参列表)调用成员函数的执行过程Personp1;//张三
voidmain(){ //设置张三("张三",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();}跟踪调试代码,理解调用成员函数的执行过程对象名.成员函数名(实参列表)1.4.3成员函数与普通函数的区别Personp1;//张三
voidsetValue(Person*p, charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"我知道怎么设置人的属性,我已完成!"<<endl; strncpy(p->name,nameV,sizeof(p->name));//姓名
p->sex=sexV;//性别 p->age=ageV;//年龄 p->height=heightV;//身高 p->weight=weightV;//体重}
voidmain(){ //设置张三("张三",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);功能相同但函数原型不同,调用语句不同1.4.4成员函数调用的内部实现classPerson//人{public:
voidsetValue(charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"我知道怎么设置人的属性,我已完成!"<<endl; strncpy(name,nameV,sizeof(name));//姓名 sex=sexV;//性别 age=ageV;//年龄 height=heightV;//身高 weight=weightV;//体重 }};按照下面代码的语义编译setValue()成员函数voidsetValue(Person*this,charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"我知道怎么设置人的属性,我已完成!"<<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)按照下面代码的语义编译成员函数调用setValue(&p1,"张三",1,18,180.5,65.3);this练习读懂这几张图的语义VS2013上编辑调试【例1.2】中的代码总结及进一步学习设计:成员函数的概念、作用和表述方法编码:使用C++定义和调用成员函数调试:编译成员函数的原理和内部实现机制1.5创建和删除对象进一步学习第1章类与对象1.5.1构造对象1.5创建和删除对象1.5.2全局对象和静态对象1.5.3堆对象和对象数组1.5.4语义的实现和优化学习目标能够理解创建和删除对象的原理,理解构造函数和析构函数的概念和作用能够使用C++定义构造函数和析构函数,并创建和删除对象能够理解创建和删除对象的内部实现机制,并使用时序图描述对象的创建和删除过程1.5.1构造对象在计算机中创建一个对象时,应该同时指明这个对象代表的是哪个客观事物,这就要求在定义一个对象时设置对象的属性值。构造函数(Constructor)是特殊成员函数,用于初始化对象。Person(charnameV[],boolsexV,intageV,floatheightV,floatweightV)析构函数(Destructor)是特殊成员函数,用于处理一些善后工作。创建一个对象p1,语句为:Personp1("张三",0,18,180.5,65.3)语义为:①为对象p1分配内存;②按照p1.Person("张三",0,18,180.5,65.3)的语义调用构造函数,作用是给对象p1的成员变量赋初值。【例1.4】自动调用构造函数classPerson//人{public:
Person(charnameV[],boolsexV,intageV,floatheightV,floatweightV){ cout<<"构造:我知道怎么设置人的属性,我已完成!"<<endl; strncpy(name,nameV,sizeof(name));//姓名 sex=sexV;//性别 age=ageV;//年龄 height=heightV;//身高 weight=weightV;//体重 }
~Person()
{ cout<<"析构:"<<name<<endl; } …….};Personp1("张三",0,18,180.5,65.3);//张三
voidmain(){ p1.print();
cout<<endl; Personp2("李四",1,16,165,46.5);//李四 p2.print();}【例1.4】自动调用构造函数Personp1("张三",0,18,180.5,65.3);//张三
voidmain(){ p1.print();
cout<<endl; Personp2("李四",1,16,165,46.5);//李四 p2.print();}描述对象的创建过程创建对象作为一个整体(简洁)创建对象中的两个步骤(详细)选择适合的描述粒度1.5.2全局对象和静态对象#include
<iostream>using
namespacestd;
class
Point{public: Point(double
dx,double
dy){ cout<<"调用Point("<<dx<<","<<dy<<")"<<endl; x=dx; y=dy; } ~Point(){ cout<<"析构Point("<<x<<","<<y<<")"<<endl; }private:
doublex;
doubley;};【例1.5】全局对象、静态对象和局部对象1.5.2全局对象和静态对象Pointg(0,0); //全局对象voidfn(){
static
Pointsf(1,1);//静态对象
Pointf(2,2); //局部对象}intmain(){
cout<<endl<<"第一次调用fn()函数"<<endl; fn();
cout<<endl<<"第二次调用fn()函数"<<endl; fn();
cout<<endl<<"退出main()函数"<<endl;}1.5.3堆对象和对象数组intmain(){ cout<<endl<<"创建对象"<<endl;
Point*ph=new
Point(3,3);
cout<<endl<<"创建对象数组"<<endl;
PointmA[3];//局部对象数组
Point*phA=new
Point[5];
cout<<endl<<"释放堆对象"<<endl;
delete[]phA; //释放堆中对象数组
deleteph;
//释放堆对象}1.5.4语义的实现和优化正确理解每条代码的语义是读懂程序的基础,也是编写代码的前提。计算机世界中的语义(数学)Pointg(0,0); //全局对象voidfn(){
static
Pointsf(1,1);//静态对象
Pointf(2,2); //局部对象}intmain(){
cout<<endl<<"第一次调用fn()函数"<<endl; fn();
cout<<endl<<"第二次调用fn()函数"<<endl; fn();
cout<<endl<<"退出main()函数"<<endl;}计算机世界客观世界中语义(语文)练习读懂这几张图的语义VS2013上编辑调试【例1.5】中的代码总结及进一步学习设计:构造函数和析构函数的概念、作用和表述方法编码:定义构造函数和析构函数,定义并初始化对象调试:创建和删除对象的原理和内部实现机制1.6程序设计思想和描述工具进一步学习第1章类与对象1.6.1程序设计思想的变迁1.6程序设计思想和描述工具1.6.2UML图形语言1.6.3面向对象程序设计言语学习目标能够使用类图描述类及其属性和行为的抽象过程能够使用对象图描述对象及其属性值的抽象过程学会一种建模软件的使用(PowerDesigner15.3)1.6.1程序设计思想的变迁1.结构化程序设计思想2.面向对象程序设计思想程序=数据结构+算法程序=对象(数据结构+算法)+对象….程序设计导论:从计算到编程程序设计导论:从抽象到编程面向对象程序的结构主要工作是设计和编写类1.6.2UML图形语言统一建模语言(UnifiedModelingLanguage,UML)是国际标准化组织OMG(ObjectManagementGroup)制定的一种图形语言,是目前常用的图形工具,并广泛应用于软件的分析设计。UML中,定义了类图、对象图、时序图、状态图、活动图等一系列的图及图标,并规定图的作用及图标的语义,可用这些图及图标从不同角度、不同层次上描述程序及其运行过程。本书主要使用类图、对象图、时序图描述程序的类、对象和程序运行过程。有关UML的知识,可查阅标准文本或其他资料。图形语言也是一种语言,其根本作用是人与人之间交流,因此,在画UML图时,应专注于表达自己的想法,而不能过度追求图形的美观,应以别人能够理解为度。选择:PowerDesigner15.3PowerDesigner15.3界面学习使用PowerDesigner15.3首选PD帮助文档PD使用知识学习专业英语网上学习资料UML知识软件建模方法UML标准文本深入学习自学演示:使用PD进行分析设计分析应用场景中事物抽象类及属性和行为增加计算机特性描述类的对象练习分析应用场景中事物抽象类及属性和行为增加计算机特性描述类的对象自主练习多练习,绘制教材中的图总结及进一步学习分析:使用PD记录类和对象的中间抽象结果设计:使用PD描述类和对象编码:使用PD描述编码所需的关键因素1.6.3面向对象程序设计言语(VisualStudio2013)进一步学习第1章类与对象1.6.1程序设计思想的变迁1.6程序设计思想和描述工具1.6.2UML图形语言1.6.3面向对象程序设计语言学习目标学会一种计算机语言(C++)和集成开发环境
VisualStudio2013能够在VS2013中编辑代码、编译连接、跟踪调试能够使用时序图描述程序的执行过程能够使用对象图描述对象及其属性值1.6.3面向对象程序设计言语选择:C++语言,VisualStudio2013面向对象程序设计言语C++JAVAC#......功能大同小异描述能力也没有本质上的区别怎样描述类怎样描述类的属性怎样描述实现成员函数的算法编程方法面向对象思想面向对象设计的基本思路理解分析设计的成果物面向对象程序设计言编程的基本方法学习使用VisualStudio2013编辑代码学习语法学习编码规范编译连接跟踪调试理解代码的语义管理程序代码多练习查阅VisualStudio2013帮助文档首选MSDN帮助文档学习C++语言知识学习专业英语网上学习资料编程知识C++标准文本深入学习学会查阅资料演示:使用VS2013编码调试根据类图声明类和定义成员函数根据对象图定义和使用对象跟踪程序的执行过程,观察内存中的对象使用时序图描述成员函数的调用过程和对象的创建过程练习根据类图声明类和定义成员函数根据对象图定义和使用对象跟踪程序的执行过程,观察内存中的对象使用时序图描述成员函数的调用过程和对象的创建过程VS2013上编辑调试【例1.5】中的代码本节总结及进一步学习设计:PD中使用时序图、对象图描述描述程序执行过程及其创建的对象编码:VS2013中使用C++编辑代码调试:VS2013中编译连接、跟踪调试代码第2章封装与职责进一步学习THANKS《C++面向对象程序设计导论:从抽象到编程》第1章类的封装《C++面向对象程序设计导论》--从抽象到编程第2章封装与职责2.1.1事物的边界2.1类的封装2.1.2封装的概念2.1.4接口与实现分离2.1.3接口的声明本节学习目标能够运用语文、数学知识解释如何抽象事物的边界能够运用事物的边界解释封装、接口的概念能够使用C++声明接口能够使用多源文件结构声明类的接口并实现2.1.1事物的边界边界的划分:物VS事边界?边界的作用:区分内外、事物?边界的抽象:语文VS数学?事物的边界是指一个事物与其它事物的界限从身体、知识和能力三个侧面来划分人的边界事物的属性和行为能够反映事物的边界2.1.2封装的概念封装类的基本原理是从不同的侧面划分事物的边界,并使用属性和行为来反映划分出的边界。一般将类的属性和行为称为该类的边界。classPerson//人{public: voideat(charobj[]){};//吃(东西) voidsleep(void){}; //睡觉()
public: charname[20];//姓名 boolsex; //性别 intage; //年龄 floatheight; //身高 floatweight;//体重};边界:属性和行为内部:属性值和函数体封装是指从客观世界中抽象出类的过程。顾名思义,通过属性和行为将一个事物“包装”起来,并通过这些属性和行为反映这个事物的内部事物。2.1.3接口的声明接口(Interface):内部事物与外部事物进行交互的这部分边界可见性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;//体重}编译器通过限制选择成员运算(.或->)来实现成员的可见性2.1.4接口与实现分离使用多源文件结构,将类的声明代码与成员函数的实现代码分离到不同源文件Person.h使用多源文件结构,将类的声明代码与实现代码分离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<<"我知道怎么设置人的属性,我已完成!"<<endl; strncpy(name,nameV,sizeof(name));//姓名
sex=sexV;//性别
age=ageV;//年龄
height=heightV;//身高
weight=weightV;//体重}Person::~Person() {
cout<<"析构:"<<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中编辑、跟踪调试例2.2中的代码,并使用PD描述类Person和程序的执行过程总结及进一步学习2.2封装的作用进一步学习思维:事物的边界,类的封装和接口设计:如何抽象事物的边界,如何封装类编码:使用C++(多源文件结构)声明类及其接口第2章封装与职责2.2.1保护内部数据2.2封装的作用2.2.2屏蔽内部计算学习目标能够运用类的封装和接口等知识解释如何保护内部能够运用数学、计算机知识解释如何屏蔽内部计算能够解释接口的作用2.2.1保护内部数据从计算的角度,封装主要有保护内部数据和屏蔽内部计算两个作用。保护内部数据指不能从对象的外部直接访问对象中的数据,只能通过接口中的成员函数间接访问2.2.1保护内部数据//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函数中访问对象p的成员变量,即保护对象p中的数据2.2.2屏蔽内部计算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);}两个类中,计算方法不同导致成员函数的函数体不同两个类的接口相同,无论使用哪个类都不需要修改main函数中的代码练习1.编写类Point的代码,并调试通过。2.将直角坐标改为极坐标,并编码实现总结及进一步学习设计:使用类的接口保护对象的内部数据、屏蔽内部计算编码:保持接口不变的情况下,编写不同的实现代码2.3对象的职责进一步学习第2章封装与职责2.3.1管理自己的数据2.3对象的职责2.3.2完成特定的任务2.3.4与其它对象共存的能力2.3.3参与计算的能力学习目标能够运用结构化程序设计知识解释对象的职责和能力能够运用封装和接口等概念解释如何赋予对象的职责能够使用拷贝构造函数提高对象的自我管理能力2.3.1管理自己的数据封装一个类时,应从基本职责和基本能力两个方面给对象赋予职责和能力,并以职责为导向评价属性和行为的完备性和合理性。一个对象应承担两个基本职责,为了完成这两个基本职责,还应具备两个基本能力。inta=1,c;int*pa=&a;c=a;Personinit;Persona=init,c;Person*pa=&a;c=a;像数据类型一样使用类,像变量一样使用对象两个基本职责:第一、管理自己的数据,以反映客观事物第二、完成特定的任务,承担客观事物的职责。两个基本能力:第一、参与计算的能力第二、与其他对象共存与协作的能力。1.使用对象创建对象Point::Point(const
Point&oldPoint){ cout<<"调用拷贝构造函数Point(constPoint&)"<<endl;
memcpy(this,&oldPoint,sizeof(Point)); cout<<"新创建点("<<this->x<<","<<this->y<<")"<<endl;};voidmain(){ cout<<"创建点a(1.2,2.3)"<<endl;
Pointa(1.2,2.3); cout<<endl<<"创建点b,并通过a初始化"<<endl;
Pointb=a;//等价于Pointb(a)}拷贝构造函数Point(const
Point&
oldPoint)2.使用字符数组创建对象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完成特定的任务boolTdate::isLeapYear(){ return(year%4==0&&year%100!=0)||(year%400==0);}日期相关的运算:加减运算等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<<"创建对象d"<<endl;
Tdated(1,1,2000);
cout<<"地址:"<<&d<<",值:"<<endl;
cout<<endl<<"创建对象dd"<<endl;
Tdatedd;
cout<<"地址:"<<&dd<<",值:"<<endl;
cout<<endl<<"将对象d赋值给对象dd"<<endl; dd=d; //将一个对象赋值给另一个对象
cout<<"地址:"<<&dd<<",值:";
dd.print();
cout<<endl<<"对象作为参数传递"<<endl;
fAddress(&d);
cout<<endl; f(d);
cout<<endl;
fRef(d);}计算能力:对象在函数之间正确传递2.3.4与其它对象共存的能力#include"Desk"#include"Stool"voidfn(){ Deskda(10,5,5,5);//创建Desk的对象da Stoolsa(6,3,3,3);//创建Stool的对象sa}voidmain(){ fn();}对象在内存中相互独立函数调用也相互独立练习编写调试例2.7的代码,说明对象的职责和能力观察Tdate对象在函数参数传递的过程总结及进一步学习设计:赋予对象的职责,提高对象的能力编码:使用拷贝构造函数提升对象的能力2.4自定义数据类型Tdate进一步学习第2章封装与职责2.4.1定义数据类型Tdate2.4.2Tdate的对象作为成员对象2.4自定义数据类型学习目标能够以职责和能力为导向封装数据类型能够运用拷贝构造函数解释函数调用中如何传递和返回对象能够运用构造函数解释如何创建成员对象能够使用C++自定义数据类型2.4.1定义数据类型Tdate数据类型是面向计算的,需要赋予其对象参与计算能力使用拷贝构造函数赋予对象参与计算能力Tdate::Tdate(constTdate&oldTdate){ cout<<"拷贝构造:"<<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<<"****创建d1(1,2,2000)****"<<endl; Tdated1(1,2,2000); cout<<endl<<"****t创建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语句结束****"<<endl;}使用构造函数初始化对象Tdatefadd(Tdated11,intad){ returnd11.add(ad);}Tdatefn(Tdated){//fn(d2)时按照Tdated(d2)的语义传递对象
returnd;//按照Tdate(d)的语义返回无名对象}voidmain(){ cout<<"****创建d1(1,2,2000)****"<<endl; Tdated1(1,2,2000); cout<<endl<<"****t创建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语句结束****"<<endl;}1.函数调用中传递对象和返回对象#include"Tdate.h"#include<iostream>usingnamespacestd;Tdatefadd(Tdated11,intad){ returnd11.add(ad);}Tdatefn(Tdated){//fn(d2)时按照Tdated(d2)的语义传递对象
returnd;//按照Tdate(d)的语义返回无名对象}voidmain(){ cout<<"****创建d1(1,2,2000)****"<<endl; Tdated1(1,2,2000); cout<<endl<<"****t创建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语句结束****"<<endl;}请画出fadd(d2,3).print()计算顺序图2.函数调用中的传值方式classPerson{public: Person(){}; Person(Tdated):birthday(d){}; ~Person(){}; voidprint(){ cout<<"Person:"; birthday.print(); };private:
Tdatebirthday;//类Tdate作为数据类型};2.4.2Tdate的对象作为成员对象创建Person对象时要创建Tdate对象Personfn(Personp){ returnp;}Person*fnPtr(Person*p){ returnp;}voidmain(){ Tdated1(1,2,2000); Tdated2(1,2,2021); cout<<"****Person对象****"<<endl; Personp1(d1); Personp2=d2;//正确,但语义不明确
cout<<"****传递*Person对象****"<<endl; fn(p1).print(); fnPtr(&p2)->print(); cout<<"****匹配参数中进行数据类型转换****"<<endl; fn(d1).print();//等价于fn(Person(d1)).print() cout<<"****main语句结束****"<<endl;}按照Tdatebirthday(d1)的语义创建成员对象p1.birthday请画出p1、p2的内存图2.4.2Tdate的对象作为成员对象练习编写调试例2.11的代码解释Tdate对象在函数参数传递的过程总结及进一步学习设计:如何以职责和能力为导向封装数据类型编码:使用C++自定义数据类型Tdate调试:如何创建成员对象,函数调用中如何传递返回对象2.5应用举例:员工信息管理进一步学习第2章封装与职责2.5.1分析设计2.5.2编码实现2.5应用举例:员工信息管理学习目标能够阐述分析设计和编码实现的任务和分工能够综合运用前面所学知识开发实际应用软件(一类事物)1.发现类及其属性2.5.1分析设计2.根据类的职责设计成员函数3.增加程序设计语言细节根据依赖关系依次编写代码(相反)1.编码2.5.2编码实现2.编译连接重做实验:员工信息管理3.运行调试练习2.5.1分析设计发现类及其属性根据类的职责设计成员函数增加程序设计语言细节2.5.2编码实现编码编译连接运行调试重做实验:员工信息管理本节总结及进一步学习分析设计:如何以职责和能力为导向设计类编码实现:使用C++编程实现设计的类第3章关联与连接进一步学习THANKS《C++面向对象程序设计导论:从抽象到编程》第2章关联和连接及其实现《C++面向对象程序设计导论》--从抽象到编程第3章关联与连接3.1关联与连接的概念3.2关联的实现第3章关联与连接本节学习目标能够运用语文知识和数学知识解释关联和连接及其表述能够运用关联和连接描述事物之间的关系能够使用指针实现关联及其连接能够运用集合论解释关联和连接的实现方法连接(Link)是对客观事物之间的一个关系的抽象,是一个关系在计算机世界中的反映关联(Association)是对连接的抽象,是一种关系在计算机世界中的反映。关联和连接是面向对象思想中的两个基本概念3.1关联与连接的概念语文中,使用陈述语句描述客观事物及其相互关系,陈述语句主要采用“主动宾”格式数学中,使用元素之间的对应关系来描述客观事物及其相互关系3.1关联与连接的概念(表示)3.2.1使用指针实现多对一关联3.2.2使用指针数组实现多对多关联数学中,对应关系有一对一、多对一和多对多三种类型3.2关联的实现导航(Navigation)角色(Role)重数(Multiplicity)一个人喜欢一种体育运动一种体育运动可被多个人喜欢使用工具有助于发现解决问题的关键因素3.2.1使用指针实现多对一关联使用指针Sport*sport实现多对一关联like编码实现#include
"Sport.h"class
Person{public: Person(); Person(char*pName); ~Person();
boollike(Sport*likeSport); Sport*likedSport();
voidprint();
private:
charname[20];
Sport*sport;//指向最喜欢的运动};【例3.1】使用成员指针表示多对一关联中的连接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】使用成员指针表示多对一关联中的连接#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】维护多对一关联中的连接#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】维护多对一关联中的连接#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】维护多对一关联中的连接//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项运动};3.2.2使用指针数组实现多对多关联一个人喜欢0到3种体育运动//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;//设置为空,表示没有指向对象}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;//超过3项返回错误 }}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);//超过3项不存储 p1.print();
Personp2("李四"); p2.like(&s4); p2.like(&s3); p2.like(&s2); p2.like(&s1);//超过3项不存储 p2.print();}【例3.4】维护多对多关联中的连接张三喜欢足球篮球乒乓球李四喜欢跳高乒乓球篮球请使用时序图描述程序运行过程。例3.4程序的输出结果练习调试通过例3.4的代码按照下面的语义重做分析设计和编码实现一个人喜欢0到5种体育运动总结及进一步学习分析:使用关联和连接抽象事物之间的关系设计:使用关联、连接等UML工具描述类及对象之间的关系编码:使用指针编程实现关联及其连接3.3组合与聚合关联进一步学习第3章关联与连接3.3组合与聚合关联3.2关联的实现第3章关联与连接学习目标能够运用组合关联和聚合关联等知识解释事物的内部构成能够使用组合关联、聚合关联等UML工具描述事物的内部关系能够使用对象和指针实现组合关联能够使用代码实现聚合关联关联分为一般关联(Association)、聚合(Aggregation)和组合(Composition)三种3.3组合与聚合关联组合关联:具有相同的生命周期聚合关联:具有不同的生命周期3.3组合与聚合关联3.3.1使用对象实现组合关联3.3.2使用指针实现组合关联3.3.3使用代码实现聚合关联使用对象StudentIDstudentID实现组合关联3.3.1使用对象实现组合关联3.3.1使用对象实现组合关联//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;//表示多对一组合关联中的连接};【例3.5】使用对象表示多对一组合关联的连接//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"<<"调用构造函数StudentID()"<<endl;}StudentID::StudentID(int
id){ cout<<"\t"<<"调用构造函数StudentID("<<id<<")"<<endl;
if(isValid()) value=id;}StudentID::~StudentID(){ cout<<"析构StudentID:"<<value<<endl;}void
StudentID::print(){ cout<<value<<endl;}bool
StudentID::isValid(){
//可增加判断学号是否符合编码规则的代码
return
true;}
【例3.5】使用对象表示多对一组合关联的连接//Student.cpp#include
<iostream>#include
<string.h>#include
"StudentID.h"#include
"Student.h"using
namespacestd;
Student::Student(){ cout<<"调用构造函数Student()"<<endl<<endl;}
Student::Student(int
id):studentID(id)//增加了新的语法{ cout<<"调用构造函数Student("<<id<<")"<<endl<<endl;}
Student::Student(int
id,char*pName):studentID(id){ cout<<"调用构造函数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<<"调用构造函数Student("<<id<<","<<pName <<
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 九年级化学下册 第八单元 金属和金属材料 课题2 金属的化学性质第1课时 金属与氧气、酸的反应教学设计(新版)新人教版
- 6 花儿草儿真美丽 教学设计-2023-2024学年道德与法治一年级下册统编版
- 6 图形与几何(教学设计)-2024-2025学年一年级上册数学北师大版2024
- 2023八年级数学上册 第十四章 整式的乘法与因式分解14.3 因式分解14.3.2 公式法第2课时 利用完全平方公式分解因式教学设计(新版)新人教版
- 《平行与垂直》教学设计-2024-2025学年四年级上册数学人教版
- 2024-2025学年高中英语 Module 6 The Internet and Telecommuniation教学设计2 外研版必修1
- 2024秋九年级化学上册 第四单元 自然界的水 课题4 化学式与化合价第3课时 有关相对分子质量的计算教学设计(新版)新人教版
- 2024-2025学年高三语文上学期第6周《仿用和变换句式(含修辞)》教学设计
- 5 《这些事我来做》 (教学设计)统编版道德与法治四年级上册
- 5 蚕出生了教学设计+教学设计-2024-2025学年科学四年级下册人教鄂教版
- 语C圈洗白标准手册
- 供水管道穿越天然气管道交叉施工方案
- 钢结构防火涂料的施工方案
- 培育壮大健康养老托育家政服务消费
- 三年级上册数学计算能力竞赛
- 国资委风险预警-47页PPT课件
- 冻干讲义(东富龙)
- 中药辐照灭菌技术指导原则Word版
- AAOS膝关节骨关节炎循证医学指南(第二版)
- 高血压危象抢救流程
- B类表(施工单位报审、报验用表)
评论
0/150
提交评论