C++ explicitnoexcept关键字

news/2024/10/6 12:09:00/文章来源:https://www.cnblogs.com/smartljy/p/18448969

C++ explicit&noexcept关键字

explicit关键字

在 C++ 中,explicit 关键字用于避免编译器在特定情况下进行隐式类型转换。它主要作用于构造函数和转换函数,防止不必要或意外的类型转换发生,从而提高代码的安全性和可读性。

1. 作用于构造函数

当一个构造函数只接受一个参数时,它通常会被编译器视为可以进行隐式类型转换。例如,如果你定义一个构造函数允许通过单个参数初始化对象,编译器可能会将该参数自动转换为对象类型。这种隐式转换有时可能会导致难以调试的错误。

explicit 关键字可以禁止这种隐式转换,使得构造函数只能用于显式地创建对象。

示例(没有 explicit):

class MyClass {
public:MyClass(int x) { }
};int main() {MyClass obj = 10;  // 隐式调用 MyClass(10)
}

在这个例子中,MyClass 的构造函数可以隐式地将 10 转换为 MyClass 类型的对象。

使用 explicit 禁止隐式转换:

class MyClass {
public:explicit MyClass(int x) { }
};int main() {// MyClass obj = 10;  // 错误:不能隐式转换MyClass obj(10);      // 正确:必须显式调用构造函数
}

这里,通过添加 explicit 关键字,编译器会拒绝隐式转换,要求必须显式调用构造函数。

2. 作用于转换函数

转换函数(即 operator 函数)可以将一个类的对象转换为其他类型。在某些情况下,自动的类型转换可能会带来意想不到的结果,因此 explicit 也可以用于修饰转换函数,以禁止隐式转换。

示例(没有 explicit):

class MyClass {
public:operator int() const { return 42; }
};int main() {MyClass obj;int x = obj;  // 隐式调用转换函数,将 obj 转换为 int 类型
}

使用 explicit 禁止隐式转换:

class MyClass {
public:explicit operator int() const { return 42; }
};int main() {MyClass obj;// int x = obj;  // 错误:不能隐式转换int x = static_cast<int>(obj);  // 正确:必须显式转换
}

这里,explicit 禁止了隐式转换,需要使用 static_cast 进行显式转换。

总结:

  • 构造函数explicit 用于防止通过单参数构造函数的隐式类型转换,要求显式创建对象。
  • 转换函数explicit 用于禁止类对象到其他类型的隐式转换,要求显式调用转换函数。

noexcept关键字

在 C++ 中,noexcept 是一个关键字,用于指定一个函数是否承诺不抛出异常。它的主要作用是告诉编译器和程序员,这个函数在正常情况下不会抛出异常,从而可以进行某些优化和错误处理。

noexcept 的作用:

  1. 声明函数不会抛出异常
    当一个函数被标记为 noexcept,它承诺不会抛出异常。如果该函数在运行时确实抛出了异常,程序会直接调用 std::terminate() 并中止执行,而不会像正常的异常处理流程那样进行栈展开。

    例如:

    void foo() noexcept {// 函数体不会抛出异常
    }
    
  2. 优化编译器行为
    标记为 noexcept 的函数可以让编译器进行更好的优化,特别是在那些涉及异常处理的代码路径上。编译器知道不需要生成栈展开(stack unwinding)代码来处理异常,因为 noexcept 承诺不会抛出异常。

  3. 与异常安全性有关
    在异常安全的代码中,noexcept 有助于编写更具鲁棒性(健壮性)的代码。某些标准库的操作(例如容器的某些操作)在处理涉及 noexcept 的函数时,行为可能会有所不同。例如,std::vector 的移动操作要求其元素的移动构造函数是 noexcept 的,否则在扩展容量时会回退到复制操作。

  4. 条件性的 noexcept
    noexcept 可以是条件性的,即你可以根据某些条件决定函数是否是 noexcept。这种情况主要用于模板代码,确保模板实例化时只有在某些条件下才标记为 noexcept

    例如:

    template <typename T>
    void foo(T&& t) noexcept(noexcept(T())) {// 根据 T 的构造函数是否抛出异常来决定是否是 noexcept
    }
    

