第5章-类和对象 - 2
C++面向对象程序设计习题解答与上机指导(第二版)源程序

C++面向对象程序设计习题解答与上机指导(第2版)习题参考答案源代码使用源程序的几点注意事项(1) 由于源程序在复制、编辑、解压缩等过程中可能引起部分符号(主要是标点符号,如分号、冒号、逗号、引号)的字体、半全角等发生变化,在编译时可能被检出语法错误,只要使用“替换”功能,纠正后即能顺利运行。
(2) 有的C++系统(如Visual C++6.0)没有完全实现C++标准,它所提供的不带后缀的.h 的头文件不支持友元运算符重载函数,在Visual C++6.0中编译会出错,这时可采用带后缀的.h头文件。
将程序中的#include<iostream>using namespace std;修改成#include<iostream.h>即可顺利运行。
第2章 C++基础【2.2】下面是一个C程序,改写它,使它采用C++风格的I/O语句。
#include<stdio.h>int main(){ int a,b,d,min;printf("Enter two numbers:");scanf("%d%d",&a,&b);min=a>b? b:a;for (d=2; d<min; d++)if (((a%d)==0)&&((b%d)==0)) break;if (d==min){ printf("No common denominators\n");return 0;}printf("The lowest common denominator is %d\n",d);return 0;}【解】#include<iostream>using namespace std;int main(){ int a,b,d,min;cout<<"Enter two numbers:";cin>>a;cin>>b;min=a>b? b:a;for (d=2; d<min; d++)if (((a%d)==0)&&((b%d)==0)) break;if (d==min){ cout<<"No common denominators\n";return 0;}cout<<"The lowest common denominator is "<<endl<<d;return 0;}【2.24】写出下列程序的运行结果。
第5章 Java中的面向对象特性

堆内存 代码区 public class Person { static int id; int age = 20; public static void main(String[] args) {… } } id age
Zhangsan.id
Zhangsan.age lisi.id
lisi.age
例2: 五子棋
面向过程:
1、开始游戏, 2、黑子先走, 3、绘制画面, 4、判断输赢, 5、轮到白子, 6、绘制画面, 7、判断输赢, 8、返回步骤2, 9、输出最后结果。
面向对象:
1、黑白双方 --这两方的行为是一模一样的, 2、棋盘系统 --负责绘制画面, 3、规则系统 --负责判定诸如犯规、输赢等。
a product
1.2 ×× 1.728 ×× 1.2
参数传递方式 值传递方式
方式:方法调用时,为形参分配单元,并将实参的值复制到形参
中;调用结束,形参单元被释放,实参单元仍保留并维持原 值 特点: 形参与实参占用不同的内存单元 单向传递
Person zhangSan=new Person(“张三”,18,“男”);
zhangSan
0xabcd
张三 null
name sex age
0 18
栈内存 实体的内存地址
男 0
堆内存
使用new 运算符和类的构造方法为声明 的对象分配内存,如果类中没有构造方法, 系统会调用默认的构造方法,默认的构造方 法是无参数的。
事万物皆对象”。 对象可以看成是静态属性(成员变量)和动态属 性(方法)的封装体。 类是用来创建同一类型的对象的“模板”,在 一个类中定义了该类对象所应具有的成员变量 以及方法。 移J2SDK提供了很多类供编程人员使用,编程 人员也可定义自己的类。
C++复习题2

