当前位置:文档之家› 第10章类和对象

第10章类和对象

第10章类和对象
第10章类和对象

第10章

类和对象

本章工作任务

实现学校类,并描述学校的信息

实现教员类,并输出教员的信息

实现学生类,并输出学生的信息

本章技能目标

掌握类和对象的特征

理解封装

会创建和使用对象

使用Java理解程序逻辑

本章单词

请在预习时学会下列单词的含义和发音,并

填写在横线处。

1.class:

2.object:

3.OOP:

4.return:

5.encapsulation:

6.null:

7.initial:

8.type:

类和对象

本章简介

在前面章节中,我们学习了程序设计的基本知识和流程控制语句。通过这些内容的学习,大家能够用Java语言进行程序设计,但这些程序的规模都很小,一般只有几十行代码。假设我们要编程解决一个很大的问题,需要写几万行代码,如果按照以前的做法,将这些代码都放在一个Java文件中,可以想象这个文件会非常冗长,而且很难维护。

因此,在下面的课程中,你将看到Java程序设计的另一道风景——面向对象程序设计,英语缩写为OOP。面向对象程序设计是一个里程碑,Alan Kay因为设计了世界上第一个面向对象语言Smalltalk而获得图灵奖。Java之父James Gosling结合Internet背景设计了完全面向对象的Java语言。本章将带领你进入面向对象的世界,学习什么是对象和类,以及如何创建和使用类的对象。

10.1 对象

首先问你一个问题,“世界是由什么组成的?”。如果你是一个化学家,你可能会说,“世界是由分子、原子、离子等这些化学物质组成的”。如果你是一个画家,你可能会说,“世界是由不同的颜色组成的”。不同的人会有不同的回答。但如果你是一个分类学家,你会说,“这个世界是由不同类别的事物组成的”,如图10.1所示。

图10.1 世界的组成

其实,这个问题本身就比较抽象,我们说物以类聚,所以可以说世界是由不同类别的事物构成,如图10.1中所示,世界由动物、植物、物品、人和名胜等组成。动物可以分为脊椎动物和无脊椎动物。脊椎动物又可以分为哺乳类、鱼类、爬行类、鸟类和两栖类。

爬行类又可以分为有足类和无足类……,就这样可以继续分下去。当我们提到某一个分类时,就可以找到属于该分类的一个具体的事物。比如乌龟就属于爬行类中的有足类,

使用Java理解程序逻辑

眼镜蛇就属于爬行类中的无足类。当我们提到这些具体动物时,会在脑海浮现出它们的形象。这些现实世界中客观存在的事物就称为对象。在Java的世界中,“万物皆对象”!

作为面向对象的程序员,我们要站在分类学家的角度去思考问题。根据要解决的问题,将事物进行分类。

说明

分类是人们认识世界的一个很自然的过程,在日常生活中会不自觉地进行分类。比如我们可以将食物分为可食的和不可食的,将交通工具分为车、船、飞机等。分类就是按照事物的性质、特点、用途等作为区分的标准,将符合同一标准的事物归为一类,不同的则分开。比如上文对动物的分类中,根据动物有无脊椎可分为脊椎动物和无脊椎动物,如果根据动物是水生还是陆生,又可分为水生动物和陆生动物。

因此,在实际应用中,我们要根据待解决问题的需要,选择合适的标准或角度对问题中出现的事物进行分类。

10.1.1 身边的对象

现实世界中客观存在的任何事物都可以被看作对象。它可以是有形的,比如一辆汽车;

它也可以是无形的,比如一项计划。因此对象无处不在。

Java是一种面向对象的语言,因此我们要学会用面向对象的思想考虑问题和编写程序。

在面向对象中,对象是用来描述客观事物的一个实体。用面向对象方法解决问题时,首先要对现实世界中的对象进行分析与归纳,找出哪些对象与我们要解决的问题是相关的。下面以商场中的两个对象为例,看看我们身边的对象,如图10.2所示。张浩在超市购物后要刷卡结账,收银员李明负责收款并打印账单。在这个问题中,张浩和李明就是我们所关心的对象。下面选择一个角度对他们分类,比如两人的角色不同,张浩是顾客,而李明是收银员,因此可以说,张浩是“顾客”对象,而李明是“收银员”对象。

图10.2 “顾客”对象和“收银员”对象

既然他们都是对象,如何区分呢?其实每一个对象都有自己的特征,包括静态特征和动态特征。静态特征是可以用某些数据来描述的特征,比如人的姓名、年龄等。动态特征

类和对象

是对象所表现的行为或对象所具有的功能,比如购物、收款等。对上面的例子,我们可以得到表10-1。

表10-1 不同对象的静态特征和行为对照表

对象静态特征静态特征的值动态特征

“顾客”对象姓名张浩购买商品

张浩年龄 20

体重 60kg

“收银员”对象员工号 10001 收款

李明姓名李明打印账单

部门财务部

通过表10-1,我们可以看到,不同类别中的对象具有不同的静态特征和动态特征。如果要将上面的信息存储在计算机中,该如何做呢?

10.1.2 对象的属性和方法

通过超市购物的例子可以看到,正是因为对象拥有了这些静态特征和动态特征才使得他们与众不同。在面向对象的编程思想中,我们把对象的静态特征和动态特征分别称为对象的属性和方法,它们是构成对象的两个主要因素。其中属性是用来描述对象静态特征的一个数据项,该数据项的值即属性值。比如上面例子中,“顾客”对象有一个属性是姓名,属性值是张浩。而方法是用来描述对象动态特征(行为)的一个动作序列。比如“收银员”对象的行为有收款和打印账单,这些都是对象的方法。

在编程中,对象的属性被存储在一些变量里,比如可以将“姓名”存储在一个字符串类型的变量中,将“员工号”存储在一个整型变量中。对象的行为则通过定义方法来实现,比如“收款”、“打印账单”都可以定义为一个方法。

解释

对象:用来描述客观事物的一个实体,由一组属性和方法构成。

10.1.3 封装

顾名思义,封装(Encapsulation)就是把一个事物包装起来,并尽可能隐藏内部细节,如图10.3所示。

图10.3 法拉利跑车

使用Java理解程序逻辑

图10.3中是一辆法拉利跑车。在这辆车未组装前,是一堆零散的部件,比如发动机、方向盘等,仅仅这些部件是不能发动的。当把这些部件组装完成后,才具有发动的动能。显然,这辆法拉利跑车是一个对象,而零部件就是该对象的属性,发动、加速、刹车等行为就是该对象所具有的方法。通过上面的分析可以看到,对象的属性和方法是相辅相成,不可分割的,它们共同组成了实体对象。因此,对象具有封装性。

10.2 类

上面提到了一位顾客“张浩”,但在现实世界中有很多顾客,张三、李四、王五等。因此,“张浩”只是顾客这一类人中的一个实例。又如,“法拉利跑车”是一个对象,但现实世界中还有奔驰、保时捷、凯迪拉克等车,因此“法拉利跑车”只是车这一类别中的一个实例。不论哪种车,都有一些共同的属性,比如品牌、颜色等,也有一些共同的行为,比如发动、加速、刹车等,在这里我们将这些共同的属性和行为组织到一个单元中,就得到了类。

解释

类:具有相同属性和方法的一组对象的集合。

类定义了对象将会拥有的特征(属性)和行为(方法)。

类的属性:对象所拥有的静态特征在类中表示时称为类的属性。例如,所有顾客都有姓名,因此姓名可以称为“顾客类”的属性,只是不同对象的这一属性值不同,比如,顾客张三和顾客李四的姓名不同。

