《C++ primer plus》第15章:友元、异常和其他(8)
创始人
2024-05-20 19:34:14
0

复习题

  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 (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 还允许枚举类型和整型之间以及数值类型之间的转换。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...