第1章基本数据与表达式1.1选择题1.在一个C++程序中,main函数的位置( c )。
(a) 必须在程序的开头(b) 必须在程序的后面( c ) 可以在程序的任何地方(d) 必须在其它函数中间2.用C++语言编制的源程序要变为目标程序必须要经过( d )。
(a) 解释(b) 汇编(c) 编辑(d) 编译3.C++程序基本单位是( c )。
(a) 数据(b) 字符(c) 函数(d) 语句4. C++程序中的语句必须以( b )结束。
(a) 冒号(b) 分号(c) 空格(d)花括号5. 执行C++程序时出现的“溢出”错误属于( c )错误。
(a) 编译(b) 连接(c) 运行(d) 逻辑6.下列选项中,全部都是C++关键字的选项为( c )。
(a) while IF static (b) break char go(c) sizeof case extern (d) switch float integer7. 按C++标识符的语法规定,合法的标识符是(a ,c )。
(a) _abc (b) new (c) int1 (d) “age”8.下列选项中,( a )不是分隔符。
(a) ?(b) ;(c) :(d) ()9.下列正确的八进制整型常量表示是( b )。
(a) 0a0 (b) 015 (c) 080 (d) 0x1010.下列正确的十六进制整型常量表示是(a,b,d )。
(a) 0x11 (b) 0xaf (c) 0xg (d) 0x1f11.在下列选项中,全部都合法的浮点型数据的选项为(a,b,d ),全部都不合法的浮点型数据选项是( c )。
(a) -1e3 ,15. ,2e-4 (b) 12.34 ,-1e+5 ,0.0(c) 0.2e-2.5 ,e-5 (d) 5.0e-4 ,0.1 ,8.e+212.下列正确的字符常量为(b,d )。
(a) " a " (b) '\0' (c) a (d) '\101'13.下列选项中,(a,b,c )能交换变量a和b的值。
第五章 类图和对象图(UML)

+
size
:integer
=(100)
9
第 五 章 类 图 和 对 象 图
5.1 类的定义
说明:
3、属性还有取值范围。类型表示该属性的种类。 它可以是基本数据类型,例如整数、实数、布尔 型和枚举型等,也可以是用户自定义的类型。一 般它由所涉及的程序设计语言确定必须为其指定 数据类型。当一个类的属性被完整定义后,它的 任何一个对象的状态都由这些属性的特性值所决 定。
20
第 五 章 类 图 和 对 象 图
5.2 类之间的关系
1、关联
关联是一种结构关系,它指明一个事物的对象与 另一个事物的对象间的联系 例如,一个人为一家公司工作,一家公司有许多办 公室。我们就认为人和公司、公司和办公室之间 存在某种语义上的联系。在分析设计的类图模型 中,则在对应人类和公司类、公司类和办公室类 之间建立关联关系
改变的因素:1.一个类向另一个类发送消息。 2.一个类是另一个类的数据成员类型 3.一个类是另一个类的操作的参数类型 注:如果两个类之间有关联,那么这两个类就有依赖关 系,但是我们一般不标出依赖关系。
37
第 五 章 类 图 和 对 象 图
5.2 类之间的关系
3、泛化(generalization)关系
泛化关系:定义了一般元素和特殊元素之间的分类关系。 也就是一种继承关系。继承是在现有类的基础上定义和 实现一个新类的技术,刻画了类的一般性和特殊性。被 继承的类称为父类或超类,继承的类称为子类。 表示形式:用空心三角箭头实心线表示
25
第 五 章 类 图 和 对 象 图
5.2 类之间的关系
1、关联
角色:当一个类处于关联的某一端时,该类就在 这个关系中扮演着一个特定的角色。角色就是关 联关系中一个类对另一个类所表现的职责
《面向对象程度设计基础》(第2版)李师贤 05 第五章 类与对象(32页)