类的方法:对象执行的操作称为类的方法。例如,所有顾客都有购物行为,因此购物就是“顾客类”的一个方法。

10.2.1 类和对象的关系

了解了类和对象的概念,你会发现它们之间既有区别又有联系,例如,如图10.4所示为用模具做球状冰淇淋的过程。

图10.4 制作球状冰淇淋

类和对象

制作球状冰淇淋的模具是类,它定义了如下信息(属性)。

球的半径。

冰淇淋的口味。

使用这个模具做出来的不同大小和口味的冰淇淋是对象。在Java面向对象编程中,我们就用这个类模型创建出类的一个实例,即创建类的一个对象。

因此,类和对象的关系就如同模具和用这个模具制作出的物品之间的关系。一个类为它的全部对象给出了一个统一的定义,而它的每个对象则是符合这种定义的一个实体。因此类和对象的关系就是抽象和具体的关系。类是多个对象进行综合抽象的结果,是实体对象的概念模型,而一个对象是一个类的实例。图10.5展示了在我们生活的现实世界,大脑中的概念世界和程序运行的计算机世界中,类和对象的关系。

图10.5 现实世界、概念世界和计算机世界中的类与对象

在我们生活的“现实世界”中,有一个个具体的“实体”。以超市中为例,在超市中有很多顾客,张三、李四、王五等,而“顾客”这个角色就是在我们大脑的“概念世界”

中形成的“抽象概念”。当我们需要把顾客这一“抽象概念”定义到计算机中时,就形成了“计算机世界”中的“类”,也就是我们上面内容所讲的类。而用类创建的一个实例就是“对象”,它和“现实世界”中的“实体”是一一对应的。

10.2.2 类是对象的类型

到目前为止,我们已经学习了很多数据类型,比如整型(int)、双精度浮点型(double)、字符型(char)等。这些都是Java语言已经定义好的类型,我们编程时只需要用这些类型声明变量即可。

那么,如果想描述顾客“张浩”,他的数据类型是什么呢?字符型还是字符串型?其实都不是。“张浩”的类型就是“顾客”,也就是说,类就是对象的类型。

使用Java理解程序逻辑

事实上,定义类就是定义了一个自己的数据类型。例如“顾客”类、“人”类、“动物”类等。

10.3 Java是面向对象的语言

在面向对象程序设计中,类是程序的基本单元,Java是完全面向对象的语言,所有程序都是以类为组织单元的。回想一下你写过的每一个程序,基本框架是不是如示例1所示的样子。

示例1

public class HelloWorld{

public static void main(String[] args){

System.out.println(“Hello World!!!”);

}

}

分析示例1,程序框架最外层的作用就是定义了一个类HelloWorld,我们在第1章曾提到HelloWorld是一个类名,原因就在此。

10.3.1 Java的类模板

学习了类,对象的相关知识,那如何在Java中描述它们呢?

Java中的类将现实世界中的概念模拟到计算机中,因此我们需要在类中描述类所具有的所有属性和方法。Java的类模板如下所示。

语法

public class <类名>{

//定义属性部分

属性1的类型属性1;

属性2的类型属性2;

……

属性3的类型属性3;

//定义方法部分

方法1;

方法2;

……

方法n;

}

类和对象

在Java中要创建一个类,需要使用一个class,一个类名和一对表示程序体的大括号。

其中,class是创建类的关键字。在class前有一个public,表示“公有”的意思。编写程序时,要注意编码规范,不要漏写public。在class关键字的后面要给定义的类命名,然后写上一对大括号,类的主体部分就写在{}中。类似于给变量命名,类的命名也要遵循一定的规则。

不能使用Java中的关键字。

不能包含任何嵌入的空格或点号“.”以及除下划线“_”、“$”字符外的特殊字符。

不能以数字开头。

规范

类名通常由多个单词组成,每个单词的首字母大写。

另外,类名应该简洁而有意义,尽量使用完整单词,避免使用缩写词(除非该缩写词已被广泛使用,比如HTML、HTTP、IP等)。

10.3.2 如何定义类

类定义了对象将会拥有的属性和方法。定义一个类的步骤如下。

1.定义类名

通过定义类名,得到程序最外层的框架。

语法

public class 类名{

//程序体

}

2.编写类的属性

通过在类的主体中定义变量来描述类所具有的静态特征(属性),这些变量称为类的成员变量。

3.编写类的方法

通过在类中定义方法来描述类所具有的行为,这些方法称为类的成员方法。

知道了定义一个类的步骤,下面通过一个例子具体看一下。

问题

在不同的北大青鸟培训中心(北京中心、杭州中心等),你会感觉到相同的教学环境和教学氛围,用类的思想输出培训中心的信息。

使用Java理解程序逻辑

分析

在定义类之前,首先要从问题中找出对象和类,进而分析它所具有的属性和方法。

一般利用问题描述中的名词和名词短语来识别对象和类。例如,用特指名词(张浩、我的家、第6次比赛)识别对象,用复数名词(人们、顾客、开发商)以及泛指名词(每一个人、不同的教员、一台电脑)识别类。对上面的问题,北京中心和杭州中心是特指名词,这样得到两个对象,不同的北大青鸟培训中心是泛指名词,可以抽象成类。对于每个中心,都具有“中心名称”、“教室数目”和“机房数目”,它们所具有的行为都有“展示本中心的信息”。通过上面的分析,我们抽象出了这个类的(部分)属性和行为,如图10.6所示,下一步就可以定义类了。根据定义类的步骤,编写代码,如示例2所示。

图10.6 School类的属性和方法

示例2

public class School { School类的属性

String schoolName; //中心名称

int classNumber; //教室数目

int labNumber; //机房数目

//定义北大青鸟中心的方法 School类的showCenter()方法

public void showCenter(){

System.out.println(schoolName + “培训学员\n”+“配备:”

+ classNumber + “教”+ labNumber + “机”);

}

}

示例2定义了一个School类,并且定义了三个成员变量:schoolName、classNumber、labNumber。另外,定义了一个类的方法,方法名是showCenter()。这个方法的作用是显示中心的信息,即中心名称以及教室和机房的配置情况。在下一章,我们将详细讲解如何编写类的方法,这里只对showCenter()方法做一个简单说明,该方法代码如下。public String showCenter(){

//方法体

}

编写showCenter()方法时,你只需要在“方法体”部分写出你要实现的功能即可,

类和对象

showCenter是方法名。在Java中,一个简单方法的框架如下所示。

语法

访问修饰符返回值类型方法名(){

方法体

}

访问修饰符限制了访问该方法的范围,比如public,还有其他的访问修饰符,我们会在后面学习。返回值类型是方法执行后返回结果的类型,这个类型可以是基本类型,或者是引用类型,也可以没有返回值,此时必须使用void来描述。方法名一般使用一个有意义的名字描述该方法的作用,其命名应符合标识符的命名规则。

说明

这里我们介绍一下Camel(骆驼)命名法和Pascal(帕斯卡)命名法。

骆驼式命名法:方法或变量名的第一个单词的首字母小写,后面每个单词的首字母大写。比如:showCenter、userName等。

帕斯卡命名法:每一个单词的首字母都大写。比如:ShowCenter()、UserName等。

在Java中,我们使用骆驼式命名法。

10.3.3 如何创建和使用对象

类School定义好了,下面就可以根据定义的模板创建对象了。类的作用就是创建对象。

