2.7 自测习题答案
1. 私有成员。
2. 类的所有使用者都可以使用类的公有成员。成员函数经常声明为公有,以便使用者能够调用这些函数来操作类的实例。
3. true和false。
4. 类是一种数据类型,它定义了数据成员以及操作这些数据的成员函数。对象是类的一个实例,并声明为一个变量。一旦定义了一个类,程序员就能够声明许多类的对象,并使用类的函数来操作这些对象。
5. 常量成员函数不能对对象的成员变量做任何修改。
6. 生存空间解析操作符用在每个成员函数实现的前面。参考2.1节中的使用生存空间解析操作符的示例。
7. 程序应当包含下列语句:
throttle exercise;
exercise.shut_off( );
exercise.shift(3);
cout << exercise.flow( ) << endl;
8. 新成员函数的原型放在类定义中。函数实现如下:
bool throttle::is_above_half( ) const
// Precondition: shut_off has been called at
// least once to initialize the throttle.
// Postcondition: The return value is true if
// the current flow is above 0.5.
{
return (flow( ) > 0.5);
}
9. 在类定义的公有段中:
bool is_above_half( ) const
{ return (flow( ) > 0.5); }
10. 编译器会自动创建一个简单的默认构造函数。
11. 应当去掉关键字void。构造函数没有返回类型。
12. 新构造函数的原型放在类定义中。构造函数的实现如下:
throttle::throttle
(int size, int initial)
// Precondition: (0 < size) and
// (0 <= initial <= size).
// Postcondition: The throttle has size
// positions above the shutoff position, and
// it is currently in the position given by the
// parameter initial.
// Libraries used: cassert
{
assert(size > 0);
assert(initial >= 0);
assert(initial <= size);
top_position = size;
position = initial;
}
13. 有关使用类所需要的全部信息都放在头文件前面的注释中。
14. 宏保护用于防止意外的重复类定义。通常,如果程序多次包含同一个头文件,编译将会失败。宏保护用于指导编译器跳过重复的类定义。
15. 自动赋值操作符将会复制x的成员变量到y中。
16. 自动复制构造函数将会把y初始化为x的一个副本(通过复制成员变量)。
17. #include "throttle.h"
using namespace main_savitch_2A;
18. 提示:将当前角度设为一个私有成员变量,并予以跟踪。如果变量小于零,或者>=360,那么重新调整该变量,使它始终位于0~360之间。
19. 参考图14-1获取部分解决方案。
20. 对于任意数据项,如果它没有被显式地置于一个命名空间中,那么它将成为全局命名空间的一部分;在使用这类数据项时,不需要using语句或生存空间解析操作符。
21. 绝不能把using语句放在头文件中;使用第三种形式。
22. 将构造函数的原型修改如下:
throttle(int size = 1, int initial = 0)
不再需要另外两个构造函数。
23. rotate_to_upper_right能够改变p,因为它的参数是引用参数。但是调用rotations_needed不能改变p,因为它使用的是值参数。
24. 函数参数列表中的参数指的是形参,它与函数调用期间传递给函数的值相区别。实参指的就是传递的值。
25. 如果希望实参保持不变,x应当为一个值参数。如果希望通过改变x来影响实参,x应当为一个引用参数。x不能作为常量引用参数,因为函数体内修改了这一参数。
26. 对于大型数据类型来说,值参数是低效的,因为要复制它们的值。然而,引用类型也是不安全的,因为它们可以被改变。常量引用参数通过提供不能被修改的引用参数,提供了最好的解决方案。
27. 实现如下:
int operator < (
const throttle& t1,
const throttle& t2,
)
// Postcondition: The return value is true if
// the flow of t1 is less than the flow of t2.
{
return (t1.flow( ) < t2.flow( ));
}
28. 答案与2.5.2节中的重载操作符+相同,但要将加号替换为减号。
29. 这条建议支持信息隐藏,因为实现类的程序员是唯一了解私有成员的人。
30. 友元函数并不是被类的特定对象激活,因此,友元函数访问的成员变量之前必须要有对象变量的名称,如下所示:
ins >> target.x >> target.y;
31. 实现如下(自行添加后置条件):
ostream& operator << (
ostream& outs,
const throttle& source
)
{
outs << 100*source.flow( ) << '%';
return outs;
}
32. newpoint.cxx的顶部包含一则简短的注释,表明有关如何使用point类的文档说明放在头文件中。函数实现位于这则注释之后,其中包括图2-19中列出的所有函数(不包括get_x和get_y,因为它们是内联函数)。这些函数的实现必须位于一个命名空间分组中。在头文件中,使用了命名空间main_savitch_2B,以避免与初期的point类(位于命名空间main_savitch_2A中)发生冲突。







