第 1 讲类和对象.docx
《第 1 讲类和对象.docx》由会员分享,可在线阅读,更多相关《第 1 讲类和对象.docx(30页珍藏版)》请在冰豆网上搜索。
第1讲类和对象
第1讲类和对象---教材第2章
面向对象的方法
必须先研究事物,而后才能研究过程。
必须先知道一个事物是什么,而后才能觉察这个事物中所发生的变化。
《路德维希·费尔巴哈和德国古典文学的终结》
恩格斯
面向对象的思想
⏹面向对象的编程思想力图使对计算机语言中对事物的的描述与现实世界中该事物的本来面目尽可能的一致。
⏹类(class)和对象(object)是面向对象方法的核心概念。
⏹类是对一类事物描述,是抽象的概念上的定义;
⏹对象是实际存在的该类事物的每个个体,因而也称实例(instance)
⏹EverythingisObject:
万事万物皆对象。
面向过程与面向对象程序设计
⏹是一种数学思维或计算机思维方法,与人们认识世界的方法不同。
⏹主要是理解算法的处理思想和过程。
对象1
(1)对象就是我们周围的各种各样的事物。
例如:
衣服、盘子、宠物、朋友、电脑等。
(2)每个对象都有一些状态(属性)。
例如:
衣服:
{颜色,长度,面料…}。
猫:
{名字,情绪,饥饿,}。
(3)有些对象会作出一些行为。
例如:
猫:
{名字,情绪,疲劳,饥饿…
发怒,玩耍,吃食,睡觉…}。
对象2
(4)对象的行为会改变对象的状态。
例如:
玩耍→疲劳=True
睡觉→疲劳=False
吃食→饥饿=False
(5)对象的状态会影响对象的行为。
例如:
if(饥饿==False)→吃食returnfailure
对象3
面向对象的程序设计与我们人类观察客观事物的模式相同:
用类表示客观事物,
用类中的变量表示事物的属性,
用函数表示事物的行为,
属性与行为相互作用。
关于面向对象的基本概念的例子(学生)
1、关于“大学生”的有关说明
(1)描述学生特征的信息(属性):
姓名,学号,专业,年龄,性别
(2)描述行为的信息(函数):
一个学生主要是学习,而学习主要的行为就是:
读;写
对于读,要指明读的什么书,读书所获得的内容是什么?
但这里不能用一具体的书名
对于写,要指明做的什么作业,所完成的具体内容是什么?
但不能用具体的课程名称.
通过以上两方面,就较准确的描述大学生的有关信息,可以说,这种描述使用于所有的大学生,实际上就是说明了一类人员——大学生。
为此,我们可以给出“大学生类”的一个“规范”的描述形式:
classstudents{
private:
stringXM;
intXH;
stringZY;
intNL;
stringXB;
public:
stringread(StringSM);
stringwrite(StringKCMC);
students(Stringx,inty,Stringz,inta,Stringb);
//用于创建一个学生(构造函数)
}
关于面向对象的基本概念的例子(学生)
(3)对于下面的两个问题如何来描述呢?
张三正在读英语;
李四正在做数学作业;
在这里,张三和李四必须是学生,我们用A代表张三,B代表李四(张三和李四的具体信息应清楚:
学号,专业、年龄、性别是什么?
),english代表英语,maths代表数学,那么:
studentsA=students(“张三”,1,”计算机”,17,”男”);
studentsB=students(“李四”,2,”电子”,18,”女”);//构造函数
A.read(“english”);
B.write(“maths”);
A.read(B.write(“maths”));//这句的意义是什么?
名词术语:
类、属性、函数、参数、对象、构造函数
关于面向对象的基本概念的例子(教师)
2、关于“教师”的有关说明
(1)描述教师特征的信息(属性):
姓名,专业,学历,职称、教龄,性别
(2)描述教师行为(动作)的信息(行为):
一个教师主要是教学,而教学主要的行为就是:
授课;批改作业
对于授课,要指明讲什么课程,所讲的内容是什么?
对于批改作业,要指明批改作业谁的作业,批改后的成绩是什么?
通过以上两方面,就较准确的描述教师的有关信息,可以说,这种描述使用于所有的教师,实际上就是说明了一类人员——教师。
为此,我们可以给出“教师类”的一个“规范”的描述形式:
classteachers{
private:
stringXM;
stringZY;
stringXL;
stringZC;
intJL;
stringXB;
public:
teachers(Stringx1,Stringx2,Stringx3,Stringx4,inta,Stringx5);
//用于创建一个教师(构造函数)
stringteach(StringSM);
intreview(studentsST);
}
关于面向对象的基本概念的例子(教师)
(3)对于下面的两个问题如何来描述呢?
张三老师正在讲授”c语言”;
张老师批改学生李四的作业,其成绩是88;
在这里,张老师必须是教师,我们用X代表张老师,Y代表学生李四(张老师和李四的具体信息应清楚),那么:
intCJ;stringT;
teachersX=teachers(“张三”,”计算机”,”研究生”,”教授”,22,”男”);
//调用构造方法
studentsY=students(“李四”,2,”电子”,18,”女”);//调用构造方法
T=X.teach(“c语言”);//这句的意义是什么?
CJ=X.review(Y);//这句的意义是什么?
张三老师批改学生李四所做的数学作业,并给定成绩为90.如何表示呢?
名词术语:
类、属性、函数、参数、对象、构造方法
关于面向对象的基本概念的例子
⏹在程序中所操作的对象是类的一个实例(谁来完成动作);
⏹声明一个对象;
teachersX;//定义一个对象:
表示X老师(张三),
⏹调用方法(一个具体的对象,完成一个具体的行为)
T=X.teach(“JAVA”);
//张三老师教JAVA。
⏹调用对象的方法相当于给对象发送消息,收到消息的对象通过改变自身的状态或者向其它对象发送消息来响应消息。
第一节
(1):
类的声明和对象的定义
类的成员:
成员函数、成员数据
classClock
{
public:
voidSetTime(intNewH,intNewM,intNewS);
voidShowTime();
private:
intHour,Minute,Second;
};
voidClock:
:
SetTime(intNewH,intNewM,intNewS)
{
Hour=NewH;
Minute=NewM;
Second=NewS;
}
voidClock:
:
ShowTime()
{
cout<"<"<}
2访问控制
●类成员访问控制表
3.成员函数的实现
内联成员函数
⏹为了提高运行时的效率,对于较简单的函数可以声明为内联形式。
⏹内联函数体中不要有复杂结构(如循环语句和switch语句)。
⏹在类中声明内联成员函数的方式:
⏹将函数体放在类的声明中。
⏹使用inline关键字。
内联成员函数举例
(一)
classPoint
{
public:
voidInit(intinitX,intinitY)
{
X=initX;
Y=initY;
}
intGetX()
{returnX;}
intGetY()
{returnY;}
private:
intX,Y;
};
内联成员函数举例
(二)
classPoint
{
public:
voidInit(intinitX,intinitY);
intGetX();
intGetY();
private:
intX,Y;
};
inlinevoidPoint:
:
Init(intinitX,intinitY)
{
X=initX;
Y=initY;
}
inlineintPoint:
:
GetX()
{
returnX;
}
inlineintPoint:
:
GetY()
{
returnY;
}
2.4对象成员的引用
对象
⏹类的对象是该类的某一特定实体,即类类型的变量。
⏹声明形式:
类名对象名;
⏹例:
ClockmyClock;
类中成员的访问方式
⏹类中成员互访
⏹直接使用成员名
⏹类外访问:
访问public属性的成员,有3种方法
⏹通过对象名和成员运算符(“.”)访问对象中的成员
⏹通过指向对象的指针访问对象中的成员
⏹通过对象的引用来访问对象中的成员
访问private属性的成员,有3种方法
1、通过公有函数为私有成员赋值
2、利用指针访问私有数据成员
3、利用函数访问私有数据成员
4、利用引用访问私有数据成员
访问public属性的成员,有3种方法:
⏹通过对象名和成员运算符(“.”)访问对象中的成员
⏹通过指向对象的指针访问对象中的成员
⏹通过对象的引用来访问对象中的成员
(1)通过对象名和成员运算符访问对象中的成员
voidmain()
{
Pointp1;
p1.Init(8,100);
cout<}
再举例:
classTime
{public:
inthour;
intminute;
};
voidmain()
{
Timet,*p;
p=&t;
cout<hour;
}
3通过对象的引用来访问对象中的成员
classTime
{public:
inthour;
intminute;
};
voidmain()
{
Timet1;
Time&t2=t1;
cout<}
类的对象如何引用私有数据成员
1、通过公有函数为私有成员赋值
2、利用指针访问私有数据成员
3、利用函数访问私有数据成员
4、利用引用访问私有数据成员
类引用举例
下一节
(2):
类的定义应用举例
2、面向对象的概念——类的定义应用举例
(1)
问题:
给出一个矩形类的定义。
分析:
通过抽象分析,找出描述该类的属性和方法:
(1)成员属性:
一提到矩形,首先想到矩形的长和宽,因而其中成员属性有:
⏹边的长度:
(实型数)
⏹边的宽度:
(实型数)
如果要关心矩形的位置,则需要抽象出举行左上角顶点的坐标值,则需要增加下列成员属性:
⏹x坐标值:
(实型数)
⏹y坐标值:
(实型数)
2、面向对象的概念——类的定义应用举例
(2)
(2)成员方法:
对于矩形,说道计算问题,我们就会立即想到矩形的周长、面积,因而成员方法有:
⏹计算矩形的周长:
(计算的结果(数值为实型),作为函数值返回)
⏹计算矩形的面积:
(计算的结果(数值为实型),作为函数值返回)
另外:
有时需要移动矩形的位置,按水平和垂直方向移到新的位置;
有时需要改变矩形的长度和改变矩形的宽度;
有时需要得到(获取)矩形的实际长度值和宽度值;
有时需要,在显示器上显示矩形的属性值;
需要构造方法来形成矩形(由顶点、长度、宽度形成矩形)
因而需要再有的成员方法:
⏹移动矩形的位置:
(需要水平和垂直方向的移到量)
⏹改变矩形的长度
⏹改变矩形的宽度
⏹获取矩形的长度
⏹获取矩形的宽度
⏹显示矩形的属性值(4项)
⏹构造方法(需要4个参数)
2、面向对象的概念——类的定义应用举例(3)
根据以上的抽象分析,可以给出矩形类定义:
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voidshow()//显示矩形的属性值(4项)
rectangle(doublea,doubleb,doublec,doubled)
//构造方法(4个参数)
}
2、面向对象的概念——类的定义应用举例(4)
根据以上的抽象分析,可以给出矩形的JAVA类定义:
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voidshow()//显示矩形的属性值(4项)
rectangle(doublea,doubleb,doublec,doubled)
//构造方法(4个参数
2、面向对象的概念——类的定义应用举例(5)
根据以上的抽象分析,可以给出矩形的JAVA类定义:
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voidshow()//显示矩形的属性值(4项)
rectangle(doublea,doubleb,doublec,doubled)
//构造方法(4个参数
2、面向对象的概念——类的定义应用举例(6)
根据以上的抽象分析,可以给出矩形的JAVA类定义:
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voidshow()//显示矩形的属性值(4项)
rectangle(doublea,doubleb,doublec,doubled)
//构造方法(4个参数
2、面向对象的概念——类的定义应用举例(7)
根据以上的抽象分析,可以给出矩形的JAVA类定义:
classrectangle{
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voidshow()//显示矩形的属性值(4项)
rectangle(doublea,doubleb,doublec,doubled)
//构造方法(4个参数
}
2、面向对象的概念——类的定义应用举例(8)
根据以上的抽象分析,可以给出矩形的JAVA类定义:
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voidshow()//显示矩形的属性值(4项)
rectangle(doublea,doubleb,doublec,doubled)
//构造方法(4个参数
2、面向对象的概念——类的定义应用举例(9)
根据以上的抽象分析,可以给出矩形的JAVA类定义:
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voidshow()//显示矩形的属性值(4项)
rectangle(doublea,doubleb,doublec,doubled)
//构造方法(4个参数
2、面向对象的概念——类的定义应用举例(10)
根据以上的抽象分析,可以给出矩形的JAVA类定义:
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voidshow()//显示矩形的属性值(4项)
rectangle(doublea,doubleb,doublec,doubled)
//构造方法(4个参数
}
2、面向对象的概念——类的定义应用举例(11)
根据以上的抽象分析,可以给出矩形的JAVA类定义:
classrectangle{
private:
doubleL;//边的长度
doubleW;//边的宽度
doubleX;//顶点的坐标,x坐标值,
doubleY;//顶点的坐标,y坐标值
public:
doubleperimeter()//计算矩形的周长
doublearea()//计算矩形的面积
voidmove(doublea,doubleb)//移动矩形到新位置
doublegetL()//获取矩形的长度
doublegetW()//获取矩形的宽度
doublesetL(doublea)//改变矩形的长度为新值
doublesetW(doublea)//改变矩形的宽度为新值
voids