■ set_mode
■set_val(u)e() ■
■ increment()代码
■ (■)set_value()
■ get_value
■ decrement()代码
■ get_value
■increme(n)t ■
■ (■)increment
■ d e c r e m e n(t)( )
(■)decrement(
// 设置循环计数器的上下限和当前值 …… };
程序5.4.2 …… // 设置循环计数器的上下限和当前值 CIRCULAR_NUMBERS::CIRCULAR_NUMBERS(int min, int max, int value) {
min_val = (min <= max) ? min : max; max_val = (min <= max) ? max : min; if (value < min_val) current = min_val; else {
■类
■ 对象angle ■min_val ■0
■CIRCULAR_NUMBER
■ 对象 mo■n1th ■min_val
■max_val ■359
■ set_mode()代码
■12 ■max_val
■current ■250
■ set_value()代码
■11 ■current
■ set_mode
■ get_value()代码
类的外面,因此必须用类名和作用域运算符::来修饰函 数名。一般形式为: ■ 成员函数类型类名::成员函数名(形参表) ■ { 函数体 ■} ■ 例: // 循环计数器加一 ■ void CIRCULAR_NUMBERS::increment()
Java程序设计精编教程5-8章知识点

b) 如果变量名由多个单词组成,从第 2 个单词开始的每个单词的首字母要大写。
方法
方法的定义包括两部分:方法声明和方法体。一般格式为:
方法声明部分 {
方法体的内容
}
方法声明
方法声明包括返回值类型、方法名和参数。
double getArea() { //返回值类型为 double,无参数。
…
}
方法的返回值类型可以是 Java 中的任意数据类型。如果一个方法不返回数据,返回值类型必须是 void。
2. 有一个类 Singleton,为该类设计单例模式(该类只能有一个实例,且不能在类的外部 new 对象),只能通过该类 的静态方法 getInstance()获取该类的唯一对象。在主类 Homework2 中测试单例模式的有效性。
b) 在实例方法中,不仅可以调用实例方法,也可以调用类方法。 2) 类名调用类方法
a) 在类方法中,只能调用类方法、操作类变量。 b) 也可以通过对象调用类方法。 c) 如果一个方法不需要操作实例变量就可以实现某种功能,可以考虑将其声明为类方法。(例 5-8) 5.7 方法重载与多态 Java 中有两种多态:重载(overload)和重写(override)。 方法重载(overload):一个类中可以有多个名字相同的方法,但这些方法的参数必须不同,或者参数的个数不同, 或者参数的类型不同。方法的返回值类型与重载无关。
5.8 this 关键字 this 只能出现在实例方法和构造方法(也属于实例方法)中,表示调用该方法的当前对象。 一般情况下,方法中 this.实例变量的 this 可省略、类名.类变量的类名可省略,但当局部变量与成员变量同名时,
this 或类名不能省略。 5.9 包
包是 Java 语言管理类的一种机制,类似于操作系统中的目录,使用包名可以有效区分名字相同的类。 包语句
面向对象程序设计-类和对象_V2

2 析构函数(续)
析构函数的说明 1)类只有一个,若未显式定义,编译系统 自动生成默认的析构函数。 2)系统会自动调用析构函数,在 (1)对象生存期结束时(}结束); (2)使用delete释放对象时。
3 重载构造函数
与一般成员函数一样,C++运行重载构造 函数,重载的方法一样。
class A{
2 成员函数的定义(续)
2)类内直接定义;
class student { int age;
public: void SetAge(int a){ age = a;} };
这样定义的成员函数是一种内置函数,亦 可在类外定义内置函数,不过要在函数前 加上“inline”。
2 成员函数的定义(续)
说明: 1)类外定义时,成员函数前应缀上类名。
1 构造函数(续)
构造函数的定义 class complex{ double real; double imag; public: // 下面为构造函数 complex(double r,double i) { real=r; imag=i; } double realcomplex() { return real;} };
};
1 构造函数(续)
带参数的构造函数的使用
#include <iostream.h>
void main() {
complex S1;
//使用两个缺省参数
complex S2(1.1); //使用一个缺省参数
complex S3 (1.1,2.2);
cout<<“real of A is”<<\
1 构造函数(续)
构造函数的使用说明: 1)必须和类同名,否则当作一般成员函数 2)必须无返回类型,void类型也不行 3)如果程序员未定义构造函数,编译器自 动生成一个默认的构造函数 如: complex::complex( ) { } 4)构造函数可以不带参数
第5章 面向对象的程序设计

