C++,异常、转换函数、智能指针

news2024/11/27 7:39:34

目录

一、异常

1 C++ 异常机制:

2 使用try catch进行异常处理.

3、c++ 已经内置标准异常类,专业用于抛出的语法中

4 自定义异常:

5 函数只抛出,不处理。让上层函数处理,并且上层函数还可以不处理,让上上层函数处理,以此类推。

二、转换函数

三、智能指针

1 unique_ptr,

2 shared_ptr

3 weak_ptr


一、异常

1 C++ 异常机制:

        可以让程序在即将发生异常前被处理,不会让程序因为发生异常而终止。

2 使用try catch进行异常处理.

处理执行try块的代码,如果执行throw 数据, 则try中余下的代码都不执行,进行进入catch中执行,而catch中参数会收到throw 执行出的数据。catch执行结束后,程序从catch后面的代码继续执行

抛出的该数据可以是基础类型,也可是对象.

示例1: 抛出int型数据

示例2:抛出字符串

示例3:抛出对象

该示例是一个不规范的示例,此处给出,只为讲清楚异常的机制

3、c++ 已经内置标准异常类,专业用于抛出的语法中

异常类使用时, 导入,并且异常类的名称空间为std

示例1:抛出exception异常

示例2:抛出invalid_argument异常

该异常对象构造函数还字符串参数。

4 自定义异常:

    一般继承exception来实现,理论上也可以通过继承exception的子类来实现

5 函数只抛出,不处理。让上层函数处理,并且上层函数还可以不处理,让上上层函数处理,以此类推。

示例1:

 在函数后面指定能抛出的异常数据类型

 指定抛出的是类时,实计抛出的可以是指定类和派生类的对象

    如果函数抛出throw()则表示不能抛出异常,该方式现在已经建议使用(11版本开始) const noexcept代替,就像前面使用const char* what() const noexcept , 表示不能抛出异常。

二、转换函数

1 概念:

转换函数的实质就是运算符重载,只是重载的运算符不是内置的运算符而是类名这个特殊的自定义类型。

2 自定义转换函数

(1)语法形式:

operator 类型名( )

{

    实现转换的语句

}

(2)转换函数的基本规则:

转换函数只能是成员函数,无返回值,空参数。

不能定义到void的转换,也不允许转换成数组或者函数类型。

转换常定义为const形式,原因是它并不改变数据成员的值。

explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换

(3)示例:

//源文件,测试文件
#include <iostream>
using namespace std;
class Integer {
private:
    int val;
public:
    Integer(int i=0) {
        cout<<"Integer(int i)"<<endl;
        this->val = i;
    }
    //转换函数
    operator int() const {
        cout<<"int()"<<endl;
        return val;
    }
    void setVal(int val) {
        this->val = val;
    }
    int getVal() {
        return val;
    }
};
int main() {
    Integer i;// 触发 Integer(int u)
    i.setVal(100);
    int x = i;//等效书写 int x = (int)i; 触发int()。
    cout<<x<<endl;//100
    Integer y = 200;// 触发Integer(int i)
    cout<<y<<endl;// 触发int()  200
    return 0;

}

3 标准转换函数

智能指针:

只针对堆中对象。 类名 p=new 类名。

1、unique_ptr:

只允许一个指针指向对象,指针不指向堆中对象时,堆中对象被销毁。

2、shared_ptr

三、智能指针

    C++11中有四种智能指针,auto_ptrshared-ptrunique_ptrweak-ptr。其中auto_ptr有和多不足之处,在C++11中已经建议废弃使用。都是在memory头文件中声明的。名称空间为std

1 unique_ptr

当变量销毁或变量的值置NULL后,指向的对象会销毁,该对象还只能一个指针指向它。

该指针的操作

(1) p->访问对象中的成员

(2) p = NULL;

(3) p.reset();//等效于 p = NULL

(4) p.reset(new Demo); p指向新的堆中的对象, 不再指向之前的内容

示例: unique_ptr

2 shared_ptr

在给shared_ptr分配内存时建议使用make_shared函数,这样最安全。make_shared会分配一个临时对象,而临时对象又会自动销毁,所以会有两次析构函数的执行。

p1.reset()会使用p1不再指向对象。等效于p1=NULL

p1.reset(new Demo),该指针指向新的对象了。

3 weak_ptr

可以保存一个“弱引用”,引用一个已经用shared_ptr管理的对象。

weak_ptr可通过shared_ptr来初始化

weak_ptr.expired()判断对象是否销毁,如果有返回0,没有返回1

weak_ptr.lock()返回shared_ptr, 如果没有返回NULL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记:Huber Loss smooth L1 loss

1 Huber loss 1.1 介绍 Huber Loss是回归问题中的一种损失函数&#xff0c;它结合了均方误差MSE和绝对误差MAE的特点。 Huber Loss在误差较小的时候是平方损失&#xff0c;而在误差较大的时候是线性损失。因此&#xff0c;它在处理有噪声的数据时&#xff0c;尤其是存在离群点…

【从入门到起飞】JavaAPI—BigInteger,BigDecimal的使用方法

&#x1f38a;专栏【Java基础】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f381;BigInteger&#x1f354;获取BigInteger对象⭐获…

【数据结构-图】最小生成树

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

AWS SAA知识点整理(作成中)

共通 一些信息已经更新了&#xff0c;但参考题的答案还是旧的。 比如&#xff1a; S3的最大读写性能已经提高到 3,500 PUT/COPY/POST/DELETE or 5,500 GET/HEAD requests per second 并且不再要求使用random prefix Storage Amazon S3 为了提高读取的performance: For exam…

