可视化编程技术2课件_第1页
可视化编程技术2课件_第2页
可视化编程技术2课件_第3页
可视化编程技术2课件_第4页
可视化编程技术2课件_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

C++基础

C++面向对象程序设计基础3.1.2面向对象程序设计方法及特征什么是对象:现实世界是由各种各样的事物组成,包括真实的事物和抽象的事物。例如,人、动物、汽车(真实的事物)和程序、直线(抽象的事物)等。每一类事物都有自己特定的属性(如大小、形状、重量等)和行为(如生长、行走、转弯、运算等),人们通过研究事物的属性和行为而认识事物。在计算机科学中将这些现实世界中的事物称之为对象。对象是包含现实世界中事物特征的抽象实体,它反映了系统为之保存信息和与之交互的方法。在程序设计领域,可以用如下公式表示:

对象=数据+作用于这些数据上的操作什么是类:为了描述属性和行为相同的一类对象,引入了类(class)的概念。类是具有相同数据结构(属性)和相同操作功能(行为)的对象的集合,它规定了这些对象的公共属性和行为方法。对象是类的一个实例,例如,汽车是一个类,而行驶在公路上的一辆汽车则是一个对象。对象和类的关系相当于程序设计语言中变量和变量类型的关系。main(){TimeEndTime; //声明对象EndTime//设置对象EndTime的时间(属性,数据成员)EndTime.setTime(12,23,36); cout<<"Thetimeis:";//显示对象EndTime的时间EndTime.showTime();}运行结果:Thetimeis:12:23:36面向对象程序设计方法的基本特征面向对象程序设计方法具有四个基本特征:抽象封装继承多态性1.抽象

抽象是人类认识问题的最基本手段之一。抽象是指对具体问题(对象)进行概括,抽出一类对象的公共属性和行为并加以描述的过程。抽象包括数据抽象和代码抽象(或行为抽象)。2.封装封装是把每个对象的数据(属性)和操作(行为)包装在一个类中。一旦定义了对象的属性和行为,则必须决定哪些属性和行为只用于表示内部状态,哪些属性和行为在外部是可见的。一般限制直接访问对象的属性,而应通过操作接口访问,这样使程序中模块之间关系更简单、数据更安全。对程序的修改也仅限于类的内部,使得由于修改程序所带来的影响局部化。4.多态性多态性是指类中具有相似功能的不同函数使用同一个名称来实现,并允许不同类的对象对同一消息作出的响应不相同。例如,同样的“编辑|粘贴”操作,在字处理程序和绘图程序中有不同的结果;同样的加法,把两个时间值相加和把两个整数相加的要求肯定不同。多态性使程序设计灵活、抽象,具有行为共享和代码共享的优点,很好地解决了程序的函数同名问题。3.2C++类为了支持面向对象程序设计,C++在C语言结构(struct)数据类型的基础上引入了类这种抽象数据类型。C++面向对象编程实质上就是面向类编程,只有定义和实现了类,才能声明属于这个类的对象,才能通过对象使用定义的成员。传统C程序员把编程重点放在函数的编写上,而C++程序员把重点放在类的定义和实现上。3.2.1类的定义与实现C++类将对象的属性抽象为数据成员,将对象的行为抽象为成员函数,并对它们进行封装。数据成员又称成员变量,成员函数又称为方法。C++类在形式上类似于C语言中用户自定义的结构类型,但定义类时规定了成员的访问控制权限。对象只能访问所属类的公有成员,而类的私有成员只能在类的成员函数中被访问。说明:类的定义由关键字class开始,其后为用户定义的类名,花括号括起来的部分称为类体。关键字private、public和protected称为访问权限控制符,用来设置数据成员和成员函数的访问属性,其默认值为private。private属性表示数据成员和成员函数是类的私有成员,它们只允许被本类的成员函数访问或调用,数据成员一般定义为private属性;public属性表示数据成员和成员函数是类的公有成员,它们允许被本类或其它类的成员函数(通过对象)访问或调用,是类的外部接口,成员函数一般定义为public属性;protected属性表示数据成员和成员函数是类的保护成员,它们允许被本类的成员函数和派生类的成员函数访问或调用。例定义类Time(表示时间)。classTime{private: //最好不要省略privateinthour; //数据成员,表示小时intminute; //数据成员,表示分钟intsecond; //数据成员,表示秒public:voidsetTime(int,int,int);//成员函数,设置时间voidshowTime(); //成员函数,输出时间};例类Time的实现。voidTime::setTime(inth,intm,ints){ hour=(h>=0&&h<24)?h:0; //设置时间 minute=(m>=0&&m<60)?m:0; second=(s>=0&&s<60)?s:0;}voidTime::showTime(){ cout<<hour<<':'<<minute<<':'<<second<<endl; }利用类声明对象:对象是类的一个实例,定义并实现了类,就可以利用定义好的类来声明对象,即创建对象。声明对象的形式与声明普通变量类似,例如: Timet1,start; Time*pt1=&t1成员的访问:声明对象后,就可以通过成员运算符“.”或指向运算符“->”访问对象的公有成员,但不能访问对象的私有成员。例如,公有成员函数调用: t1.setTime(); start.showTime(); pt1->setTime();而任何形如t1.hour、t1.minute、start.second等私有成员变量的直接访问都是非法的。例类Time的使用,声明对象并设置对象属性。main(){TimeEndTime; //声明对象EndTimeEndTime.setTime(12,23,36); //设置对象EndTime的时间cout<<"Thetimeis:";EndTime.showTime(); //显示对象EndTime的时间}3.2.2构造函数和析构函数在定义类时不能对成员变量进行初始化,因为无法确定成员变量属于哪一个对象。成员变量一般都定义为私有属性,也不能在声明对象后利用赋值运算对成员变量进行初始化。成员变量的初始化一般是利用一个名为构造函数的成员函数来完成。什么是构造函数:构造函数是一种特殊的成员函数,它是在创建对象时(声明或new动态创建)系统自动调用的成员函数。什么是析构函数:析构函数也是一种特殊的成员函数,它是在对象生存期结束时系统自动调用的成员函数。构造函数的名称与类名相同,析构函数的名称必须在类名前加上“~”符号。注意,构造函数和析构函数不能指定任何返回值类型,包括void返回类型。3.3.1基类和派生类

1.问题的提出

在现实世界中,一类事物的对象常常也属于另一类事物。在面向对象程序设计方法中,一个类的对象也常常是另一个类的对象,即一个类具有了另一个类的属性和方法。在定义一个类时,根据类的继承性,我们能够且应尽可能地利用现有的类来定制新的类,而不必重新设计新的类。2.基类和派生类的概念在继承关系中,新定义的类称为被继承类的派生类或子类,而被继承的类称为新定义类的基类或父类。派生类继承了基类的所有成员。一个派生类也可以作为另一个派生类的基类。3.派生类的定义

class<派生类名>:[<派生方式>]<基类名>{...//派生类新增加的成员声明列表};例定义类Point,然后定义类Point的派生类Circle。#include<iostream.h>classPoint //定义基类,表示点{private:intx;inty;public:voidsetPoint(inta,intb){x=a;y=b;};//设置坐标intgetX(){returnx;}; //取得X坐标intgetY(){returny;}; //取得Y坐标};classCircle:publicPoint//定义派生类,表示圆{private:intradius;public:voidsetRadius(intr){radius=r;};//设置半径intgetRadius(){returnradius;};//取得半径intgetUpperLeftX(){returngetX()-radius;}; //取得外接正方形左上角的X坐标intgetUpperLeftY(){returngetY()+radius;}; //取得外接正方形左上角的Y坐标};main(){Circlec;c.setPoint(200,250); c.setRadius(100);cout<<"X="<<c.getX()<<",Y="<<c.getY() <<",Radius="<<c.getRadius()<<endl;cout<<"UpperLeftX="<<c.getUpperLeftX() <<",UpperLeftY="<<c.getUpperLeftY()<<endl;}程序运行结果:

X=200,Y=250,Radius=100

UpperLeftX=100,UpperLeftY=350说明:

派生类Circle通过public派生方式继承了基类Point的所有成员(除私有成员外所有成员的访问权限不变),同时还定义了自己的成员变量和成员函数。若将类Circle的派生方式改为private或protected,则下述语句是非法的:c.setPoint(200,250);无论哪种派生方式,派生类都继承了基类的所有成员,包括私有成员。我们虽然不能在派生类Circle中直接访问私有数据成员x和y,但可以通过继承的公有成员函数getX()、getY()和setPoint()访问或设置它们。最后一个问题:

利用类继承定义类可能带来一个问题:派生类会继承它不需要的基类中的数据成员和成员函数,这时,基类中不适合于派生类的成员可以在派生类中重新加以定义。例派生类成员函数对基类成员函数的覆盖。#include<iostream.h>classA{public: voidShow(){cout<<"A::Show\n";};};classB:publicA{public:voidShow(){cout<<"B::Show\n";}; //在派生类中重新定义成员函数voidDisplay(){Show();}; //调用派生类B的成员函数Show()};voidmain(){Aa;Bb;

温馨提示

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

评论

0/150

提交评论