5.2.6 修饰符2-1
包中类B 本类D 包中子 类E 所有子类C 所有类A
public protected
类、变量、方法 A B+C 变量、方法
default 类、变量、方法 B private D 变量、方法 private protected 变量、方法 C
14
5.2.6 修饰符2-2
用来说明类、方法或变量的类型。
5.5.1 接口的定义
说明:
[修饰符] interface 接口名称{
[public] [static] [final] 变量名=初值; // 静态常量 (1)通常接口的名字以able或ible结尾;
[public] [abstract] [native]返回值 方法名([参数 (2)可以使用 extends 来继承接口的常量和抽象方法,
12
5.2.5 构造方法
• • • • 构造函数名称与类名称相同 构造函数没有返回类型 其任务是在创建对象时初始化其内部状态 若无定义系统默认有一个无参构造方法
class Fruit { boolean seedLess; boolean seasonal; float price; Fruit(boolean seed, boolean season, float p) { seedLess = seed; seasonal = season; price = p; } } 13
所以类在实现时,必须显示的使用public修饰符,否
则被警告缩小了接口中定义的方法的访问控制范围。
27
实例:接口的定义和实现
class InterfaceTest interface A { { public static void main(String args[ ]) double g=9.8; { void show( ); B b=new B( ); b.show( ); } } class B implements A } { public void show( ) {System.out.println(“g=“+g);} }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6
改进后的Student类
public class Student { this指向当前的对象 private string StuNo; private string StuName; private string StuSex; public Student(string StuNo,string StuName, string StuSex) { this.StuNo = StuNo; this.StuName = StuName; this.StuSex = StuSex; } publicpublic void ShowInfo() static void Main() { { Console.WriteLine(StuNo); Student Tom = new Student(“A001”,”Tom”,”M”); Console.WriteLine(StuName); Tom.ShowInfo(); Console.WriteLine(StuSex); } } 7 }
示例: ~Student() {}
11
思考:
同一个类中,如果函数同名,参数列表不同,则称 为函数的重载。一个类中不同的构造函数组成,称 为构造函数重载!
解决方案: 假设学生的学号,姓名已知,由于学生尚未报道,对于学生的 public Student(){}//默认构造函数 性别未知,现希望当性别未知时,性别取默认值“M”,性别已 public Student(string StuNo,string StuName) 知,则通过构造函数赋值给相应的对象。构造函数如何写? { this.StuNo = StuNo; this.StuName = StuName; this.StuSex = “M”; } public Student(string StuNo,string StuName, string StuSex) { public static void Main() this.StuNo = StuNo; { this.StuName = StuName; Student Tom = new Student(“A001”,“Tom”,”M”); this.StuSex = StuSex; Student Jane = new Student(“A002”,”Jane”); }
构造函数修饰符一般为 public 参数列表个数与成员变量 个数相同,且一一对应
示例: public Student(string StuNo,string StuName,string StuSex) { //构造函数体 } 5
4.3.1 构造函数
构造函数体:
this.成员变量名 = 成员变量名; 示例: public Student(string StuNo,string StuName,string StuSex) { this.StuNo = StuNo; this.StuName = StuName; this.StuSex = StuSex; }
10
2 析构函数
用于执行清除操作的特殊方法。 1. 析构函数不能有参数,一个类中只能有一个析构函数。 2. 析构函数用户销毁内存中已创建的对象。 3. 析构函数的名字与包含它的类的名字同名,前面加~,并且 不定义返回值类型,即使void也不可以。 4. 类中可以不写析构函数,编译器会自动创建,并在释放对象 时自动调用。
15
示例:
class MyClass { 用户自定义类访问规则: public int a; 1.静态方法只能访问静态成员变量 static public int b; void Fun1() //定义一个非静态方法 2.非静态方法即可访问静态成员变量又可访问非静态成员变量 { 3.静态方法或静态成员变量通过类名访问 a = 10; //正确,直接访问非静态方法 4.非静态方法或非静态成员变量通过实例名称来访问 b = 20; //正确,直接访问静态方法 } public static //定义一个静态方法 static void Fun2() void Main() { { a = 10; MyClass clsA = new MyClass(); //错误,不能访问非静态方法 b = 20; clsA.a = 10; //正确 //正确,可以访问静态成员 clsA.b = 20; //错误 } MyClass.a = 30; //错误 } MyClass.b = 40;//正确 }
改进后的Student类
public void ShowInfo() { Console.WriteLine(this.StuNo); Console.WriteLine(this.StuName); Console.WriteLine(this.StuSex); } 显示当前对象对应的成员变量,这里this也可省略不写!但构造函数 中的this不可省略,否则编译器报错!
16
思考:
Main函数为什么是static?
在程序刚开始运行的时候,Main函数是程序的入口,此时 未建立任何实例,因此无法调用实例成员,为了能够在程序的 开始执行Main方法,必须将其声明为静态。要是main也要实例 化的话,那谁又来实例化main呢?
17
示例
设计学生类,其中包含学号,姓名,年龄及学生总人数共4个属性,方 法有Student()(构造函数),setNumber(),getStudent(), getNumber()。 (1)以上属性和方法中哪些是非静态数据,哪些是静态数据? (2)设计程序实现该类。
8
注意:C#中提供了默认的不带参数的 构造函数,如果用户不写该函数,则编 译器为用户默默的创建!一个类中可以 public class Student 有多个构造函数! { public Student() private string StuNo; {}
思考:
private string StuName; private string StuSex; public void InputInfo() { … } public void ShowInfo() { … public static void Main() { }
}
12
练习:
public class Time 有Time类如下: { Time t1, t2, t3, t4 ; t1= newint hour, minute, second; Time (); t2 = newpublic Time ( ) Time(8); { this.hour=this.minute=this.second=0; } t3 = new Time(8, 30); t4 = newpublic Time (int hour) Time(8,30,30);类中还有ShowTime方法用来显示当 { this.hour=hour; this.minute=this.second=0; } 前时间为×小时Y分Z秒,请根据要求实现Time类。 public Time (int hour, int minute) { this.hour=hour; this.minute=minute; this.second=0;} public Time (int hour, int minute, int second) {this.hour=hour;this.minute=minute; this.second=second;} public void ShowTime() { Console.WriteLine(“当前时间为{0}时{1}分{2} 秒”,hour,minute,second); } 13 }
}
Student Tom = new Student(); Tom.InputInfo(); Toudent类创建Teacher类, Teacher类中包含成员 变量teaNo(工号),teaName(教师姓名),teaAge(年龄), teaTitle(职称)及构造函数和GetInformation()(获取 教师基本信息)。最后在Main()函数中创建Teacher类对 象Jane,并访问成员变量及成员函数。
2
第5章
类和对象-2
目标
类的构造函数 构造函数的重载
静态成员和非静态成员
4
1 构造函数
构造函数是一种特殊的成员函数。 1.当创建一个类的实例的时候构造函数会自动被编译器调用。 2.构造函数被用于初始化类的成员变量。 3.构造函数的名字与包含它的类的名字同名,并且不定义返回值类 型,即使void也不可以。 语法: [访问修饰符] <类名>([参数列表]) { //构造函数体,初始化工作 }
4.1.3静态成员和非静态成员
类中的成员要么是静态,要么是非静态的。 将类中的某个成员声明为static,该成员称为静态成员。 类的非静态成员属于类的实例所有 每创建一个类的实例,都在内存中为非静态成员开辟了 一块存储区域; 用实例访问,形式:实例名.非静态成员 而类的静态成员属于类所有 无论这个类创建了多少个实例,一个静态成员在内存中 只占有一块区域,为这个类的所有实例所共享。 用类访问,形式:类名.静态成员 类的静态方法只能直接访问类的静态成员!
回顾
访问修饰符 类的声明 类的实例化
1
习题:
Student类中包含成员变量StuNo(学号),StuName(学生姓 名),StuSex(学生性别)及成员函数SetInfomation()(设置学 生基本信息),GetInformation()(获取学生基本信息)。最后在 Main()函数中创建Student类对象Tom,并访问成员变量及成员 函数。
14
静态成员的应用
对于学生类示例,想要得到所有学生人数的信息,该如何获取呢?很显然, 这不是某个具体学生张三、李四的属性,而是整个学生群体的属性,对于 这种情况,可以说这种属性是类的属性,而非其对象的属性。 在面向对象中,类的属性称之为静态属性。 C#中使用static关键字来定义静态属性或方法,静态属性不能用实例化 对象引用,只能用类引用。若属性是静态的,通过“类名.属性”访问; 若属性是非静态的,则是通过“对象名.属性”访问。 思考: 解决方案: 项目中什么时候会用到静态成员? 网站中的当前在线人数,访问次数等; 访问数据库的方法;