CTF 入门指南:从零开始学习网络安全竞赛

文章目录 写在前面CTF 简介和背景CTF 赛题类型介绍CTF 技能和工具准备好书推荐 写作末尾 写在前面 CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几…

每月固定日期提醒app用哪个?手机上可固定日期提醒的工具选择哪一个

在这个繁忙的世界中&#xff0c;时间总是飞逝而过&#xff0c;我们常常需要一些方式来提醒自己按时完成一些重要的工作任务。每月固定日期提醒是其中之一&#xff0c;它可以涵盖很多方面的事情&#xff0c;从生日、账单支付到工作报告的提交。然而&#xff0c;如何有效地管理这…

7章:动态加载数据处理(selenium)

selenium模块和爬虫之间的关联 便捷的获取网站中动态加载的数据便捷实现模拟登录 什么是selenium模块 基于浏览器自动化的一个模块 selenium使用流程&#xff1a; - 环境安装&#xff1a;pip install selenium - 下载一个浏览器的驱动程序&#xff08;谷歌浏览器&#xff…

Python爬虫之入门保姆级教程

目录 一、分析要爬取的网站 二、导入相关库 三、相关的参数 四、向网站发出请求&#xff08;使用代理IP&#xff09; 五、匹配 六、获取图片&#xff0c;保存到文件夹中&#xff08;os库&#xff09; 七、完整代码 总结 相信许多人都曾为如何入门Python爬虫而烦恼。今天…

MySQL 权限变更,何时生效?

本文讲述了对三种级别权限的变更后&#xff0c;使其生效的方法。 作者&#xff1a;欧阳涵&#xff0c;爱可生团队 DBA 成员&#xff0c;看到下雨知道要打伞的 2.5 次元爱好者~ 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源…

springCloud和springboot升级

一、引言 springCloud和springBoot较低版本有时候会有网络漏洞&#xff0c;所以随着springCloud和springBoot的升级会修复这些漏洞。那么有时候就遇到在升级过程中&#xff0c;遇到不兼容的问题。需要总结下来记录一下。 二、springBoot和springCloud的使用 1、springBoot的引…

【2023年11月第四版教材】第15章《风险管理》(第三部分)

第15章《风险管理》&#xff08;第三部分&#xff09; 5 过程1-规划风险管理6 过程2-识别风险6.1 识别风险★★★6.2 数据收集★★★6.3 数据分析★★★ 7 过程3-实施定性风险分析7.1 实施定性风险分析7.2 数据分析★★★7.3 数据表现★★★7.4 项目文件&#xff08;更新&#…

Java诊断利器Arthas安装和使用

下载 curl -O https://alibaba.github.io/arthas/arthas-boot.jar先启动java项目&#xff0c;然后再启动 arthas-boot.jar 第一次使用arthas的时候&#xff0c;先按1&#xff08;后面没有对应类的&#xff09;安装上arthas 粘附一个进程 常用命令 dashboard 命令&#xff1a…

安防监控/视频汇聚平台EasyCVR云端录像不展示该是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

中国首个接入大模型的Linux操作系统;ChatGPT支持图片和语音输入;抖音上线方言自动翻译功能丨RTE开发者日报 Vol.57

开发者朋友们大家好&#xff1a; 这里是「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

【强化学习】01—— 强化学习简介

文章目录 两种机器学习类型强化学习定义强化学习交互过程强化学习系统要素历史(History)状态(State)策略(Policy)奖励(Reward)价值函数(Value Function)模型(Model)迷宫例子 强化学习智能体分类参考 两种机器学习类型 监督学习/无监督学习/强化学习/机器学习之间的关系 预测 根…

React的高阶函数

1.认识高阶函数 高阶组件 本身不是一个组件&#xff0c;而是一个函数函数的参数是一个组件&#xff0c;返回值也是一个组件 高阶组件的定义 import ThemeContext from "../context/theme_context"function withTheme(OriginComponent) {return (props) > {retur…

反序列化相关

1.序列化serialize() 把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。 2. 反序列化unserialize() 把被序列化的字符串还原为对象 java 将java对象转化为字节序列的过程&#xff0c;反序列化的过程就是 1.创建一个对象输出流 2.通过对象输出流的readobject(…

Blender DreamUV插件使用简明教程

DreamUV 是一个可让你在Blender的 3D 视口中操纵 UV的工具集合。 该工具集设计用于可重复使用的纹理&#xff0c;例如平铺纹理、装饰表和纹理图集。 其目的是让你无需退出 3D 视图即可对几何体进行纹理处理&#xff0c;从而节省时间并提高灵活性。 1、安装DreamUV 首先下载为…

C++新经典 | C++ 查漏补缺(智能指针)

目录 一、动态分配 1.初始化的三种方式 2. 释放内存 &#xff08;1&#xff09;悬空指针 3.创建新工程与观察内存泄漏 二、深入了解new/delete关键字 1.new和delete 2.operator new()和operator delete() 3.申请和释放一个数组 三、智能指针 1.shared_ptr &#xff0…

十大排序——2.归并排序

这篇文章我们来讲一下十大排序中的归并排序。 目录 1.概述 2.代码实现 3.总结 1.概述 归并排序主要是运用了归并的思想。 下面具体的来讲一下归并排序的整个流程和思想。 首先&#xff0c;给你一个无序的数组&#xff0c;要求你对它进行归并排序。归并排序首先需要将这个…