C++面向对象程序设计教程课后题答案
1.1 什么是面向对象程序设计?
面向对象程序设计是一种新的程序设计范型.这种范型的主要特征是:
程序=对象+消息
面向对象程序的基本元素是对象。
主要结构特点是:
第一,程序一般由类的定义和类的使用两部分组成;
第二,程序中的一切操作都是通过向对象发送消息来实现的。
1.2 什么是对象?什么是类?对象与类之间的关系是什么?
对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。
类就是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。
类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,一个对象是类的一个实例。
1.3 现实世界中的对象有哪些特征?请举例说明。
现实世界中的对象具有以下特征:
1) 每一个对象必须有一个名字以区别于其他对象;
2) 用属性来描述对象的某些特征;
3) 有一组操作,每组操作决定对象的一种行为;
4) 对象的行为可以分为两类:一类是作用于自身的行为,另一类是作用于其他对象的行为。
例如一个教师是一个对象。每个教师对象有自己的名字来和别的教师区别。教师具有编号,姓名,年龄,职称,专业等属性。教师拥有走路,吃饭,授课等行为操作。走路,吃饭是作用于自身的行为,授课是作用于其他对象的行为。
1.4 什么是消息?消息具有什么性质?
一个对象向另一个对象发出的请求成为“消息”。
消息具有以下3个性质:
1) 同一个对象可以接收不同形式的多个消息,做出不同的相应;
2) 相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的;
3) 对消息的响应并不是必须的,对象可以响应消息,也可以不响应。
1.5 什么是抽象和封装?请举例说明。
抽象是将有关事物的共性归纳、集中的过程。
例如:把所有具有大学生学籍的人归为一类,成为“大学生”,这就是一个抽象。
封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐藏对象的内部细节。
例如:每一台洗衣机都有出厂日期、机器编号等属性,也有启动、暂停、选择等操作。人们在使用洗衣机的时候只需要按下对应的按钮,而不用关心具体的内部实现。这就是封装。
1.6 什么是继承?请举例说明。
继承就是允许派生类使用基类的数据和操作,同时,派生类还可以增加新的操作和数据。
例如:哺乳动物是一种热血、有毛发、用奶哺育幼崽的动物;狗是有犬牙、食肉、特定的骨骼结构、群居的哺乳动物。狗就继承了哺乳动物。
1.7 若类之间具有继承关系,则他们之间具有什么特征?
若类之间具有继承关系,则他们之间具有下列几个特征:
1) 类间具有共享特征(包括数据和操作代码的共享);
2) 类间具有差别或新增部分(包括非共享的数据和操作代码);
3) 类具有层次结构。
1.8 什么是单继承、多继承?请举例说明。
单继承是指每个派生类只直接继承了一个基类的特征。例如狗继承自哺乳动物。
多继承是指多个基类派生出一个派生类的继承关系。比如玩具车同时继承自玩具和车。
1.9 什么是多态?请举例说明。
多态是指不同的对象收到相同的消息时执行不同的操作。
例如,有一个窗口类对象,还有一个棋子类对象。当我们发出“移动”消息时,两个对象的行为不同。
1.10 面向对象程序设计的主要优点是什么?
1.可提高程序的重用性;
2.可控制程序的复杂性;
3.可改善程序的可维护性;
4.能够更好地支持大型程序设计;
5.增强了计算机处理信息的范围;
能够很好地适应新的硬件环境。
2.1 简述C++的主要特点。
1) C++是C的超集,保持与C的兼容。
2) 保持了C的简洁、高效和接近汇编语言等特点,并对C的功能作了不少扩充。用C++编写的程序比C更安全,可读性更好,代码结构更为合理。
3) 程序质量高。
4) 增加了面向对象机制。
2.2
#include
using namespace std;
int main()
{
int a, b, d, min;
cout << "Enter two numbers:";
cin >> a >> 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" << endl;
return0;
}
cout << "The lowest common denominator is" << d << endl;
return0;
}
2.3 有效
2.4 没有函数声明;
函数定义没有写返回值类型。
2.5 (1)等价,函数声明可以省略参数的名字。
(2)不等价,第二个的函数定义不能省略参数的名字。
2.6-2.10 CDAAB
2.11-2.15 ACBDC
2.16-2.17 DC
2.18
101
2.19
10 10
2.20
10
20
2.21 举例说明可以使用const替代#define以消除#define的不安全性。
#include
using namespace std;
int main()
{
int a = 1;
#define T1 a+a
#define T2 T1-T1
cout << "T2 is " << T2 < return0; } 上面这个程序,初看应该输出 T2 is 0 但是实际上,得出T2 is 2 如果把#define换成const,则可以输出想要的结果。 2.22 用动态分配空间的方法,计算Fibonacci数列的前20项,并存储到动态分配的空间中。 #include using namespace std; int main() { int *pi = new int[20]; *pi = 1; pi[1] = 1; for(int i = 2; i < 20; i++) { pi[i] = pi[i - 2] + pi[i - 1]; } return0; } 2.23 重载sroot函数,输出一个数的二次方根。 #include using namespace std; double sroot(int num) { return (double)sqrt((double)num); } double sroot(long num) { return (double)sqrt((double)num); } double sroot (double num) { return (double)sqrt(num); } int main() { return0; } 2.24 解决百钱问题。将一元人民币换成1、2、5分的硬币,有多少种换法? #include using namespace std; int main() { int num = 0; //总共换法的总数。初始化为0。 for(int i = 0; i <= 100; i++) { for(int j = 0; j <= 50; j++) { if((i + 2*j) > 100) { break; } for(int k = 0; k <= 20; k++) { if((i + 2*j + 5*k) == 100) { num++; cout << "1分" << i << "个;" << "2分" << j << "个;" << "5分" << k << "个;" << endl; } if ((i + 2*j + 5*k) > 100) { break; } } } } cout << num << endl; return0; } 2.25 输入两个整数,按由小到大的顺序输出。要求使用变量的引用。 #include using namespace std; void swap(int &a, int &b) { a = a + b; b = a - b; a = a - b; } int main() { int a, b; cin >> a >>b; if(a > b) { swap(a, b); } cout << a << "," << b << endl; return0; } 2.26 用二分法求解f(x)=0的根。 #include using namespace std; double Fun(double x) { return35*x +25; //假设f(x)=35x+25 } int main() { double a, b; cin >> a; if(Fun(a) == 0) { cout << "x = " << a << endl; return0; } do { cin >> b; } while ((Fun(a) * Fun(b)) >= 0); if(Fun(b) == 0) { cout << "x = " << b << endl; return0; } if(a > b) { a = a + b; b = a - b; a = a - b; } while(1) { if(Fun((a + b)/2) == 0) { cout << "x = " << (a + b)/2 << endl; return0; } if(Fun(a) * Fun((a + b)/2) < 0) { b = (a + b)/2; } if(Fun(b) * Fun((a + b)/2) < 0) { a = (a + b)/2; } } return0; } 3.1 类声明的一般格式是什么? class类名 { [private:] 私有数据成员和成员函数 public: 公有数据成员和成员函数 } 3.2 构造函数和析构函数的主要作用是什么?它们各自有什么特性? 构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。 构造函数的名字必须与类名相同,而不能由用户任意命名。它可以有任意类型的参数,但不能具有返回值类型。 析构函数通常用于执行一些清理任务,如释放分配给对象的内存空间等。 析构函数名与类名相同,但它前面必须加一个波浪号。不能有返回值,也不能有参数。 3.3 什么是对象数组? 所谓对象数组,是指每一个数组元素都是对象的数组。 3.4 什么是this指针?它的主要作用是什么? C++为成员函数提供了一个名为this的指针,这个指针称为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象。 一个类的所有对象合用一份成员函数,this指针可以帮助对象辨别出当前调用的是自己的那个对象的数据成员和函数。 3.5 友元函数有什么作用? 友元函数可以在类的外部访问类的私有成员或保护成员。 3.6 (1)声明并定义了P2, P3,并用默认无参构造函数初始化。 (2)声明并定义了P2,并调用Point类的拷贝构造函数用P1对P2进行初始化。 (3)声明并定义了P2,并调用Point类的拷贝构造函数用P1对P2进行初始化。 (4)调用拷贝构造函数,将P1的成员值赋值给P4的成员。 3.7-3.10 BCCB 3.11-3.15 BAABA 3.16-3.17 BB 3.18 10,20 30,48 50,68 70,80 90,16 11,120 3.19 Constructing 10 100 Destructing 3.20 3objects in existence 4objects in existence after allocation 3objects in existence after deletion 3.21 Counting at0 Counting at9 3.22 Default constructor called. Default constructor called. Default constructor called. Construcotor:a=1,b=2 Construcotor:a=3,b=4 Construcotor:a=5,b=6 3.23 Con. Copy con. default. Copy con. 3.24 A=5 B=14 A=9 B=14 3.25 5,7 22.25 3.26 Constructing Constructing A=5 B=15 A=10 B=15 Destructing Destructing 3.27 void pintStu();函数只有声明,没有定义。 age是私有成员,不能用对象直接调用。 3.28 void printStu() 和 void setSno(int s) 没有加限定符Student:: void setAge(int a)在类中没有声明 3.29 构造函数不能定义为私有。否则无法创建对象。 3.30 下面是一个计算器类的定义,请完成该类成员函数的实现。 class counter { public: counter(int number); void increment(); //给原始值加1 void decrement(); //给原始值减1 int getvalue(); //取的计数器值int print(); //显示计数private: int value; }; counter::counter(int number) { value = number; } void counter::increment() { ++value; } void counter::decrement() { --value; } int counter::getvalue() { return value; } int counter::print() { cout << value < return value; } 3.31 根据注释语句提示,实现类Date的成员函数 #include using namespace std; class Date { public: void printDate(); void setDay(int d); void setMonth(int m); void setYear(int y); private: int day, month, year; }; void Date::printDate() { cout << "今天是" << year << "年" << month << "月" << day << "日" << endl; } void Date::setDay(int d) { day = d; } void Date::setMonth(int m) { month = m; } void Date::setYear(int y) { year = y; } int main() { Date testDay; testDay.setDay(5); testDay.setMonth(10); testDay.setYear(2003); testDay.printDate(); return0; } 3.32 建立类cylinder, cylinder的构造函数被传递了两个double值,分别表示圆柱体的半径和高度。用类cylinder计算圆柱体的体积,并存储在一个double变量中。在类cylinder中包含一个成员函数vol,用来显示每个cylinder对象的体积。 const int PI = 3.14; class cylinder { private: double radius, height, volume; public: cylinder(int rad, int hei); double getVolume(); void vol(); }; cylinder::cylinder(int rad, int hei) { radius = rad; height = hei; } double cylinder::getVolume() { volume = PI * radius * radius *height; return volume; } void cylinder::vol() { cout << "圆柱体的体积是: " << volume < } 3.33 构建一个类book,其中包含有两个私有数据成员qu和price,将qu初始化为1~5,将price初始化为qu的10倍,建立一个有5个元素的数组对象。显示每个对象数组元素的qu*price值。 class book { private: int qu, price; public: book(int qu); int mult(); }; book::book(int q) { if(q < 1 || q > 5) qu = 1; } else { qu = q; } price = 10 * qu; } int book::mult() { return qu * price; } int main() { book books[5] = {1,2,3,4,5}; for(int i = 0; i < 5; i++) { cout << books[i].mult() << ""; } } 3.34 修改3.33,通过对象指针访问对象数组,使程序以相反的顺序显示每个对象数组元素的qu*price值。 class book { private: int qu, price; public: book(int qu); int mult(); }; book::book(int q) { if(q < 1 || q > 5) { qu = 1; else { qu = q; } price = 10 * qu; } int book::mult() { return qu * price; } int main() { book books[5] = {1,2,3,4,5}; book *p = books; p += 4; for(int i = 0; i < 5; i++) { cout << p->mult() << ""; --p; } return0; } 3.35 构建一个类Stock,含字符数组stockcode[]及整型数组成员quan、双精度型数据成员price。构造函数含3个参数:字符数组na[]及q、p。当定义Stock的类对象时,将对象的第一个字符串参数赋给数据成员stockcode,第2和第3个参数分别赋给quan、price。未设置第2和第3个参数时,quan的值为1000,price的值为8.98.成员函数print没有形参,需使用this指针,显示对象数据成员的内容。编写程序显示对象数据成员的值。 #include using namespace std; class Stock { private: char stockcode[25]; int quan; double price; Stock(char na[], int q = 1000, double p = 8.98); Stock(char na[]); void print(); }; Stock::Stock(char na[], int q = 1000, double p = 8.98) { strcpy(stockcode, na); quan = q; price = p; } void Stock::print() { cout << "stockcode: " << this->stockcode << " quan: " << this->quan << " price: " << this->price << endl; } int main() { Stock stock1("600001", 3000, 5.67); Stock stock2("600002"); stock1.print(); stock2.print(); return0; } 3.36 编写一个程序,已有若干学生的数据,包括学号、姓名、成绩,要求输出这些学生的数据并计算出学生人数和平均成绩(要求将学生人数和总成绩用静态数据成员表示)。 #include using namespace std; class student { private: char name[25], studentNo[10]; int score; static int sum; static int totalScore; 第3章面向对象程序设计基础 第3章面向对象程序设计基础 【1】什么是Java程序使用的类?什么是类库? 答:类是将一类事物的特性描述出来,然后如果用这个类来定义对象,则该对象就拥有了这个类所描述的所有特性。 在Java系统中,系统定义好的类根据实现的功能不同,可以划分成不同的集合,每个集合称为一个包,所有包合称为类库。 【2】如何定义方法?在面向对象程序设计中方法有什么作用? 答:方法的定义由两部分组成:方法声明和方法体。 方法的声明如下: 返回值类型方法名(参数类型形式参数1,参数类型形式参数2…){ 程序代码; 返回值; } 在面向对象程序设计中,方法的作用是完成对类和对象属性操作。 【3】简述构造方法的功能和特点。下面的程序片段是某学生为student类编写的构造方法,请指出其中的错误。 void Student(int no,String name) { studentNo=no; studentName=name; return no; } 答:构造方法的功能是:构造方法是一个特殊的方法,主要用于初始化新创建的对象; 特点:构造方法的方法名要求与类名相同,用户不能直接调用,只能通过new运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回void数据类型,即不能在构造方法前加void。 错误之处:(1)构造方法Student()前不能加void,(2)不能用return语句,(3)类名Student 首字母S改成小写s. 【4】定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。编写Java程序创建student类的对象及测试其方法的功能。 class Student { String id; String name; String sex; int age; void talk(){ 正确的泡茶步骤图解,茶道入门知识自古国人爱喝茶,常常以茶会友,但是在高信息大互联的时代,传统的茶道与茶艺改变着无数人们那根绷紧的神经。下面是为大家收集关于正确的泡茶步骤图解,茶道入门知识,欢迎借鉴参考。 茶道初学者泡茶步骤 一、温壶:用热水淋茶壶,提高茶壶温度,以免泡茶时水温被茶壶抢走,影响茶汤的风味。 二、置茶:等待茶壶温热的时间里,将要泡的茶叶从茶仓中取出,放入茶则(普及一下,茶则就是从茶叶罐里取茶叶用的工具和量器,词较生僻,刚入门时为显资深,常向外行秀此名)。这时可以请宾客赏茶,也借这个机会与客人交流,介绍他们认识此茶的特色,香气?颜色?外观?赏完茶后再放回原处。 三、温润泡:将热水均匀地淋在茶叶上,使茶叶受热即可,不需要太多的水,淋上后立刻倒出来。目的在使某些比较紧结的茶(像阿里山石棹一带的珠露茶)舒张,这样茶汤才会均匀好喝,也有些人觉得这样比较清洁,但并不是每一种茶都适合温润泡这道手续。 四、醒茶:将温润泡用的水完全倒到茶海当中,静待一段时间让茶叶舒缓。 五、冲泡:注水量以所泡的杯数决定,放入的茶种,与茶叶量多寡会影响冲泡所需的时间。 六、奉茶:将茶壶内所泡的茶完全倒于茶海中使茶色,茶味均衡并沉淀杂质。将茶倒入闻香杯中约七分满,或用扣杯的方式,正面图样对正面图像,倒过来奉茶增添品茶的乐趣(基于卫生考量,扣杯的方式只适用于第一泡)。 七、品茶:喝茶的时候不要手拿杯缘,如果以右手喝茶,应把中指放在杯腹十二点钟方位,拇指放六点钟方位,并以八点钟方位喝茶。并分成三次喝,感受热茶,温茶,与冷茶的滋味。 茶道初学者泡茶的注意 仪容礼表 泡茶的时候,女性要把长发挽起,以免头发掉落到茶汤里,而且妆容要以淡雅为主,不要过于浓妆艳抹;手上不宜配到过多首饰,会影响泡茶的美感;服装以配合茶会气氛或者茶具茶席为主,穿得朴素大方就好。 泡茶姿势 泡茶时屁股坐在凳子的三分之一处,身体要坐正、腰杆要挺直,在泡茶过程中也要保持身体的端正,不要因为倒水、持壶而把身体歪到一边。另外在泡茶过程中要放松全身的肌肉,不要因为紧张而显得过于拘谨,当你心情和身体都放松下来的话,泡茶的动作才会显得优美,有一气呵成的感觉。 清洁茶具 在泡茶之前,要先清洁茶具。就算茶具在之前已经清洗过了,还是得当着客人的面再清洗一遍。清洁茶具时不要用手触摸茶杯,而是用茶夹夹取茶杯用沸水进行清洁。 赏茶闻香 清洁完茶具后,把干茶倒进茶荷中,双手端起茶荷递给客人,让客人观赏一下干茶的外形香气。在茶艺表演中,一般会有闻香这一步,让客人闻香的时候,也是用双手拿起闻香杯优雅地递给客人进行闻香。 泡茶倒茶 中国茶文化简述 茶文化是茶艺与精神的结合,并通过茶艺表现精神。兴于中国唐代,盛于宋、明代,衰于清代。中国茶道的主要内容讲究五境之美,即茶叶、茶水、火候、茶具、环境。 茶文化要遵循一定的法则。唐代为克服九难,即造、别、器、火、水、炙、末、煮、饮。宋代为三点与三不点品茶,“三点”为新茶、甘泉、洁器为一,天气好为一,风流儒雅、气味相投的佳客为一。 中国茶道的具体表现形式有两种:煎茶。把茶末投入壶中和水一块煎煮。唐代的煎茶,是茶的最早艺术品尝形式。 斗茶。古代文人雅士各携带茶与水,通过比茶面汤花和品尝鉴赏茶汤以定优劣的一种品茶艺术。斗茶又称为茗战,兴于唐代末,盛 于宋代。最先流行于福建建州一带。斗茶是古代品茶艺术的最高表 现形式。 工夫茶。清代至今某些地区流行的工夫茶是唐、宋以来品茶艺术的流风余韵。清代工夫茶流行于福建的汀州、漳州、泉州和广东的 潮州。工夫茶讲究品饮工夫。 历史性 茶文化的形成和发展其历史非常悠久。武王伐纣,茶叶已作为贡品。原始公社后期,茶叶成为货物交换的物品。战国,茶叶已有一 定规模。先秦《诗经》总集有茶的记载。 汉朝,茶叶成为佛教“坐禅”的专用滋补品。魏晋南北朝,已有饮茶之风。隋朝,全民普遍饮茶。唐代,茶业昌盛,茶叶成为“人 家不可一日无”,出现茶馆、茶宴、茶会,提倡客来敬茶。宋朝、 流行斗茶,贡茶和赐茶。 清朝,曲艺进入茶馆,茶叶对外贸易发展。茶文化是伴随商品经济的出现和城市文化的形成而孕育诞生的。历史上的茶文化注重文 化意识形态,以雅为主,着重于表现诗词书画、品茗歌舞。茶文化 在形成和发展中,融化了儒家思想,道家和释家的哲学色泽,并演 变为各民族的礼俗,成为优秀传统文化的组成部分和独具特色的一 种文化模式。 时代性 物质文明和精神文明建设的发展,给茶文化注入了新的内涵和活力,在这一新时期,茶文化内涵及表现形式正在不断扩大、延伸、 创新和发展。新时期茶文化溶进现代科学技术、现代新闻媒体和市 场经济精髓,使茶文化价值功能更加显著、对现代化社会的作用进 一步增强。茶的价值是茶文化核心的意识进一步确立,国际交往日 益频繁。新时期茶文化传播方式形式,呈大型化、现代化、社会化 和国际化趋势。其内涵迅速膨胀,影响扩大,为世人瞩目。 民族性 各民族酷爱饮茶,茶与民族文化生活相结合,形成各自民族特色的茶礼、茶艺、饮茶习俗及喜庆婚礼,以民族茶饮方式为基础,经 艺术加工和锤炼而形成的各民族茶艺,更富有生活性和文化性,表 现出饮茶的多样性和丰富多彩的生活情趣。藏族、土家族、佤族、 拉祜族、纳西族、哈萨克族、锡伯族、保安族、阿昌族、布朗族、 德昂族、基诺族、撒拉族、白族、肯米族和裕固族等茶与喜庆婚礼,也充分展示茶文化的民族性。 地区性 名茶、名山、名水、名人、名胜、孕育出各具特色的地区茶文化。我国地区广阔,茶类花色繁多,饮茶习俗各异,加之各地历史、文化、生活及经济差异,形成各具地方特色的茶文化。在经济、文化 中心的大城市,以其独特的自身优势和丰富的内涵,也形成独具特 色的都市茶文化。上海自1994年起,已连续举办四届国际茶文化节,显示出都市茶文化的特点与魅力。 国际性 第1章习题答案 名词解释 抽象:抽象(Abstract)就是忽略事物中与当前目标无关的非本质特征,而强调与当前目标有关的本质特征,从而找出事物的共性,并把具有共性的事物划为一类。面向对象方法中的抽象,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。 封装:面向对象方法中的封装就是把将抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。 消息:消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。 填空题 (1) 面向过程的结构化程序设计方法面向对象程序设计方法 (2) 顺序选择循环 (3) 程序=数据结构+算法程序=对象+消息 (4) 过程类 (5) 抽象性封装性继承性多态性 选择题 (1) B (2) C (3) D (4) C (5) D (6) A (7) A (8) B C (9) A D 判断题 (1) t (2) f (3) f (4)f (5) t (6) f (7) f (8) t 简答题 (1) 结构化程序设计方法着眼于系统要实现的功能,从系统的输入和输出出发,分析系统要做哪些事情,进而考虑如何做这些事情,自顶向下地对系统的功能进行分解,来建立系统的功能结构和相应的程序模块结构,有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。 随着程序规模与复杂性的增长,这种面向过程的结构化程序设计方法存在明显的不足之处。首先是数据安全性问题,由于数据被每个模块所共用,因此是不安全的,一旦出错,很难查明原因。其次是可维护性及可重用性差,它把数据结构和算法分离为相互独立的实体,一旦数据结构需要改变时,常常要涉及整个程序,修改工作量极大并容易产生新的错误。每一种相对于老问题的新方法都要带来额外的开销。另外,图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。 (2) 面向对象的程序设计方法中,将程序设计为一组相互协作的对象(Object)而不是一组相互协作的函数。在程序中,属性用数据表示,用来描述对象静态特征;行为用程序代码实现,用来描述对象动态特征。可见,在面向对象的程序设计方法中,对象是数据结构和算法的封装体。对象之间存在各种联系,它们之间通过消息进行通信。程序可表示为: 程序=对象+消息 在面向对象程序设计中,它着重于类的设计。类正是面向对象语言的基本程序模块,通过类的设计,来完成实体的建模任务。类通过一个简单的外部接口,与外界发生关系。一个类中的操作不会处理到另一个类中的数据,这样程序模块的独立性、数据的安全性就有了良好的保障。程序的执行取决于事件发生的顺序,由顺序产生的消息来驱动程序的执行。不必预先确定消息产生的顺序,更符合客观世界的实际。并且面向对象程序设计方法提供了软件重用、解决大问题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。第3章 面向对象程序设计基础
正确的泡茶步骤图解,茶道入门知识
中国茶文化简述
面向对象程序设计教程 (马石安版)
(完整版)《面向对象程序设计》答案