《C++面向对象程序设计导论》-从抽象到编程 课件 02 封装与职责_第1页
《C++面向对象程序设计导论》-从抽象到编程 课件 02 封装与职责_第2页
《C++面向对象程序设计导论》-从抽象到编程 课件 02 封装与职责_第3页
《C++面向对象程序设计导论》-从抽象到编程 课件 02 封装与职责_第4页
《C++面向对象程序设计导论》-从抽象到编程 课件 02 封装与职责_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类的封装《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){ ret

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论