当前位置: 首页 > news >正文

常用的c++新特性-->day03

断言和异常

  • 断言
    • 断言的基本使用
  • 静态断言
    • 静态断言的基本使用
  • 异常
    • 异常基本使用
    • c++98异常案例
  • noexcept
    • noexcept简单案例

断言

断言的基本使用

#include <iostream>
#include <cassert>// >>>>>>>>>>>>>>>> 断言的头文件
using namespace std;char* createArray(int size)
{// 通过断言判断数组大小是否大于0assert(size > 0);	// 必须大于0, 否则程序中断char* array = new char[size];return array;
}int main()
{char* buf = createArray(0);delete []buf;return 0;
}

在这里插入图片描述
这个断言是在程序执行起来才会进行判定,而静态断言是编译期间的断言

静态断言

静态断言(static_assert),静态就是在编译时就能够进行检查的断言,使用时不需要引用头文件。静态断言的另一个好处是,可以自定义违反断言时的错误提示信息。静态断言使用起来非常简单,它接收两个参数:
参数1:断言表达式,这个表达式通常需要返回一个 bool值
参数2:警告信息,它通常就是一段字符串,在违反断言(表达式为false)时提示该信息

静态断言的基本使用

// assert.cpp
#include <iostream>                                         
using namespace std;int main()
{static_assert(sizeof(long) == 4, "错误, 不是32位平台...");cout << "64bit Linux 指针大小: " << sizeof(char*) << endl;cout << "64bit Linux long 大小: " << sizeof(long) <<endl;return 0;
}

在这里插入图片描述

// assert.cpp
#include <iostream>                                         
using namespace std;int main()
{static_assert(sizeof(long) == 8, "错误, 不是32位平台...");cout << "64bit Linux 指针大小: " << sizeof(char*) << endl;cout << "64bit Linux long 大小: " << sizeof(long) <<endl;return 0;
}

在这里插入图片描述

异常

异常基本使用

#include <iostream>
using namespace std;double division(int a, int b)
{if (b == 0){throw "Division by zero condition!";}return (a / b);
}int main()
{int x = 50;int y = 0;double z = 0;try {z = division(x, y);cout << z << endl;}catch (const char* msg) {cerr << msg << endl;}return 0;
}

在这里插入图片描述

#include <iostream>
using namespace std;double division(int a, int b)
{if (b == 0){throw "Division by zero condition!";}return (a / b);
}int main()
{int x = 50;int y = 1;double z = 0;try {z = division(x, y);cout << z << endl;}catch (const char* msg) {cerr << msg << endl;}return 0;
}

在这里插入图片描述

c++98异常案例

#include<iostream>
#include<string>
using namespace std;
struct MyException
{MyException(string s) :msg(s) {}string msg;
};double divisionMethod(int a, int b) throw(MyException, int)// >>>>>>>>> 指定只能抛出这两种类型异常MyException 或者是 int
{// >>>>>>>> 如果throw() >>>>>>>> 指的是当前函数不允许抛出异常//不写就指任意类型if (b == 0){throw MyException("division by zero!!!");// throw 100;}return a / b;
}int main()
{try{double v = divisionMethod(100, 0);cout << "value: " << v << endl;}catch (int e){cout << "catch except: " << e << endl;}catch (MyException e){cout << "catch except: " << e.msg << endl;}return 0;
}

noexcept

c++11引入了noexcept

noexcept简单案例

#include<iostream>
#include<string>
using namespace std;
struct MyException
{MyException(string s) :msg(s) {}string msg;
};
//不加的话就是抛出异常 加了就是不抛出异常
double divisionMethod(int a, int b) noexcept//>>>>>>>>>>>不抛出异常
{if (b == 0){throw MyException("division by zero!!!");// throw 100;}return a / b;
}int main()
{try{double v = divisionMethod(100, 0);cout << "value: " << v << endl;}catch (int e){cout << "catch except: " << e << endl;}catch (MyException e){cout << "catch except: " << e.msg << endl;}return 0;
}

double divisionMethod(int a, int b) noexcept(常量表达式);
常量表达式的结果会被转换成一个bool类型的值:
值为 true,表示函数不会抛出异常
值为 false,表示有可能抛出异常这里
不带常量表达式的noexcept相当于声明了noexcept(true),即不会抛出异常。


http://www.mrgr.cn/news/69737.html

相关文章:

  • 创新培养:汽车零部件图像分割
  • 机器学习:XGBoost模型(升级版)——高效且强大的树形模型
  • Python 获取PDF的各种页面信息(页数、页面尺寸、旋转角度、页面方向等)
  • opencv常用api
  • UniApp 应用、页面与组件的生命周期详解
  • SAP ABAP开发学习——function alv复选框设置
  • ORB-SLAM2源码学习:ORBextractor.cc:ORBextractor特征提取器③
  • pg_dump -Fc 导出的自定义格式数据库文件 相关操作
  • Unity性能优化-具体操作
  • [docker] container 通信 -- bridge
  • Java 8 特性
  • ROS1 Nodelets 与 ROS2 rclcpp_components 多节点运行以及功能插件
  • 手把手教你写Unity3D飞机大战(6)玩家子弹射击之瞄准程序(射线检测)
  • 平衡二叉树
  • 【含文档】基于ssm+jsp的旅游网站(含源码+数据库+lw)
  • 【数据结构实战】从零开始打造你的专属链表
  • FPGA 第5讲 点亮你的LED灯
  • AI重塑软件开发流程
  • A025-基于SpringBoot的售楼管理系统的设计与实现
  • 【网络安全】Nginx功能快速入门
  • 05_docker 安装常用软件
  • 【GPTs】EmojiAI:轻松生成趣味表情翻译
  • Linux服务器进程的控制与进程之间的关系
  • ReentrantLock【复习】
  • 微服务(二)
  • AI背后的“思考者“:LLM大语言模型是什么?