由类生成对象,称为类的实例化过程。一个实例也就是一个对象,一个类可以生成多个对象。创建对象的语法如下。

语法

类名对象名 = new 类名();

在创建类的对象时,需要使用Java的new关键字。例如,创建类School的一个对象。

School center = new School();

这里变量center的类型就是School类型。使用new创建对象时,我们并没有给它的数据成员赋一个特定的值。考虑到每个对象的属性值可能是不一样的,所以在创建对象后再给它的数据成员赋值。

在Java中,要引用对象的属性和方法,需要使用“.”操作符,其中对象名在圆点的左边,属性或方法的名称在圆点的右边。

语法

对象名.属性 //引用对象的属性

对象名.方法名() //引用对象的方法

使用Java理解程序逻辑

例如,创建School类的对象center后,就可以给对象的属性赋值或调用方法,代码如下。https://www.doczj.com/doc/056788597.html, = “北京中心”; //给name属性赋值

center.showCenter(); //调用showCenter()方法

知道了如何创建类的对象,下面就来解决10.3.2节中的问题。

示例3

public class InitialSchool {

public static void main(String[] args){

School center = new School();

System.out.println(“***初始化成员变量前***”);

center.showCenter();

center.schoolName = “北京中心”; //给schoolName属性赋值

center.classNumber = 10; //给classNumber属性赋值 https://www.doczj.com/doc/056788597.html,bNumber = 10; //给labNumber属性赋值

System.out.println(“\n***初始化成员变量后***”);

center.showCenter()

}

}

运行结果如图10.7所示。

图10.7 示例3的运行结果

下面分析一下示例3的代码。这里我们新创建了一个类InitialSchool,用它来测试School 类。大家知道,程序要执行的话需要一个入口程序。因此,像以前编写过的程序一样,在main()方法中编写代码来使用School类。

说明

main()方法是程序的入口,可以出现在任何一个类中,但要保证一个Java类中只有一个main()方法。因此,我们可以将main()写在School类中。但这里,我们将main()放在了InitialSchool类中,目的是使不同的类实现不同的功能。

在main()中,有以下三点需要大家注意。

首先使用关键字new创建类的对象“center”。

School center = new School();

类和对象

使用点操作符访问类的属性。

center.schoolName = “北京中心”; //引用schoolName属性

center.classNumber = 10; //引用classNumber属性

https://www.doczj.com/doc/056788597.html,bNumber = 10; //引用labNumber属性

使用点操作符访问类的方法。

center.showCenter();

下面分析一下运行结果。showCenter()方法返回一个字符串,由图10.7可知,在没有初始化成员变量时,String类型的变量schoolName的值为null(空),而两个整型变量classNumber和labNumber的值是0。为什么呢?这是因为在定义类时,如果没有给属性赋初始值,Java会给它一个默认值,如表10-2所示。

表10-2 Java数据类型的默认值

类型默认值

int 0

double 0.0

char ‘\u0000’

boolean false

String null

经验

在Eclipse中使用点操作符引用类的属性和方法时,你会发现Eclipse会弹出一个下拉菜单,如图10.8所示,其中列出了所有的属性和方法。你只需要选择想要引用的就可以了,这是IDE给我们提供的便捷。

图10.8 自动提示

使用Java理解程序逻辑

10.3.4 综合示例

在10.3.3节中我们定义了学校类,下面看看如何定义学生类和教员类。

问题

编写学生类,输出学生相关信息,如图10.9所示。

图10.9 输出学生

编写教员类,输出教员相关信息,如图10.10所示。

图10.10 输出教员信息

分析

由图10.9可知,学生类包含的属性有姓名、年龄、班级、爱好;包含的方法为显示个人信息。如示例4所示。

由图10.10可知,教员类包含的属性有姓名、专业方向、教授课程、教龄;包含一个显示个人信息的方法。如示例5所示。

示例4

学生类:

public class Student {

String name; //姓名

int age; //年龄

String classNo; //班级

String hobby; //爱好

//输出信息方法

类和对象

public void show(){

System.out.println(name +“\n年龄:”+ age + “\n就读于:”+ classNo + “\n爱好:”+ hobby);

}

}

输出学生信息:

public class InitialStudent {

public static void main(String args[]) {

Student student = new Student(); //创建对象

https://www.doczj.com/doc/056788597.html, = “张浩”; //给每个属性赋值

student.age = 10;

student.classNo = “S1班”;

student.hobby = “篮球”;

student.show(); //调用方法

}

}

示例5

教员类:

public class Teacher {

String name; //姓名

String major; //专业方向

String courses; //教授课程

int schoolAge; //教龄

//输出信息方法

public void show(){

System.out.println(name + “\n专业方向:”+ major +

“\n教授课程:”+ courses + “\n教龄:”+ schoolAge);

}

}

输出教员信息:

public class InitialTeacher {

public static void main(String[] args) {

Teacher teacher = new Teacher(); //创建对象

https://www.doczj.com/doc/056788597.html, = “王老师”; //给各个属性赋值

teacher.major = “计算机”;

teacher.courses = “使用Java语言理解程序逻辑”;

teacher.schoolAge = 5;

teacher.show(); //调用方法

}

}

使用Java理解程序逻辑

下面通过另外一个例子,巩固一下类的使用。

问题

一个景区根据游人的年龄收取不同价格的门票,其中大于60岁或小于18岁的免费,18岁到60岁之间的20元。请编写游人(Visitor)类,根据年龄段决定能够购买的门票价格并输出。用户输入n则退出程序。

分析

给出问题后,首先要找出与要解决问题有关的对象并抽象出类。很明显,根据要解决的问题,我们可以得到“游人“类,该类可以有“姓名”和“年龄”两个属性。让用户输入年龄,利用选择结构解决。如示例6所示。

示例6

游人类:

import java.util.Scanner;

public class Visitor {

String name; //姓名

int age; //年龄

//显示信息方法

public void show() {

Scanner input = new Scanner(System.in);

while(!“n”.equals(name)){

if(age>=18 && age<=60){ //判断年龄

System.out.println(name +“的年龄为:”+ age +“,

门票价格为:20元\n”);

}else{

System.out.println(name +“的年龄为:”+ age +“,门票免费\n”); }

System.out.print(“请输入姓名:”);

name = input.next(); //给name属性赋值

if(!“n”.equals(name)){

System.out.print(“请输入年龄:”);

age = input.nextInt(); //给age属性赋值

}

}

System.out.print(“退出程序”);

}

}

输出门票信息:

import java.util.Scanner;

public class InitialVistor {

类和对象

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

Visitor v = new Visitor(); //创建对象

System.out.print(“请输入姓名:”);

https://www.doczj.com/doc/056788597.html, = input.next(); //给name属性赋值

System.out.print(“请输入年龄:”);

v.age = input.nextInt(); //给age属性赋值

v.show(); //调用显示信息方法 }

}

示例6的运行结果如图10.11所示。

图10.11 示例6的运行结果

为了程序演示的方便,示例6中的代码使用了循环,当用户输入n时退出程序。这里我们主要注意代码中使用new关键字创建对象以及给属性赋值两个部分。

10.3.5 面向对象的优点

了解了类和对象,也学习了如何定义类,创建对象和使用对象,下面总结一下面向对象的优点,具体如下。

