,,c++11中的noexcept关键字

,,c++11中的noexcept关键字

本文主要介绍了c 11中的noexcept关键字,有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。

目录

c 11 noexcept关键字1。概念2。两个表格3。异常处理4。实施原则5。使用场景c 11关键字noexcept代替throw。

c++11中noexcept关键字

1. 概念

noexcept关键字添加在c 11之后。这个关键字会告诉编译器,修改后的函数不会异常,有助于编译器对程序进行更多的优化。

2. 两种形式

1)无例外

2)noexcept(表达式)

Noexcept(true)表示修饰函数不会引发异常,noexcept(false)表示修饰函数将引发异常。

3. 异常处理

//示例1

L compare (int x,int y)throw()//在c11之前

{

返回x y;

}

//示例2

bool Compare(int x,int y)no except(no except(x y))//C 11

{

返回x y;

}

示例2使用noexcept运算符,这意味着如果x y没有异常,Compare函数也不会有异常。

4. 实现原理

noexecpt函数向外抛出异常(如果异常是在函数内部捕获并处理的,这不是抛出的异常)。程序会直接终止,调用std:terminate()函数,该函数会在内部调用std:abort()来终止程序。

5. 使用场景

1)移动构造函数

2)移动分配功能。

3)破坏性作用

4)叶片功能

c++11关键字noexcept替代throw

与排除逻辑上不可能的状态的断言相比,异常通常用于逻辑上可能的错误。

在异常处理的代码中,程序员可能见过下面的异常声明表达式:

void excpt_func() throw(int,double) {.}

在excpt_func函数声明之后,我们定义了一个动态异常声明throw(int,double),它指明了excpt_func可能抛出的异常的类型。这个特性其实很少使用,所以在C 11中已经被放弃了(见附录B),表示函数不会抛出异常的动态异常语句throw()也被新的noexcept异常语句所取代。

Noexcept就像它的名字一样,意味着它修改后的函数不会抛出异常。但与throw()动态异常声明不同的是,在C 11中,如果noexcept修改的函数抛出异常,编译器可以选择直接调用std:terminate()函数来终止程序,比基于异常机制的throw()效率更高。这是因为异常机制会带来一些额外的开销,比如函数抛出异常,会导致函数栈依次展开,在这个框架中构造的自动变量的析构函数会按照框架调用。

noexcept修饰符有两种形式

一种是简单地在函数声明后添加noexcept关键字。比如:void except _ func()no except;另一种可以接受常量表达式作为参数,如下:void except _ func () no except(常量表达式);

表达式的结果将被转换为bool类型的值。该值为true,表示函数不会抛出异常;否则,它可能会引发异常。这里,没有常量表达式的noexcept等价于声明noexcept(true),即不会抛出异常。

在C 98中,new可能包含一些抛出的std:bad_alloc异常。

void*运算符new(STD:size _ t)throw(STD:bad _ alloc);

void*运算符new[](STD:size _ t)throw(STD:bad _ alloc);

在C 11中,noexcept(false)用于替换。

void*运算符new(STD:size _ t)no except(false);

void * operator new[](STD:size _ t)no except(false);

当然noexcept更大的作用是保证应用的安全性。比如一个类析构函数不应该抛出异常,那么对于析构函数经常调用的delete函数,C 11默认设置delete函数为noexcept,这样可以提高应用的安全性。

void运算符delete(void *)no except;

void运算符delete[](void *)no except;

同样出于安全考虑,C 11标准中类的析构函数默认为noexcept(true)。

另外:

虚空乐趣();//可以引发任何类型的异常

Voidfun () throw(除了1,除了2,除了3)//后面的括号里有一个异常参数列表,本例中只能抛出这三种情况下的异常。

void fun () throw() //参数表为空,因此不能引发异常。

以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: