C++第15章 友元、异常和其他(友元类方法、嵌套类、try、catch)

15.1 友元

类并非只能拥有友元函数,也可以将类作为友元。在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元。
(如遥控器和电视机,两者并非同一类,但是遥控器可以改变电视机的状态,此时可将遥控器作为电视机的一个友元。)
友元声明:
在这里插入图片描述
(友元声明可以位于公有、私有或保护部分,其所在的位置无关紧要,友元类中的方法可以将原始类对象引用作为参数)
友元成员函数(仅让特定的类成员成为另一个类的友元)
在这里插入图片描述
为了让编译器知道友元类的存在,必须把友元类放到原始类前面,但是友元类中也有原始类,因此要在友元类之前进行类声明:
在这里插入图片描述

(不能先声明友元类,再把友元类放到原始类后面,另外,友元类的声明只包含方法声明,实际的方法定义应放在原始类之后)
在这里插入图片描述
让类彼此成为对方的友元:
在这里插入图片描述

共同的友元:函数需要访问两个类的私有数据。
在这里插入图片描述

15.2 嵌套类(新增的C++实现)

在C++中,可以将类声明放在另一个类中。在另一个类中声明的类被称为嵌套类,它通过提供新的类型类作用域来避免名称胡乱。包含类的成员函数可以创建和使用被嵌套的对象;而仅当声明位于公有部分,才能在包含类的外面使用嵌套类,而且必须使用作用域解析运算符。
包含意味着将类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义了一种类型,该类型仅包含嵌套类声明的类中有效。(嵌套类只能在包含嵌套类的类中使用,有点像类方法)
在这里插入图片描述

在这里插入图片描述
(想在方法文件中定义嵌套类的方法,需要通过使用两次作用域解析运算符来完成)
作用域:和被嵌套的类中的成员是一样的
在这里插入图片描述
(枚举和结构可以看成是特殊的嵌套类,嵌套类也可以看成是特殊的类成员)

15.3 异常(C++新的实现)

abort()函数:
在这里插入图片描述
返回错误码:使用函数的返回值来解决问题。
异常机制:
在这里插入图片描述
程序在出现问题时将引发异常。
在这里插入图片描述
在这里插入图片描述
通常,引发异常的函数将传递一个对象,可以使用不同的异常类型来区分不同的函数在不同情况下引发的异常,另外,对象携带的信息可以让程序员确定引发异常的原因。同时,catch可以根据这些信息来决定采取什么样的措施。

栈解退:在try块中的函数发生异常后,寻找当前try块的catch语句对应的类型,如果没有则向上一层寻找(将调用权限给上一层),直到找到对应的catch语句…如果找到最上层也就是main函数里面没有与异常对应的类型,则程序直接崩溃结束.(栈: 遇到throw后,栈中的数据将依次释放直到遇到一块位于try块中的返回地址) 这个过程被称为栈解退. 这一阶段是可以自动调用类的析构函数(如果有类对象的话)
return 为返回,每个函数调用另一个函数,都会将被调函数的指令地址存于主调函数的栈中,函数层层调用,栈也层层叠加,在return时,当前函数返回给上级函数,直至上级函数return才返回给上上级函数,同时return的函数栈释放,以此类推。

throw 为抛出异常,其目标不再是上层函数,而是try块,try块在哪,它在哪里停止,在层层调用函数下,底层函数throw,会按顺序释放栈,直至遇到try块。

简单一句话:调用return的函数返回上一级,直至在上一级遇到return才会返回上上级,而上一级return之前的语句照常执行。
调用throw,自下往上以此释放栈,直到在某一级函数遇见try块,中间级函数的其他代码部分无法继续执行。

异常、类和继承以三种方式相互关联。首先,从一个异常类派生出另一个;其次,可以在类定义中嵌套异常类声明来组合;第三,这种嵌套声明本身可以被继承,还可以用作基类。

15.4 RTTI(运行阶段类型识别)

RTTI只适用于包含虚函数的类。
在这里插入图片描述
dynamic_cast能够回答“是否可以安全地将对象的地址赋给特定类型的指针”这样的问题
在这里插入图片描述
(指针pg的类型是否可被安全地转换为Superb*?如果可以将返回对象的地址,否则返回一个空指针)
typeid运算符使得能够确定两个对象是否为同种类型。
在这里插入图片描述
type_info返回的通常是类的名称
在这里插入图片描述

15.5 类型转换运算符

在这里插入图片描述
在这里插入图片描述
(除了const 或volatile特征可以不同外,type_name和expression的类型必须相同)

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值