与人类的思维习惯一致:面向对象的思维方式是从人类考虑问题的角度出发,把人类解决问题的思维过程转变为程序能够理解的过程。面向对象程序设计能够让我们使用“类”来模拟现实世界中的抽象概念,用“对象”来模拟现实世界中的实体,从而用计算机解决现实问题。

信息隐藏,提高了程序的可维护性和安全性:封装实现了模块化和信息隐藏,即将类的属性和行为封装在类中,这保证了对它们的修改不会影响到其他对象,有利于维护。同时,封装使得在对象外部不能随意访问对象的属性和方法,避免了外部错误对它的影响,提高了安全性。

提高了程序的可重用性:一个类可以创建多个对象实例,增加了重用性。

使用Java理解程序逻辑

面向对象程序设计还有其他优点,在以后的学习中会慢慢介绍。相信通过不断实践,你的理解会不断加深。

10.4 数据类型总结

对比

Java中的数据类型分为两类。

基本数据类型:比如整型(int)、双精度浮点型(double)、字符型(char)、布尔型(boolean)。

引用数据类型:比如字符串(String)、数组、使用class自定义的类型(School、Student等)。

问答

问题:为什么String类型是引用数据类型呢?

解答:我们一直使用的String类型实际上是Java开发人员使用class关键字给我们定义的一个类,直接使用即可。因此,它也有属性和方法。不过现在大家不需要知道这些,只需要记住它属于引用数据类型就可以了。在第15章,我们将集中学习String类。

10.5 上机练习

上机练习1

指导——定义管理员类

训练要点

定义类的属性。

定义类的方法。

需求说明

编写管理员类(属性:用户名、密码;方法:show()显示管理员信息)。

类和对象

实现思路及关键代码

定义管理员类Administrator,然后定义属性和方法。

参考解决方案

public class Administrator{

String name; //姓名

String password; //密码

//显示信息方法

public void show() {

System.out.println(“姓名:”+ name +“,密码:”+ password); }

}

上机练习2

练习——定义客户类

需求说明

编写客户类(属性:积分、卡类型;方法:show()显示客户信息)。

提示

定义管理员类Customer,然后定义属性和方法。

上机练习3

指导——创建管理员对象

训练要点

使用类创建对象。

引用对象的属性和方法。

需求说明

创建两个管理员类对象,输出他们的相关信息。运行结果如图10.12所示。

使用Java理解程序逻辑

图10.12 练习3的运行结果

实现思路及关键代码

(1)利用new关键字创建两个管理员类的对象。

(2)分别给这两个对象赋值并调用显示方法。

参考解决方案

public class AdministratorTest {

public static void main(String[] args) {

Administrator admin1 = new Administrator(); //创建管理员对象1 Administrator admin2 = new Administrator(); //创建管理员对象2 //给管理员对象1赋值并调用显示方法

https://www.doczj.com/doc/056788597.html, = “admin1”;

admin1.password = “111111”;

admin1.show();

//给管理员对象2赋值并调用显示方法

https://www.doczj.com/doc/056788597.html, = “admin2”;

admin2.password = “222222”;

admin2.show();

}

}

上机练习4

指导——更改管理员密码

训练要点

使用类创建对象。

while循环。

需求说明

输入旧的用户名和密码,如果正确,才有权限更新。

从键盘获取新的密码,进行更新。

C语言的类和对象

C语言的类和对象 【类实现了C++面向对象程序设计的基础,我们使用类来定义对象的属性,类是 C++封装的基本单元。】 一、----- 类 使用关键字class创建类,一个类声明定义了一个连接代码和一个数据的新类型,这个新的类型又可以用来声明该类的对象。因此,类又是逻辑逻辑抽象概念,儿对象是物理存在的,也就是说对象是类的实例。 类的声明语法上和结构相似。 [一下是完整的类的形式] class class_name { private data and functions access_specifier: data and functions access_specifiter: data and functions //…….. access_specifier:是 data and functions }object_list; 其中,object_list是任选项,如过存在,他声明类的对象。access_specifier为下面的三个关键字之一: Public private protected 默认时,在类声明的函数和数据属于该类私有,只能被该类的成员访问。如果使用,pubilc访问限定符号,函数和程序就可以被其他部分访问。Protected访问限定符,仅在涉及继承的时候才需要(十五章了解)。访问限定符已经使用,其作用就保持到遇到别的访问限定符或者达到类声明的结束处。 在类声明内可以任意改变访问说明符号,对于某些声明,可以转换位public,然后再转换成private。 [如下所述] /******************************* ··构造函数和析构函数学习··· *******************************/ //Using a constructor and destructor. /******************************* 声明C++ 程序头文件 *******************************/ #include #include #include #include /******************************* ·名字空间:组织大型的程序结构·

第10章类和对象

第10章 类和对象 本章工作任务 实现学校类,并描述学校的信息 实现教员类,并输出教员的信息 实现学生类,并输出学生的信息 本章技能目标 掌握类和对象的特征 理解封装 会创建和使用对象

使用Java理解程序逻辑 本章单词 请在预习时学会下列单词的含义和发音,并 填写在横线处。 1.class: 2.object: 3.OOP: 4.return: 5.encapsulation: 6.null: 7.initial: 8.type:

类和对象 本章简介 在前面章节中,我们学习了程序设计的基本知识和流程控制语句。通过这些内容的学习,大家能够用Java语言进行程序设计,但这些程序的规模都很小,一般只有几十行代码。假设我们要编程解决一个很大的问题,需要写几万行代码,如果按照以前的做法,将这些代码都放在一个Java文件中,可以想象这个文件会非常冗长,而且很难维护。 因此,在下面的课程中,你将看到Java程序设计的另一道风景——面向对象程序设计,英语缩写为OOP。面向对象程序设计是一个里程碑,Alan Kay因为设计了世界上第一个面向对象语言Smalltalk而获得图灵奖。Java之父James Gosling结合Internet背景设计了完全面向对象的Java语言。本章将带领你进入面向对象的世界,学习什么是对象和类,以及如何创建和使用类的对象。 10.1 对象 首先问你一个问题,“世界是由什么组成的?”。如果你是一个化学家,你可能会说,“世界是由分子、原子、离子等这些化学物质组成的”。如果你是一个画家,你可能会说,“世界是由不同的颜色组成的”。不同的人会有不同的回答。但如果你是一个分类学家,你会说,“这个世界是由不同类别的事物组成的”,如图10.1所示。 图10.1 世界的组成 其实,这个问题本身就比较抽象,我们说物以类聚,所以可以说世界是由不同类别的事物构成,如图10.1中所示,世界由动物、植物、物品、人和名胜等组成。动物可以分为脊椎动物和无脊椎动物。脊椎动物又可以分为哺乳类、鱼类、爬行类、鸟类和两栖类。 爬行类又可以分为有足类和无足类……,就这样可以继续分下去。当我们提到某一个分类时,就可以找到属于该分类的一个具体的事物。比如乌龟就属于爬行类中的有足类,

java第二版第二章答案

Java iSW程序设il?(郑莉) 第二章习题答案 1.什么是对象、类,它们之间的联系 答:1)对象是包含现实世界物体特征的捕象实体,它反映系统为之保存信息和与它交互的能力。对象是一些属性及服务的封装体,在程序设计领域,可以用“对象二数据+作用于这些数据上的操作”来表示。现实生活中对象是指客观世界的实体:在程序中对象是指一组变量和相关方法的集合。 2)类是既有相同操作功能和相同的数据格式的对象的集合与抽象! 3)两者的关系:对象是类的具体实例 2.什么是而向对象的程序设计方法它有那些基本特征 答:而向对象程序设计从所处理的数据入手,以数抵为中心而不是以服务为中心来描述系统。 它把编程问题视为一个数据集合,数据相对于功能而言,具有更强的稳世性。 它的特征:抽象,封装,继承,多态。 3.在下而的应用中,找出可能用到的对象,对毎一个对象,列出可能的状态和行为。 1)模拟航空预订系统交易的程序 2)模拟银行交易的程序 答:1)航空预订交易: 状态:旅客姓名,身份证号,联系号码,出发地址,抵达地址,出发日期。 行为:订票,领票,买票,退票。 2)银行交易: 状态:客户姓名,账号,身份证号。 行为:存款,取款,『款。 4.请解释类属性、实例属性及其区别。 答:实例属性,由一个个的实例用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同。 5.请解释类方法、实例属性及其区别。 答:实例方法表示特定对象的行为,在声明时前而不加static修饰符,在使用时需要发送给一个类实例。 类方法也称为静态方法,在方法声明时前而需加static修饰符,类方法表示具体实例中类对象的共有行为。 区别:实例方法可以宜接访问实例变量,调用实例方法,实例方法可以直接访问类变量, 调用类方法:类方法可以直接调用类变量和类方法,类方法不能直接调用实例变量和实例方法: 6.类的访问控制符有哪几种具体含义及其区别。 答:类的访问控制符只有public (公共类)及无修饰符(默认类)两种。 区別:当使用public修饰符时表示所有其他的类都可以使用此类;当没有修饰符时,则只有与

