1、C+面向对象程序设计教程第3版陈维兴林小茶课后习题答案C+面向对象程序设计教程课后题答案1.1 什么是面向对象程序设计 ?面向对象程序设计是一种新的程序设计范型 . 这种范型的主要特征是 :程序=对象+消息面向对象程序的基本元素是对象。主要结构特点是:第一, 程序一般由类的定义和类的使用两部分组成;第二, 程序中的一切操作都是通过向对象发送消息来实现的。1.2 什么是对象 ?什么是类 ?对象与类之间的关系是什么 ?对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。类就是具有相同的数据和相同的操作的一组对象的集合, 也就是说, 类是对具有相同数据结构和相同操作的一类对象的
2、描述。类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,一个对象是类的一个实例。1.3 现实世界中的对象有哪些特征?请举例说明。现实世界中的对象具有以下特征:1) 每一个对象必须有一个名字以区别于其他对象;2) 用属性来描述对象的某些特征;3) 有一组操作,每组操作决定对象的一种行为;4) 对象的行为可以分为两类:一类是作用于自身的行为,另一类是作用于其他对象的行为。例如一个教师是一个对象。 每个教师对象有自己的名字来和别的教师区别。 教师具有编号,姓名,年龄,职称,专业等属性。教师拥有走路,吃饭,授课等行为操作。走路,吃饭是作用于自身的行为,授课是作用于其他对象的行为。1
3、.4 什么是消息?消息具有什么性质?一个对象向另一个对象发出的请求成为“消息”。消息具有以下 3 个性质:1) 同一个对象可以接收不同形式的多个消息,做出不同的相应;2) 相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的;3) 对消息的响应并不是必须的,对象可以响应消息,也可以不响应。1.5 什么是抽象和封装?请举例说明。抽象是将有关事物的共性归纳、集中的过程。例如:把所有具有大学生学籍的人归为一类, 成为“大学生”,这就是一个抽象。封装是指把数据和实现操作的代码集中起来放在对象内部, 并尽可能隐藏对象的内部细节。例如:每一台洗衣机都有出厂日期、机器编号等属性,也有启动、暂停、选择
4、等操作。人们在使用洗衣机的时候只需要按下对应的按钮, 而不用关心具体的内部实现。这就是封装。1.6 什么是继承?请举例说明。继承就是允许派生类使用基类的数据和操作, 同时,派生类还可以增加新的操作和数据。例如:哺乳动物是一种热血、有毛发、用奶哺育幼崽的动物; 狗是有犬牙、食肉、特定的骨骼结构、群居的哺乳动物。 狗就继承了哺乳动物。1.7 若类之间具有继承关系,则他们之间具有什么特征?若类之间具有继承关系,则他们之间具有下列几个特征:1) 类间具有共享特征(包括数据和操作代码的共享);2) 类间具有差别或新增部分(包括非共享的数据和操作代码);3) 类具有层次结构。1.8 什么是单继承、多继承?
5、请举例说明。单继承是指每个派生类只直接继承了一个基类的特征。例如狗继承自哺乳动物。多继承是指多个基类派生出一个派生类的继承关系。 比如玩具车同时继承自玩具和车。1.9 什么是多态?请举例说明。多态是指不同的对象收到相同的消息时执行不同的操作。例如,有一个窗口类对象,还有一个棋子类对象。当我们发出“移动”消息时,两个对象的行为不同。1.10 面向对象程序设计的主要优点是什么?1. 可提高程序的重用性;2. 可控制程序的复杂性;3. 可改善程序的可维护性;4. 能够更好地支持大型程序设计;5. 增强了计算机处理信息的范围;能够很好地适应新的硬件环境。2.1 简述 C+的主要特点。1) C+ 是C的
6、超集,保持与 C的兼容。2) 保持了 C的简洁、高效和接近汇编语言等特点,并对 C的功能作了不少扩充。用 C+编写的程序比 C更安全,可读性更好,代码结构更为合理。3) 程序质量高。4) 增加了面向对象机制。1.11#include using namespacestd;int main()int a, b, d, min;cout 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;retu
7、rn 0;cout The lowest common denominator is d endl;return 0;1.12 有效1.13 没有函数声明;函数定义没有写返回值类型。1.14 (1)等价,函数声明可以省略参数的名字。(2)不等价,第二个的函数定义不能省略参数的名字。1.15-2.10 CDAAB6.-2.15 ACBDC2.2-2.17 DC2.181012.1910 102.2010202.21 举例说明可以使用 const 替代#define 以消除#define 的不安全性。#include using namespacestd;int main()int a = 1;#
8、define T1 a+a#define T2 T1-T1cout T2 is T2 endl;return 0;上面这个程序,初看应该输出 T2 is 0但是实际上,得出 T2 is 2如果把#define 换成 const , 则可以输出想要的结果。1.16 用动态分配空间的方法, 计算 Fibonacci 数列的前 20项,并存储到动态分配的空间中。#include using namespacestd;int main() int *pi = new int 20;*pi = 1;pi 1 = 1;for ( int i = 2; i 20; i+)pii = pii - 2 + pi
9、i - 1;return 0; 1.17 重载 sroot 函数,输出一个数的二次方根。#include using namespacestd;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()return 0;1.18 解决百钱问题。将一元人民币换成 1、2、5 分的硬币,有多少种换法
10、?#include using namespacestd;int main()int num = 0; / 总共换法的总数。初始化为 0。for ( int i = 0; i = 100; i+) for ( int j = 0; 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 个; 100)break ;cout num endl;return 0;1.19 输入两个整数,按由小到大的顺序输出。要求使用变量的引用。#include usin
11、g namespacestd;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;return 0;1.20 用二分法求解 f(x)=0 的根。#include using namespacestd;double Fun( double x)return 35*x + 25; / 假设 f(x)=35x+25int main() double a, b;cin a;if (Fun(a) = 0)cout x =
12、a b;while (Fun(a) * Fun(b) = 0);if (Fun(b) = 0)cout x = b b)a = a + b;b = a - b;a = a - b;while ( 1)if (Fun(a + b)/ 2) = 0)cout x = (a + b)/ 2 endl;return 0;if (Fun(a) * Fun(a + b)/ 2) 0)b = (a + b)/ 2;if (Fun(b) * Fun(a + b)/ 2) 0)a = (a + b)/ 2;return 0;1.21 类声明的一般格式是什么 ?class 类名 private :私有数据成员和成
13、员函数 public :公有数据成员和成员函数1.22 构造函数和析构函数的主要作用是什么?它们各自有什么特性?构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。构造函数的名字必须与类名相同, 而不能由用户任意命名。 它可以有任意类型的参数,但不能具有返回值类型。析构函数通常用于执行一些清理任务,如释放分配给对象的内存空间等。析构函数名与类名相同, 但它前面必须加一个波浪号。 不能有返回值, 也不能有参数。1.23 什么是对象数组?所谓对象数组,是指每一个数组元素都是对象的数组。1.24 什么是 this 指针?它的主要作用是什么?C+ 为成员函数提供了一个名为 this 的
14、指针,这个指针称为自引用指针。每当创建一个对象时,系统就把 this 指针初始化为指向该对象。一个类的所有对象合用一份成员函数, this 指针可以帮助对象辨别出当前调用的是自己的那个对象的数据成员和函数。1.25 友元函数有什么作用?友元函数可以在类的外部访问类的私有成员或保护成员。1.26(1)声明并定义了 P2, P3, 并用默认无参构造函数初始化。(2)声明并定义了 P2, 并调用 Point 类的拷贝构造函数用 P1对 P2进行初始化。(3)声明并定义了 P2, 并调用 Point 类的拷贝构造函数用 P1对 P2进行初始化。(4)调用拷贝构造函数,将 P1的成员值赋值给 P4的成员
15、。1.27-3.10 BCCB7.-3.15 BAABA2.3-3.17 BB10,2030,4850,6870,8090,1611,1201.28Constructing10100Destructing1.293objects in existence4objects in existence after allocation3objects in existence after deletion1.30Counting at0Counting at91.31Default constructor called.Default constructor called.Default const
16、ructor called.Construcotor:a=1,b=2Construcotor:a=3,b=4Construcotor:a=5,b=61.32Con.Copy con.default.Copy con.1.33A=5B=14A=9B=141.345,78.1.35ConstructingConstructingA=5B=15A=10B=15DestructingDestructing1.36void pintStu(); 函数只有声明,没有定义。age 是私有成员,不能用对象直接调用。1.37void printStu() 和 void setSno(int s) 没有加限定符
17、Student:void setAge(int a) 在类中没有声明1.38构造函数不能定义为私有。否则无法创建对象。1.39 下面是一个计算器类的定义,请完成该类成员函数的实现。class counterpublic :counter( int number);void increment(); / 给原始值加 1void decrement(); / 给原始值减 1int getvalue(); / 取的计数器值int print(); / 显示计数private :int value;counter:counter( int number)value = number;void coun
18、ter:increment()+value;void counter:decrement()-value;int counter:getvalue()return value;int counter:print()cout value endl;return value;1.40 根据注释语句提示,实现类 Date 的成员函数#include using namespacestd;class Datepublic :void printDate();void setDay( int d); void setMonth( int m);void setYear( int y);private :
19、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();return 0; 1.4
20、1 建立类 cylinder, cylinder 的构造函数被传递了两个 double 值,分别表示圆柱体的半径和高度。用类 cylinder 计算圆柱体的体积,并存储在一个 double 变量中。在类 cylinder 中包含一个成员函数 vol,用来显示每个 cylinder 对象的体积。const int PI = 3.14 ;class cylinderprivate :double radius, height, volume;public :cylinder( int rad, int hei);double getVolume();void vol();cylinder:cyli
21、nder( int rad, int hei)radius = rad;height = hei;double cylinder:getVolume()volume = PI * radius * radius *height;return volume;void cylinder:vol()cout 圆柱体的体积是: volume endl;1.42 构建一个类 book,其中包含有两个私有数据成员 qu 和 price,将 qu 初始化为 15,将price 初始化为 qu 的 10 倍,建立一个有 5 个元素的数组对象。显示每个对象数组元素的qu*price 值。class bookpr
22、ivate :int qu, price;public :book( int qu);int mult();book:book( int q)if (q 5)qu = 1;elsequ = 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 booksi.mult() ;1.43 修改 3.33,通过对象指针访问对象数组,使程序以相反的顺序显示每个对象数组元素的 qu*price 值。class bookpr
23、ivate :int qu, price;public :book( int qu);int mult();book:book( int q)if (q 5)qu = 1;elsequ = 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 mult() ;-p;return 0;1.44 构建一个类 Stock,含字符数组 stockcode 及整型数组成员 q
24、uan、双精度型数据成员price。构造函数含 3 个参数:字符数组 na及 q、p。当定义 Stock 的类对象时,将对象的第一个字符串参数赋给数据成员 stockcode,第 2 和第 3 个参数分别赋给 quan、price。未设置第 2 和第 3 个参数时, quan 的值为 1000,price 的值为 8.98.成员函数 print 没有形参,需使用 this 指针,显示对象数据成员的内容。编写程序显示对象数据成员的值。#include using namespacestd;class Stockprivate :char stockcode 25;int quan;double
25、price;public :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: stockcode quan: quan price: price endl;int main()Stock stock1( 600001 , 3000, 5.67
26、);Stock stock2( 600002 );stock1.print();stock2.print();return 0;1.45 编写一个程序,已有若干学生的数据,包括学号、姓名、成绩,要求输出这些学生的数据并计算出学生人数和平均成绩(要求将学生人数和总成绩用静态数据成员表示)。#include using namespacestd;class studentprivate :char name 25, studentNo 10;int score;static int sum;static int totalScore;public :student( char na, char stuNo, int sc);void show();static void showTotal();student:student( char na, char stuNo, int sc)strcpy(name, na);strcpy(studentNo, stuNo);score = sc;+sum;totalScore += sc;void student:show()cout 姓名: name endl;cout 学号: studentNo endl;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1