《C++ Primer Plus(第六版)》(32)(第十五章 友元、异常和其他 复习题答案)
2016-12-29 22:50
573 查看
15.7 复习题
1.下面建立友元的尝试有什么错误?
a.
class clasp;
class snap { friend clasp; ... }; class clasp{ ... };
b.muff类不可见,需要向前声明
class muff;
class cuff { public: void snip(muff&){..} ... }; class muff { friend void cuff::snip(muff& ); ... };c.cuff类不可见,应该在muff之前声明,muff要加个向前声明。
class muff;
class cuff
{
public:
void snip(muff&){...}
...
};
class muff
{
friend void cuff::snip(muff & );
...
};
2.您知道了如何建立相互类友元的方法。能够创建一种更为严格的友情关系,即类B只有部分成员是类A的友元,而类A只有部分成员是类B的友元吗?请解释原因。
不能,要指定部分友元,要知道类的细节,总有一个先后顺序的。所以无法实现。
3.下面的嵌套类声明中可能存在什么问题?
class Ribs
{
private:
class Sauce
{
int soy;
int sugar;
public:
Sauce(int s1, int s2):soy(s1), sugar(s2){}
}
...
};Sauce的成员无法被访问。
4.throw和return之间的区别何在?
return是正常的返回,而且返回函数被调用的地方,然后继续往下执行。
throw是抛出异常,沿着调用的当前序列回溯一路往上,直到被捕抓到为止,然后执行catch块的语句。
5.假设有一个从异常基类派生来的异常类层次结构,则应按什么样的顺序放置catch块?
从派生类开始,一直到基类,再到上一层的基类。
6.对于本章定义的Grand、Superb 和Magnificent类,假设pg为Grand*指针,并将其中某个类的对象地址赋给了它,而ps为Superb*指针,则下面两个代码示例的行为有什么不同?
if(ps = dynamic_cast<Superb*>(pg)
ps->say();
if(typeid(*pg) == typeid(Superb))
((Superb*) pg)->say();对于Superb的子类,第一个例子是有效的,if内为true,但是第二个例子就无效了,if内为false。
7.static_cast运算符与dynamic_cast运算符有什么不同?
static_cast是编译时检测,允许向上转换和向下转换,还允许枚举类型和整形之间以及数值类型之间的转换,可以转换编译器进行隐式转换的类型
dynamic_cast是运行时转换,只允许沿着层次结构向上转换,如果不行的话就返回空指针。
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.clasp类不可见,需要向前声明
class clasp;
class snap { friend clasp; ... }; class clasp{ ... };
b.muff类不可见,需要向前声明
class muff;
class cuff { public: void snip(muff&){..} ... }; class muff { friend void cuff::snip(muff& ); ... };c.cuff类不可见,应该在muff之前声明,muff要加个向前声明。
class muff;
class cuff
{
public:
void snip(muff&){...}
...
};
class muff
{
friend void cuff::snip(muff & );
...
};
2.您知道了如何建立相互类友元的方法。能够创建一种更为严格的友情关系,即类B只有部分成员是类A的友元,而类A只有部分成员是类B的友元吗?请解释原因。
不能,要指定部分友元,要知道类的细节,总有一个先后顺序的。所以无法实现。
3.下面的嵌套类声明中可能存在什么问题?
class Ribs
{
private:
class Sauce
{
int soy;
int sugar;
public:
Sauce(int s1, int s2):soy(s1), sugar(s2){}
}
...
};Sauce的成员无法被访问。
4.throw和return之间的区别何在?
return是正常的返回,而且返回函数被调用的地方,然后继续往下执行。
throw是抛出异常,沿着调用的当前序列回溯一路往上,直到被捕抓到为止,然后执行catch块的语句。
5.假设有一个从异常基类派生来的异常类层次结构,则应按什么样的顺序放置catch块?
从派生类开始,一直到基类,再到上一层的基类。
6.对于本章定义的Grand、Superb 和Magnificent类,假设pg为Grand*指针,并将其中某个类的对象地址赋给了它,而ps为Superb*指针,则下面两个代码示例的行为有什么不同?
if(ps = dynamic_cast<Superb*>(pg)
ps->say();
if(typeid(*pg) == typeid(Superb))
((Superb*) pg)->say();对于Superb的子类,第一个例子是有效的,if内为true,但是第二个例子就无效了,if内为false。
7.static_cast运算符与dynamic_cast运算符有什么不同?
static_cast是编译时检测,允许向上转换和向下转换,还允许枚举类型和整形之间以及数值类型之间的转换,可以转换编译器进行隐式转换的类型
dynamic_cast是运行时转换,只允许沿着层次结构向上转换,如果不行的话就返回空指针。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解