《C++ primer plus》第15章:友元、异常和其他(8)

复习题

  1. 下面建立友元的尝试有什么错误?
    a.

    class snap {
    	friend clasp;
    	...
    };
    class clasp { 
    ...
    };
    

    b.

    class cuff {
    public:
    	void snip(muff &) { ... };
    	...
    };
    class muff {
    	friend void cuff::snip(muff &);
    	...
    };
    

    c.

    class muff {
    	friend void cuff::snip(muff &);
    	...
    };
    class cuff {
    public:
    	void snip(muff &) { ... }
    };
    

    答:
    a.
    声明友元类的时候要指明该标识符是类:

    friend class clasp;
    

    b.
    在cuff类中声明snip函数的时候,函数的参数使用muff标识符,但是muff类是在cuff类之后声明的,所以会无法识别该标识符,应该在cuff类声明前加一个muff类的前置声明:

    class muff;
    class cuff {
    ...
    };
    class muff {
    ...
    };
    

    c.
    在muff类中声明cuff类的成员函数snip为友元的时候,还没有声明cuff类,应该将cuff类的声明放在前面,使muff知道cuff类的snip函数,同时在cuff类前面加上muff类的前置声明,使cuff类的snip函数能够识别 muff;

    class muff;
    class cuff{
    public:
    	void snip(muff &);
    };
    class muff {
    	friend void cuff::snip(muff &);
    	...
    };
    
  2. 您知道了如何建立相互类友元的方法。能够创建一种更为严格的友情关系,即类 B 只有部分成员是类A的友元,而类A只有部分成员是类B的友元吗?请解释原因。
    不能。要让类 A 拥有一个本身为类 B 的成员函数的友元,B 的声明必须位于 A 的声明前面。一个前向声明是不够的,因为前向声明只能告诉A:B是一个类;但它不能指出类成员的名称。同样,如果B拥有一个本身是A的成员函数的友元,则 A 的声明必须位于 B 的声明之前。这两个要求是互斥的。

  3. 下面的嵌套类声明中可能存在什么问题?

    class Ribs {
    private:
    	class Sauce {
    		int soy;
    		int sugar;
    	public:
    		Sauce(int s1, int s2) : soy(s1), sugar(s2) { }
    	};
    	...
    };
    

    答:将嵌套类的soy 和 sugar成员设置为了私有的,这样外围类的成员函数无法访问到它们。

  4. throw 和 return 之间的区别何在?
    答:return返回到函数的位置,从该位置的下一条语句继续执行;throw 通过栈解退找到包含函数的try语句块,该函数可能是该函数的调用函数也可能是调用函数的调用函数甚至更多层,找到这样的try语句块后,将执行紧邻的匹配的catch语句块。

  5. 假设有一个从异常基类派生来的异常类层次结构,则应按什么样的顺序放置 catch 块?
    答:应该按照从后代到祖先的顺序来放置 catch 块。

  6. 对于本章定义的 Grand、Superb 和 Magnificent 类,假设 pg 为 Grand * 指针,并将其中某个类的对象地址赋给了它,而 ps 为 Superb * 指针,则下面的两个代码示例的行为有什么不同?

    if ( ps = dynamic_cast<Superb *> (pg) ){
    	ps -> say();		// sample #1
    }
    if (typeid(*pg) == typeid(Superb) ){
    	(Superb * ) pg -> say();		// sample #2
    }
    

    答:
    对于示例#1,pg 指向的是Superb 类的对象或者 Superb 的派生类的对象,结果都为 true;
    对于示例#2,pg 只有指向 Superb 类的对象结果才为 true。

  7. static_cast 运算符与 dynamic_cast 运算符有什么不同?
    答:
    dynamic_cast 只允许沿层次结构向上转换;
    static_cast 允许沿层次结构向上或者向下转换,且static_cast 还允许枚举类型和整型之间以及数值类型之间的转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值