C++ Primer Plus学习之友元异常及其他

2023-11-05 15:08

本文主要是介绍C++ Primer Plus学习之友元异常及其他,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

友元关系

       类的友元关系除了函数外,还可以定义友元成员函数,友元类来对相关类进行访问。

       而友元声明可以位于公有、私有或者保护部分,其所在的位置无关紧要。

       在定义友元关系时,需要注意前向声明概念(forward declaration)。如果一个类中将另一个类的成员函数或者整个类作为友元关系,需要在该类的声明之前对友元类进行声明。因此,无法创建一种友元关系,使其满足类B中的部分成员是类A的友元,类A的部分成员是类B的友元。因为这样无法做到前向声明。

嵌套类

       使用嵌套类的初始原因是为了提供新的类型类作用域来避免名称混乱。

       因此对于嵌套类的声明,应该将类中的所有元素声明为公有类型,否则就失去了嵌套类的意义了。当然,嵌套类声明位于私有还是保护还是公有部分,在继承关系和作用域上,和普通的类成员一样。

异常处理

       对异常的处理有三个组成部分:

              1. 引发异常(对于程序中可能出错的地方,使用引发异常机制,调用throw来完成对异常的跳转,将异常交给上一层进行处理;

              2. 使用处理程序捕获异常,使用catch关键字来捕获异常,并判断异常的类型。在catch对应的大括号内,完成对异常的处理;

              3. 使用try块。try块标示一部分可能引发异常的代码块,后面跟一系列的catch语句用来捕获引发的异常操作,然后进行异常处理。

       栈解退的概念(unwinding the stack):

              栈解退不同于常规的函数调用。如果在程序中引发了异常,会从引发异常函数所在的栈地址一直往上回溯,直到找到第一个对应的try块为止,释放栈中从引发异常的地方到try块之间的所有内容。如果这中间存在的类对象,则引发该类的析构函数来对类对象进行处理。

              因此这里就会有个比较函数返回throw的区别。 return只处理函数在栈中的对象,而throw则处理try和catch之间的所有栈对象。

       try-catch中一般将派生类的处理放在前面,基类的处理放在后面。

       如果没有捕获处理异常,程序不会立刻结束,而是会调用terminate函数,terminate函数会调用abort函数。因此如果在异常出现执行特殊的操作时,可以修改terminate函数。

RTTI

      运行阶段类型识别(Runtime type identification)。三个支持RTTI的元素:

             1. dynamic_cast;指向基类的指针指向派生类

             2. typeid运算符返回一个指出对象类型的值

             3. type_info结构体存储有关特定类型的信息。

     RTTI只适用于包含虚函数的类。

类型转换

       dynamic_cast:适用于将派生类的指针赋给基类的指针。只能在类层次结构上向上转换。

       const_cast:适用于解除const、volatile类型的变量特性,使其赋值给一个常规的量。

       static_cast:能在类层次上进行上下转换;整型转换为枚举;数值之间的转换。

       reinterpret_cast:适用于指针类型的转换,慎用。

 

 

这篇关于C++ Primer Plus学习之友元异常及其他的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350648

相关文章

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

SpringBoot的全局异常拦截实践过程

《SpringBoot的全局异常拦截实践过程》SpringBoot中使用@ControllerAdvice和@ExceptionHandler实现全局异常拦截,@RestControllerAdvic... 目录@RestControllerAdvice@ResponseStatus(...)@Except

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra