第15章复习题答案
1.a.友元声明如下:
b.这需要一个前向声明,以便编译器能够解释void snip(muff&):
c.首先,cuff类声明应在muff类之前,以便编译器可以理解cuff::snip( )。其次,编译器需要muff的一个前向声明,以便可以理解snip(muff &)。
2.不。为使类A拥有一个本身为类B的成员函数的友元,B的声明必须位于A的声明之前。一个前向声明是不够的,因为这种声明可以告诉A:B是一个类;但它不能指出类成员的名称。同样,如果B拥有一个本身是A的成员函数的友元,则A的这个声明必须位于B的声明之前。这两个要求是互斥的。
3.访问类的唯一方法是通过其有接口,这意味着对于Sauce对象,只能调用构造函数来创建一个。其他成员(soy和sugar)在默认情况下是私有的。
4.假设函数f1( )调用函数f2( )。f2( )中的返回语句导致程序执行在函数f1( )中调用函数f2( )后面的一条语句。throw语句导致程序沿函数调用的当前序列回溯,直到找到直接或间接包含对f2( )的调用的try语句块为止。它可能在f1( )中、调用f1( )的函数中或其他函数中。找到这样的try语句块后,将执行下一个匹配的catch语句块,而不是函数调用后的语句。
5.应按从子孙到祖先的顺序排列catch语句块。
6.对于示例#1,如果pg指向一个Superb对象或从Superb派生而来的任何类的对象,则if条件为true。具体地说,如果pg指向Magnificent对象,则if条件也为true。对于示例#2,仅当指向Superb对象时,if条件才为true,如果指向的是从Superb派生出来的对象,则if条件不为true。
7.Dynamic_cast运算符只允许沿类层次结构向上转换,而static_cast运算符允许向上转换和向下转换。static_cast运算符还允许枚举类型和整型之间以及数值类型之间的转换。