类和对象练习题

类和对象 一、选择题 1、下面对方法的作用描述不正确的是:( d ) A、使程序结构清晰 B、功能复用 C、代码简洁 D、重复代码 2、方法定义的变量:( b ) A 、一定在方法所有位置可见B、可能在方法的局部位置可见 C、在方法外可以使用 D、在方法外可见 3、方法的形参:(a) A、可以没有 B、至少有一个 C、必须定义多个形参 D、只能是简单变量 4、方法的调用:(c) A、必须是一条完整的语句 B、只能是一个表达式 C、可能是语句,也可能是表达式 D、必须提供实际参数 5、return 语句:( d) A、不能用来返回对象 B、只可以返回数值 C、方法都必须含有 D、一个方法中可以有多个return 语句 6、void 的含义:(d) A、方法体为空 B、方法体没有意义 C、定义方法时必须使用 D、方法没有返回值 7、main()方法的返回类型是:( c ) A 、boolean B、int C、void D、static 8、方法重载所涉及的方法:( a ) A、有相同的名字 B、参数个数必须不同 C、参数类型必须不同 D、返回类型必须不同 9、下面关于类和对象之间关系的描述,正确的是( c ) A、联接关系B、包含关系C、具体与抽象的关系D、类是对象的具体化 10、下面关于java中类的说法哪个是不正确的( c ) A、类体中只能有变量定义和成员方法的定义,不能有其他语句。 B、构造方法是类中的特殊方法。 C、类一定要声明为public的,才可以执行。

D、一个java文件中可以有多个class定义。 11、下列哪个类声明是正确的( d) A、public void H1{…} B 、public class Move(){…} C、public class void number{} D、public class Car{…} 12、下面的方法声明中,哪个是正确的(c) A、public class methodName(){} B、public void int methodName(){} C、public void methodName(){} D、public void methodName{} 13、下述哪些说法是不正确的?( b ) A、实例变量是类的成员变量 B、实例变量是用static关键字声明的 C、方法变量在方法执行时创建 D、方法变量在使用之前必须初始化 14、下面对构造方法的描述不正确是( b)。 A、系统提供默认的构造方法 B、构造方法可以有参数,所以也可以有返回值 C、构造方法可以重载 D、构造方法可以设置参数 15、定义类头时,不可能用到的关键字是( b)。 A、class B、private C、extends D、public 16、下列类头定义中,错误的是( )。 A、public x extends y {...} B、public class x extends y {...} C、class x extends y implements y1 {...} D、class x {...} 17、设A为已定义的类名,下列声明A类的对象a的语句中正确的是( ) 。 A、float A a; B、public A a=A( ); C、A a=new int( ); D、static A a=new A( ); 18、设i , j为类X中定义的int型变量名,下列X类的构造方法中不正确的是( a )。 A、void X(int k ){ i=k; } B、X(int k ){ i=k; } C、X(int m, int n ){ i=m; j=n; } D、X( ){i=0;j=0; } 19、有一个类A,以下为其构造方法的声明,其中正确的是

C++类和对象实验报告

计算机科学与技术实验报告 实验二类和对象(1) 姓名:易XX 班级:计科二班学号:2015110121 实验目的:深入理解类和对象,学会定义类,申明私有、公有变量,学会定义对象,并调用成员函数,解决实际问题。 实验内容: (一)、题目要求: 定义一个描述角度的类CAngle,包含的内容如下: (1)私有成员变量value,表示角度,类型为double; (2)公有成员变量SetValue,实现功能是使用形参为value赋值。 声明为:viod SetValue(double); (3)公有成员函数GetCos,实现功能计算余弦值,并作为返回值返回。 声明为 double GetCos(); 编程实现如下功能:定义一个Cangle类的对象deg,调用成员函数设置deg的角度为30度,调用成员函数计算并输出deg的余弦值。 代码: #include #include using namespace std; #define PI 3.1415 //定义宏常量PI class CAngle{ double value; //定义角度 public: void Setvalue(double x){ value =x/180*PI; //把角度转化为弧度 } double Getcos(){ return ( cos(value) ); //计算cos值 } }; int main(){ CAngle deg; //定义一个Cangle类的对象deg deg.Setvalue(30); cout<

《面向对象程序设计》第10章在线测试

