1.下面建立友元的尝试有什么错误?
a.
class snap
{
friend clasp;……
};class clasp{……};
声明一个友元类需要使用以下格式
friend class clasp;
题目内没有使用关键字class,从而造成编译错误。
b.
class cuff
{
public:
void snip(muff &) {…}
};class muff
{
friend void 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的声明之前,因此需要多个前向声明以表示B是一个类,且要表示B类的多个成员方法。同样,如果B以A的一个成员函数作为友元,则在B之前也需要多个前向声明。因此,A,B的前向声明均无法实现。
3.下面的嵌套类声明中可能存在什么问题
class Ribs
{
private:
class Sauce
{
int soy;
int sugar;
public:
Sauce(int s1, int s2) : soy(s1), sugar(s2) {}
};
};
题目提供的代码在语法上是正确的,但是我们设计和使用嵌套类的主要目的是在隐藏部分细节的基础上,在类内部正常访问该类对象。但是Sauce类定义在私有部分,且Sauce的两个数据成员也是私有数据,因此在Ribs类内没有足够的接口,用于访问Sauce对象内的数据。解决方法是为Sauce添加相应接口函数,或者将成员设置为公有成员,便于在类外直接访问。
4.thorw 和 return之间的区别是?
thorw 和 return语句都会造成当前函数终止并返回,但是具体在实现上,尤其在函数数据栈的处理上是有差别的。假设函数f1()调用函数f2(),f2()中的返回语句导致程序会自动返回f1()函数,并且开始在函数f1()中调用函数f2()后面的一条语句。
throw语句导致程序沿函数调用的当前序列回溯,直到找到或间接包含对f2()的调用的try语句块为止.return语句可能在并不在f1()中,因此会持续回退,出现栈解退,直到找到这样的try语句块后,才执行下一个匹配的catch语句块,从而影响程序原本功能的实现。
5.假设有一个从异常基类派生出来的异常类层次结构,则应按什么顺序防止catch块
异常类的派生关系可以使用用户更加细致和针对性的处理程序设计中的异常问题,继承关系使用户可以使用捕获基类对象的方式一次性捕获所有派生类的异常。因此,为了更好的实现异常处理,catch块应当首先捕获继承中的派生类异常对象,随后逐渐从继承关系向上,捕获基类的异常,这样才能兼顾异常处理的针对性和全面性。
6.对于本章定义的Grand类,Superb类和Magnificient类,假设pg为Grand*指针,并将其中某个类对象的地址赋给了它,而ps为Superb*指针,则下面两个代码示例的行为有什么不同
7. static_cast运算符与dynamic_cast运算符有什么不同?
dynamic_cast运算符用于将派生类的指针转换为基类的指针,即允许沿类层次结构向上转换;而static_cast仅当两个类型能够进行隐式类型转换时才可以使用,它允许向上转换和向下转换。static_cast运算符还允许枚举类型和整型之间以及数值类型之间的转换。