使用场景:

  1. 移动构造函数和移动赋值运算符
    如果一个类的移动构造函数或移动赋值运算符被标记为 noexcept,那么标准库容器在移动该对象时会更高效。例如:

    class MyClass {
    public:MyClass(MyClass&&) noexcept = default;MyClass& operator=(MyClass&&) noexcept = default;
    };
    
  2. 析构函数
    通常,析构函数默认是 noexcept。因为在异常传播时,如果析构函数抛出异常,C++ 会调用 std::terminate()

    例如:

    class Foo {
    public:~Foo() noexcept {// 不应抛出异常}
    };
    

noexceptthrow() 的区别:

noexcept 是 C++11 引入的,取代了早期的 throw() 异常规范。throw() 的语义是标记函数不会抛出任何类型的异常,但它的行为和兼容性存在问题,因此被 noexcept 取代。

示例:

void func() noexcept {// 保证不抛出异常
}void test() {try {func();} catch (...) {// 永远不会捕获到异常,因为 func 是 noexcept}
}

总结来说,noexcept 用来声明和约束函数不抛出异常,有助于提高程序的安全性和性能。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

珂朵莉树(ODT)

前言 主要是一种暴力思想。。。 本文来自 wiki 与洛谷题解的整合。 应用 主要是应付随机数据(区间操作) 实现 有几个核心操作。 set实现方法 定义 struct node {intt l,r;//intt:long longmutable intt v;node(const intt &ll,const intt &rr,const intt &vv) : …

高效开发Maven架构设计图解/掌握项目工程自动化技巧(精通篇一)

Maven是一个项目管理和构建自动化工具,主要服务于基于Java的项目。它使用一个名为POM(Project Object Model)的XML文件来描述项目的构建过程、依赖、插件等信息。肖哥弹架构 跟大家“弹弹” 高并发锁, 关注公号回复 mvcc 获得手写数据库事务代码 欢迎 点赞,关注,评论。…

20222406 2024-2025-1 《网络与系统攻防技术》实验一实验报告

20222406 2024-2025-1 《网络与系统攻防技术》实验一实验报告 1.实验内容 本周深入学习了缓冲区溢出相关内容,收获颇丰。 一、理论知识学习学习了缓冲区溢出的基本知识,包括汇编语言,了解了常见的指令如mov(数据传送)、push(压栈)、pop(出栈)、call(调用函数)等的基…

Markdown格式学习

Markdown格式学习 掌握内容 标题:使用 # 来表示不同级别的标题,如 # 表示一级标题,## 表示二级标题 有序列表:使用数字加点来创建,如 1., 2.。 链接:使用 链接描述。 强调:使用 * 或 _ 来表示斜体(两边各一个),使用两个 ** 或 __ 来表示粗体。 表格:使用 | 和 - 来创…

免费在线音频转字幕网站 All In One

免费在线音频转字幕网站 All In One 利用 AI 将语音转成文本 free online Speech to Text websites免费在线音频转字幕网站 All In One利用 AI 将语音转成文本free online Speech to Text websites 每天三次免费https://turboscribe.ai/zh-CN/dashboard demos(🐞 反爬虫测试!…

英璞来(imprai)LLMs企业级智能助理:让大语言模型应用触手可及

在这个信息爆炸的时代,人工智能和大数据技术正在改变我们的生活。而随着大语言模型的广泛应用,如何快速、高效地将这些模型集成到各种应用场景中,成为了一个亟待面对的问题。今天,我们要向您介绍一款名为英璞来(imprai)的开箱即用的企业级智能助理平台,它能够让您轻松获…

服贸会上的科技闪耀之星:璞华易研PLM系统引领产品研发潮流

2024年中国国际服务贸易交易会(以下简称为“服贸会”)于9月在北京盛大开幕,再次汇聚全球目光,共襄智慧服务的盛宴。本届服贸会秉承“全球服务、互惠共享”的核心理念,聚焦“共享智慧服务,共促开放发展”,为参会者搭建了一个集展览展示、洽谈推介、成果发布于一体的多元化…

璞华科技珠海采筑:通过SRM系统实现采购管理一体化和精细化

SRM供应商关系管理应该怎么做?如何实现采购管理一体化?近日,聚焦建材采购交易领域的服务商珠海采筑和SRM系统提供商璞华科技通过合作给出了一个现实的回答:通过SRM系统,聚焦使用者视角,以数据为主线,实现采购管理的一体化和精细化。 珠海采筑电子商务有限公司 珠海采筑电…

2024-2025-1 20241408 《计算机基础与程序设计》第二周学习总结

2024-2025-1 20241408 《计算机基础与程序设计》第二周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标 数字化、信息安全、自学教材计算机科学概论(第七版)…

说明文档

这篇文档主要介绍《基于YOLOv8的农田病虫害检测与分析》的代码实现部分,整篇论文的目的主要是改进YOLOv8的网络结构,使其在检测病虫害的精度和实时性上有所提升。接下来,我将介绍如何从零开始搭建起本项目。安装Python 到python的官方网站:https://www.python.org/下载,安…

13-网络安全漏洞防护技术原理与应用

13.1 概述 1)概念 网络安全漏洞又称为脆弱性,简称漏洞。 漏洞一般是致使网络信息系统安全策略相冲突的缺陷,这种缺陷通常称为安全隐患。 安全漏洞的影响主要有机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可控制性下降、真实性不保等。 根据漏洞的补丁状况,可将漏洞…

2024-2025-1 20241305 《计算机基础与程序设计》第二周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第二周作业(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276))这个作业…