《面向对象程序设计》第10章在线测试 A B C D 、关于异常对象的说法正确的是( A B 对象 C、以引用方式传递异常对象时,抛出的是局部静态对象 D 对象 A块相当于一个以类型为单一参数的函数 B 以捕捉 C块中可以声明变量,该变量可以在块外使用 D 数值 A B C D 、为保证程序中的全局变量不与开发商提供的全局变量重名,可以采取的措施是( A B C D

C、C++程序绝对不能出现错误 D、异常处理使C++程序在出现错误的情况下仍能继续运行 2、下面说法正确的是() A、C++程序中可以存在多个名字空间 B、不同的名字空间中不能出现名字相同的变量 C、名字空间能避免名字冲突 D、C++程序中也可以不定义名字空间 3、关于异常处理的说法正确的是() A、将异常的检测与处理分离 B、异常就是错误 C、异常由函数调用引起 D、在上层调用函数中使用try检测函数调用是否引发异常 4、下面与异常处理相关的关键字有() A、Throw B、throw C、try D、Try 5、下面的说法正确的是() A、引发异常用关键字throw B、在被调用函数中检测到异常条件用throw都可以引发异常 C、被调用函数只有在try块中用throw才可以引发异常 D、检测到的异常由catch捕获并处理 第三题、判断题(每题1分,5道题共5分) 1、抛出异常的模块并不负责异常的处理,该异常的处理可以程序中的任何位置。

正确错误、异常处理器根据抛出异常模块的报告来处理异常。 正确错误、异常信号传递方式有三种:传值方式、引用方式和指针方式。 正确错误表示函数将会抛出所有类型的异常 正确错误处理程序的出现次序无关紧要。 正确错误

第10章 面向对象设计

第10章面向对象设计 10.1 软件模块之间的依赖性可以从哪些角度和抽象层次进行分析? 在面向对象软件中,常见的软件模块有类、接口、包、构件。因此,分析软件模块之间的依赖性就可以从类、接口、包和构件的角度和层次进行分析。 10.2 消除包之间循环依赖性的方法是什么? 本质上,两个包之间的依赖性来自于两个包中类之间的依赖性。类之间的循环依赖性是个特别棘手的问题,好在大多数情况下可以通过重新设计避免循环依赖性。具体方法是增加新包。举例说明如下: 在下图中,包A依赖于包B,反过来包B又依赖包A,构成了循环依赖。具体解决办法是:将包B依赖的包A中的元素从包A中分离出来,组成包C,使得包B不再依赖包A,而是依赖包C。 10.3 请给出构件的一般性定义,然后给出传统的软件工程环境及面向对象的软件工程环境中构件的定义,最后选择你熟悉的编程语言说明怎样定义一个构件。 软件构件是一种组装单元,它具有规范的接口规格说明和显式的语境依赖。软件构件可以被独立部署,并由第三方任意组装。OMG UML规范中将构件定义为“系统中某一定型化的、可配置的和可替换的部件,该部件封装了实现并暴露一系列接口”。 在传统的软件工程环境中,一个构件就是程序的一个功能要素,程序由处理逻辑和实现处理逻辑所需的内部数据结构以及能够保证构件被调用和实现数据传递的接口构成。传统的构件也称为模块,是软件体系结构的一部分。 在面向对象的软件工程环境中,面向对象技术已达到了类级复用,而构件级复用则是比类级复用更高一级的复用,它是对一组类的组合进行封装(当然,在某些情况下,一个构件可能只包含一个单独的类),并代表完成一个或多个功能的特定服务,也为用户提供了多个接口。一个构件可以是一个编译的类,可以是一组编译的类,也可以是其他独立的部署单元,如一个文本文件、一个图片、一个数据文件、一个脚本等。 选择你熟悉的编程语言说明怎样定义一个构件。(略) 10.4 典型的面向对象设计模型在逻辑上由哪几部分组成?对每一部分进行设计时所包含的主要内容是什么? 典型的面向对象设计模型在逻辑上将系统划分为4个部分,分别是问题域部分、人机交互部分、任务管理部分及数据管理部分。

从C到ObjectiveC类和对象续修订稿

从C到O b j e c t i v e C类 和对象续 集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-

从 C++ 到 Objective-C(4):类和对象(续) 作者:日期: 2011 年 03 月 19 日(9) 方法 Objective-C 中的方法与 C++ 的函数在语法方面风格迥异。下面,我们就来讲述 Objective-C 的方法。 原型、调用、实例方法和类方法 以–开头的是实例方法(多数情况下都应该是实例方法); 以 + 开头的是类方法(相当于 C++ 里面的 static 函数)。 Objective-C 的方法都是 public 的; 返回值和参数的类型都需要用小括号括起来; 参数之间使用冒号:分隔; 参数可以与一个标签 label 关联起来,所谓标签,就是在 : 之前的一个名字。标签被认为是方法名字的一部分。这使得方法 比函数更易读。事实上,我们应该始终使用标签。注意,第一个 参数没有标签,通常它的标签就是指的方法名; 方法名可以与属性名相同,这使 getter 方法变得很简单。 C++ // 原型 void Array::insertObject(void*anObject, unsigned int atIndex); // shelf 是 Array 类的一个实例,book 是一个对象

shelf.insertObject(book, 2); Objective-C(不带 label,即直接从 C++ 翻译来) // 方法原型 // 方法名字是“insertObject::” // 这里的冒号:用来分隔参数,成为方法名的一部分(注意,这不同于C++ 的域指示符::) -(void) insertObject:(id)anObject:(unsigned int)index // shelf 是 Array 类的一个实例,book 是一个对象 [shelf insertObject:book:2]; Objective-C(带有 label) // 方法原型。“index” 有一个标签“atIndex” // 方法名为“insertObject:atIndex:” // 这样的话,调用语句就很容易阅读了 -(void) insertObject:(id)anObject atIndex:(unsigned int)index // shelf 是 Array 类的一个实例,book 是一个对象 [shelf insertObject:book:2]; // 错误! [shelf insertObject:book atIndex:2]; // 正确 注意,方括号语法不应该读作“调用 shelf 对象的 insertObject 方法”,而应该是“向 shelf 对象发送一个 insertObject 消息”。这是Objective-C 的实现方式。你可以向任何对象发送任何消息。如果目标对象不能处理这个消息,它就会将消息忽略(这会引发一个异常,但不

c类和对象练习题

c类和对象练习题 Standardization of sany group #QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#

第8章类与对象 8.1知识要点 1.掌握类与对象的概念和定义方法,掌握类成员的访问属性。 2.掌握构造函数的概念、定义方法和使用方法。 3.掌握析构函数的概念、定义方法和使用方法。 4.掌握拷贝构造函数的概念、定义方法和使用方法。 5.掌握包含对象成员的类构造函数的定义方法。 6.掌握静态成员的概念、定义方法、作用和特点。 7.掌握友元的概念、定义方法、作用和特点。 8.掌握类模板的定义格式与使用方法。 8.2典型例题分析与解答 例题1:下列有关类的说法不正确的是()。 A.对象是类的一个实例 B.任何一个对象只能属于一个具体的类 C.一个类只能有一个对象 D.类与对象的关系和数据类型与变量的关系相似 答案:C 分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。 例题2:下面()项是对构造函数和析构函数的正确定义。 A.void X::X(), void X::~X() B.X::X(参数),X::~X() C.X::X(参数),X::~X(参数) D.void X::X(参数),void X::~X(参数) 答案:B 分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。 例题3:()的功能是对象进行初始化。 A.析构函数B. 数据成员 C.构造函数 D.静态成员函数 答案:C 分析:当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作; 例题4:下列表达方式正确的是()。 A.class P{B.class P{ public: public: int x=15; int x; voidshow(){cout<

UML第二章作业答案

1.UML如何表示类?类图标中可以指明哪些信息? 类是描述一类对象的特征和行为,类图包含一组、接口及他们之间的关联、依赖和泛化的关系。它不仅显示了信息的结构,同时还描述了系统对象的的行为。 2.什么是类的多重性(关联的基数)?多重性怎么表示? 多重性是对象之间关联的一个重要方面,它说明了在关联中的一个类的对象可以对应另一个类的多个对象。 主要包含一组上下限数,用来指出可被允许生成的实例(instance)数量,即最多可以生成多少数目(上限),最少不得低于多少数目(下限)。关联的两端以"下限..上限"的格式标示出多重性,如图2-12中的1..*。星号(*)代表无指定上限,下限最低为0。如果上下限数相同,标示出一个数目就可以了 3.两者对象之间能够以多种方式关联吗? 关联两边的"employee"和“employer”标示了两者之间的关系,而数字表示两者的关系的限制,是关联两者之间的多重性。通常有“*”(表示所有,不限),“1”(表示有且仅有一个),“0...”(表示0个或者多个),“0,1”(表示0个或者一个),“n...m”(表示n到m个都可以),“m...*”(表示至少m个)。在关联中有一种叫“限定关联”,还有一种谓之自身关联。另外,对象之间的关联就没那么复杂,只是将类的关联实例化而已 4.什么是约束?为什么要对类图附加注释? 约束用来约束MUL成员的语义。约束用举例在大括号内的条件来表示({contrraint}),可以直接放在图中,类图除了在设计新系统方面的用途外,它们还能用来记录一个存在系统(称它为“遗产”)的对象现在如何交互 5.聚集和组成之间有什么区别? 聚合关系完全是概念上的,只是区分了整体与组成部分,没有改变整体与其组成部分之间的关联导航的含义,也没有将整体与部分的生命周期联系起来。而组合是聚合的变种,整体与部分之间有很强的所有关系,也就是说,在组合关系中,一个对象一次只是一个组合的一部分,而在简单的聚合关系中,一个部分可以被好几个整体共享。 另外,在组合关系中,整体负责部分的创建和破坏,部分的生命周期是依附于整体的,要么和整体一起创建和破坏,要么在整体存在后创建或在整体破坏前破坏,总之它不能单独存在。 6.什么叫实现?实现和继承有何相似之处?两者又有何不同之处? 答:实现是类和它的接口之间的关系,可以说成是类实现了它的接口。相似之处:在于类可以使用它的接口中的操作,也可以操作从父类中继承操作。不同之处:类不能使用它的接口中的属性但可以继承父类中的属性。实现是对接口而言的,继承是对类而言的。 7.写出3种可见性的名称,并描述每一种可见性的含义。 答:public,protected,private及package。

类与对象答案

类与对象 知识要点 1.掌握类与对象的概念和定义方法,掌握类成员的访问属性。 2.掌握构造函数的概念、定义方法和使用方法。 3.掌握析构函数的概念、定义方法和使用方法。 4.掌握拷贝构造函数的概念、定义方法和使用方法。 5.掌握包含对象成员的类构造函数的定义方法。 6.掌握静态成员的概念、定义方法、作用和特点。 7.掌握友元的概念、定义方法、作用和特点。 8.掌握类模板的定义格式与使用方法。 典型例题分析与解答 例题1:下列有关类的说法不正确的是()。 A.对象是类的一个实例 B.任何一个对象只能属于一个具体的类 C.一个类只能有一个对象 D.类与对象的关系和数据类型与变量的关系相似 答案:C 分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。 例题2:下面()项是对构造函数和析构函数的正确定义。 A.void X::X(), void X::~X() B.X::X(参数), X::~X() C.X::X(参数), X::~X(参数) D.void X::X(参数), void X::~X(参数) 答案:B 分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。 例题3:()的功能是对象进行初始化。 A.析构函数 B. 数据成员 C.构造函数 D.静态成员函数 答案:C 分析:当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作; 例题4:下列表达方式正确的是()。 A.class P{ B. class P{ public: public: int x=15; int x; void show(){cout<

2.1 类和对象 (第二章 C++面向对象程序设计)

1. 什么是类?类的定义格式?类的成员一般分为哪两部分?它们的区别如何? 答:类是C++语言的数据抽象和封装机制,它描述了一组具有相同属性(数据成员)和行为特征(成员函数)的对象。类的定义格式如下: Class 类名 { private: //私有数据成员和成员函数 public: //共有数据成员和成员函数 protected: //受保护的数据成员和成员函数 }; 类的成员分为数据成员和成员函数两部分。数据成员定义了该类对象的属性,不同对象的属性值可以不同;成员函数定义了该类对象的操作即行为。 2. 类与结构体有什么区别? 答:c语言中的结构体只有数据成员,无函数成员。C++语言中的结构可有数据成员和成员函数。在默认情况下,结构体中的数据成员和成员函数都是共有的,而在类中可以是私有的。从外部可以随意修改结构体变量中的数据,对数据的这种操作时很不安全的,程序员不能通过结构体对数据进行保护和控制;在结构体中,数据和其相应的操作是分离的,使得程序的复杂性难以控制,而且程序的可重用性不好,严重影响了软件的生产效率。 3. 什么是对象?如何定义一个对象?对象的成员如何表示? 答:对象是类的实例,是属性和服务的封装体。对象的定义有两种方法: 方法一:在定义类的同时直接定义。 class 类名 { private: // public: // }对象1,对象2; 方法二:在使用时定义对象。 类名对象1,对象2; 对象的成员的表示有:

(1)通过对象调用成员。 格式:对象名.公有成员 其中,“.“成为对象的选择符,简称点运算符。 (2)通过指向对象的指针调用成员。 格式:指向对象的指针->成员 (3)通过对象的引用调用成员。 格式:对象的引用.成员 4. 什么是构造函数?构造函数有哪些特点? 答:构造函数就是与类名有相同名称的成员函数,它可自动进行对象的初始化。 特点:它没有返回值说明;它不能被继承;它可以有默认实参;它不可以是虚(virtual)的;不可以对它取地址;不能用常规调用方法调用构造函数;当定义对象时,编译程序自动调用构造函数。 5. 什么是析构函数?析构函数有哪些特点? 答:析构函数的作用是当对象生命期结束后,收回对象占用的资源。 析构函数的特点是:1) 析构函数名是在类名前加以符号“~”。2) 析构函数没有参数、返回类型和修饰符。3) 一个类中至多有一个析构函数,如果程序员没有定义析构函数,那么系统会自动地加入一个析构函数。4) 不能显式地调用析构函数,而是由系统自动调用。 6. 什么是默认构造函数和默认析构函数? 答:若用户未显式定义一个类的构造函数,则C++语言提供一个默认的构造函数,也叫默认构造函数。同样,如果一个类没有显式的定义类的析构函数,则编译器将合成一个,也就是默认的析构函数。 7. 什么是复制构造函数?它的功能和特点是什么? 答:复制构造函数是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构件及初始化。 复制构造函数的功能是用一个已有的对象来初始化一个被创建的同类对象,是一种特殊的构造函数,具有一般构造函数的所有特性,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中。 在C++中,下面三种对象需要拷贝的情况。因此,复制构造函数将会被调用。

C++Primer Plus第十章对象与类课后习题

1. account.h #ifndef ACCOUNT_H_ #define ACCOUNT_H_ #include class BankAccount { private: std::string name; std::string account_m; double saving; public: BankAccount(const std::string & client, const std::string & num, double pr = 0.0); void show() const; void despoit(double pr); void withdraw(double pr); }; #endif account.cpp #include #include"account.h" BankAccount::BankAccount(const std::string & client, const std::string &

num, double pr ) { name = client; account_m = num; saving = pr; } void BankAccount::show() const { std::cout << "BankAccount : " << std::endl; std::cout << "Name is: " << name << " , Account: " << account_m << " , Saving: " << saving << " . " << std::endl; } void BankAccount::despoit(double pr) //存??款? { saving = pr + saving; } void BankAccount::withdraw(double pr) //取¨?款? { if(pr > saving) std::cout << "There is not so much money." << std::endl; else saving = saving - pr; } Main.cpp

C++程序设计与应用基础第二章 类和对象习题答案

C++程序设计与应用基础第二章类和对象习题答案 1、请完成下列填空题 1)在C语言中,编程的单位是___函数__:在C++语言中,编程的单位是____类__。 2)在下面程序的横线处填上适当的语句,使类型该程序执行结果为10。 #include class MyClass { pub1ic: ——MyClass(int a){x=a;}//为x置值 ——int GetNum(){return x;} //取x值 private: int x; }; void main() { Myclass my(10); Cout<

6)假定用户没有给一个名为MyClass的类定义构造函数,则系统对其定义的默认构造函数形式为___MyClass()_____。 2、编程题 1)定义一个复数类imaginary。用友元函数实现该类的加、减、乘和除运算。 答案: class Imaginary { public: Imaginary(float a,float b); friend Imaginary Add(Imaginary& img1,Imaginary& img2); friend Imaginary Sub(Imaginary& img1,Imaginary& img2); friend Imaginary Mul(Imaginary& img1,Imaginary& img2); friend Imaginary Div(Imaginary& img1,Imaginary& img2); private: float x,y; }; Imaginary::Imaginary(float a,float b) { x=a; y=b; } Imaginary Add(Imaginary& img1,Imaginary& img2) { float a,b; a=img1.x+img2.x;

c类和对象练习题修订稿

c类和对象练习题公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

第8章类与对象 8.1知识要点 1.掌握类与对象的概念和定义方法,掌握类成员的访问属性。 2.掌握构造函数的概念、定义方法和使用方法。 3.掌握析构函数的概念、定义方法和使用方法。 4.掌握拷贝构造函数的概念、定义方法和使用方法。 5.掌握包含对象成员的类构造函数的定义方法。 6.掌握静态成员的概念、定义方法、作用和特点。 7.掌握友元的概念、定义方法、作用和特点。 8.掌握类模板的定义格式与使用方法。 8.2典型例题分析与解答 例题1:下列有关类的说法不正确的是()。 A.对象是类的一个实例 B.任何一个对象只能属于一个具体的类 C.一个类只能有一个对象 D.类与对象的关系和数据类型与变量的关系相似 答案:C 分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。 ? 例题2:下面()项是对构造函数和析构函数的正确定义。 A.void X::X(), void X::~X() B.X::X(参数),X::~X() C.X::X(参数),X::~X(参数) D.void X::X(参数),void X::~X(参数) 答案:B 分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。 ? 例题3:()的功能是对象进行初始化。 A.析构函数B. 数据成员 C.构造函数 D.静态成员函数 答案:C 分析:当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作; ? ? 例题4:下列表达方式正确的是()。 A.class P{B.class P{ public: public: int x=15; int x; voidshow(){cout<

课后习题 第十章 类与对象

一:选择题 1.在下列关键字中,用于说明类中公有成员的是__. a.public b.private c.protected d.friend 2.下列的各函数中,___不是类的成员函数. a.构造函数 b.析构函数 c.友元函数 d.复制构造函数 3.___不是构造函数的特征。 a.构造函数的函数名与类名相同 b.构造函数可以重载 c.构造函数可以设置缺省参数 d.构造函数必须指定类型说明 4.___是析构函数的特征。 a.一个类中只能定义一个析构函数 b.析构函数在对象创建时调用 c.析构函数的定义只能在类体内 d.析构函数可以有一个或多个参数 5.关于成员函数特征的下述描述中,___是错误的。 a.成员函数一定是内联函数 b.成员函数可以重载 c.成员函数可以设置参数的缺省值 d.成员函数可以是静态的 6.复制构造函数的形参是___。 a.某个对象名 b.某个对象的成员名 c.某个对象的引用名 d.某个对象的指针名 7.如果编程者没有显式定义构造函数(包括复制构造函数),C++编译器就___。 a.出现编译错误 b.没有构造函数 c.必须显示定义 d.隐式定义缺省的构造函数 8.静态成员函数仅能访问___。 a.静态的数据成员 b.非静态的成员函数 c.非静态的数据成员 d.以上都不对 9.静态数据成员的初始化必须在___。 a.类内 b.类外 c.在构造函数内 d.静态成员函数内 10.友元作用___。 a.提高程序的运用效率 b.加强类的封装性 c.实现数据的隐藏性

d.增加成员函数的种类 一:选择题: 1.A 2.C 3.D 4.A 5.A 6.C 7.D 8.A 9.B 10.A 二:判断题 1.使用关键字class定义的类中缺省的访问权限是私有(private)的。 2.构造函数和析构函数都不能重载。 3.说明或定义对象时,类名前不需加class关键字。 4.可以在类的构造函数中对静态数据成员进行初始化。 5.rotected和private区别在于:protected成员可以被派生类访问,而private成员则不能被派生类访问。 二:判断题 1.对 2.错 3.对 4.错 5.对 三、编程实现 1.创建一个类,具有public、private和protected数据成员和函数成员。创建该类的一个对象,看看试图存取所有的类成员时会得到一些什么信息。编写一个全局friend函数来访问该类的私有数据成员。 2.创建一个没有任何构造函数的类,显示可以用缺省的构造函数创建对象。然后为该类创建一个非缺省的构造函数(带一个参数),试着在编译一次,解释发生的现象。 3.建立一个类,该类包含const成员函数和非const成员函数,然后建立这个类的const和非const对象。分别为这两种类型的对象调用两种成员函数,解释发生的现象。 4.利用静态数据成员的概念,编写一个类,可以统计目前存在多少个该类的对象。 5.列举调用复制构造函数的三种情况。 6.编写几何点(二维平面上)的类Point,包括位置属性(二维坐标x,y),成员函数包括点的位置获取函数GetX()和GetY(),点的位置设置函数SetX()和SetY(),和点的位置移动函数MoveTo()以及点的信息打印函数Display ()。 7.编写几何图形圆的类Circle,包括两个属性:圆心O(用上题中的Point类实现)和半径R。成员函数包括:圆心位置获取函数GetO()和半径获取函数GetR();半径位置设置函数SetR();圆的位置移动函数MoveTo();圆的半径设置函数SetR();以及圆的信息打印函数Display()。 8.编写复数类Complex。实现各种常用构造函数,实现整数、实数向复数的转化函数,实现整数、实数和复数以及复数之间的加、减、乘、除各种运算,实现==、!=等逻辑运算。 三、编程实现

C 实验二 类与对象(附答案).

实验二类与对象 实验目的和要求 1.掌握类、类的数据成员、类的成员函数的定义方式。 2.理解类成员的访问控制方式。 3.掌握对象的定义和操作对象的方法。 4.理解构造函数和析构函数的定义与执行过程。 5.掌握重载构造函数的方法。 6.了解拷贝构造函数的定义方法。 实验内容 1.下面程序中有错,在不删除和增加代码行的情况下,改正错误语句,使其正确运行。#include class Aa { public: Aa(int i=0) { a=i; cout<<"Constructor "<

(1) #include class Date { void set_date(); void show_date(); int year; int month; int day; }; Date d; int main() { set_date(); show_date(); } void set_date() { cin>>d.year; cin>>d.month; cin>>d.day; } void show_date() { cout< class A { public: void A(int i=0) { m=i; } void show() { cout<

c++第2章 类和对象习题

《面向对象程序设计》习题班级:学号:姓名:名单序号:成绩: 第2章类与对象 一、选择题(共26分,每题1分) 1.下列有关类的说法不正确的是()。 A.对象是类的一个实例 B.任何一个对象只能属于一个具体的类 C.一个类只能有一个对象 D.类与对象的关系和数据类型与变量的关系相似 2.下面()项是对构造函数和析构函数的正确定义。 A.void X::X(), void X::~X() B.X::X(参数), X::~X() C.X::X(参数), X::~X(参数) D.void X::X(参数), void X::~X(参数) 3.()的功能是对象进行初始化。 A.析构函数 B.数据成员 C.构造函数 D.静态成员函数 4.下列表达方式正确的是()。 A.class P{ B. class P{ public:public: intx=15;int x; void show(){cout<

相关主题
文本预览
相关文档 最新文档