最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++11中的noexcept關(guān)鍵字

 更新時(shí)間:2022年07月20日 10:33:52   作者:卻道天涼_好個(gè)秋  
這篇文章主要介紹了c++11中的noexcept關(guān)鍵字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

c++11中noexcept關(guān)鍵字

1. 概念

noexcept關(guān)鍵字是c++11之后新增的。該關(guān)鍵字會(huì)告訴編譯器,被修飾的函數(shù)不會(huì)發(fā)生異常,這有利于編譯器對(duì)程序做更多的優(yōu)化。

2. 兩種形式

1)noexcept

2)noexcept(expression)

noexcept(true) 表示被修飾的函數(shù)不拋出異常,noexcept(false) 表示被修飾的函數(shù)會(huì)拋出異常。

3. 異常處理

//例1
bool Compare(int x, int y) throw() ? //C++11之前
{
?? ?return x > y;
}
?
//例2
bool Compare(int x, int y) noexcept(noexcept(x > y)) ?//C++11
{
?? ?return x > y;
}

例2用到了noexcept運(yùn)算符,表示,如果x > y不發(fā)生異常,則Compare函數(shù)不會(huì)發(fā)生異常。

4. 實(shí)現(xiàn)原理

noexecpt函數(shù)向外拋出了異常(如果函數(shù)內(nèi)部捕捉了異常并完成處理,這種情況不算拋出異常),程序會(huì)直接終止,調(diào)用std::terminate()函數(shù),該函數(shù)內(nèi)部會(huì)調(diào)用std::abort()終止程序。

5. 使用場(chǎng)景

1)移動(dòng)構(gòu)造函數(shù)

2)移動(dòng)分配函數(shù)

3)析構(gòu)函數(shù)

4)葉子函數(shù)

c++11關(guān)鍵字noexcept替代throw

相比于斷言適用于排除邏輯上不可能存在的狀態(tài),異常通常是用于邏輯上可能發(fā)生的錯(cuò)誤。

在異常處理的代碼中,程序員有可能看到過(guò)如下的異常聲明表達(dá)形式:

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

在excpt_func函數(shù)聲明之后,我們定義了一個(gè)動(dòng)態(tài)異常聲明throw(int, double),該聲明指出了excpt_func可能拋出的異常的類型。事實(shí)上,該特性很少被使用,因此在C++11中被棄用了(參見(jiàn)附錄B),而表示函數(shù)不會(huì)拋出異常的動(dòng)態(tài)異常聲明throw()也被新的noexcept異常聲明所取代。

noexcept形如其名地,表示其修飾的函數(shù)不會(huì)拋出異常。不過(guò)與throw()動(dòng)態(tài)異常聲明不同的是,在C++11中如果noexcept修飾的函數(shù)拋出了異常,編譯器可以選擇直接調(diào)用std::terminate()函數(shù)來(lái)終止程序的運(yùn)行,這比基于異常機(jī)制的throw()在效率上會(huì)高一些。這是因?yàn)楫惓C(jī)制會(huì)帶來(lái)一些額外開銷,比如函數(shù)拋出異常,會(huì)導(dǎo)致函數(shù)棧被依次地展開(unwind),并依幀調(diào)用在本幀中已構(gòu)造的自動(dòng)變量的析構(gòu)函數(shù)等。

noexcept修飾符有兩種形式

  • 一種就是簡(jiǎn)單地在函數(shù)聲明后加上noexcept關(guān)鍵字。比如:void excpt_func() noexcept; 
  • 另外一種則可以接受一個(gè)常量表達(dá)式作為參數(shù),如下所示:void excpt_func() noexcept (常量表達(dá)式); 

常量表達(dá)式的結(jié)果會(huì)被轉(zhuǎn)換成一個(gè)bool類型的值。該值為true,表示函數(shù)不會(huì)拋出異常,反之,則有可能拋出異常。這里,不帶常量表達(dá)式的noexcept相當(dāng)于聲明了noexcept(true),即不會(huì)拋出異常。

在C++98中,new可能會(huì)包含一些拋出的std::bad_alloc異常。

void* operator new(std::size_t) throw(std::bad_alloc); ?
void* operator new[](std::size_t) throw(std::bad_alloc); ?

而在C++11中,則使用noexcept(false)來(lái)進(jìn)行替代。  

void* operator new(std::size_t) noexcept(false);
void* operator new[](std::size_t) noexcept(false); ?

當(dāng)然,noexcept更大的作用是保證應(yīng)用程序的安全。比如一個(gè)類析構(gòu)函數(shù)不應(yīng)該拋出異常,那么對(duì)于常被析構(gòu)函數(shù)調(diào)用的delete函數(shù)來(lái)說(shuō),C++11默認(rèn)將delete函數(shù)設(shè)置成noexcept,就可以提高應(yīng)用程序的安全性。 

void operator delete(void*) noexcept;
void operator delete[](void*) noexcept; ?

而同樣出于安全考慮,C++11標(biāo)準(zhǔn)中讓類的析構(gòu)函數(shù)默認(rèn)也是noexcept(true)的

另外:

void fun (); // 能拋出任何類型的異常
void fun () throw(except1,except2,except3) // 后面括號(hào)里面是一個(gè)異常參數(shù)表,本例中只能拋出這3中異常
void fun () throw() ? // 參數(shù)表為空,不能拋出異常

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++ 指向類成員的指針

    C++ 指向類成員的指針

    指向類成員的指針總的來(lái)講可以分為兩大類四小類(指向數(shù)據(jù)成員還是成員函數(shù),指向普通成員還是靜態(tài)成員)
    2020-03-03
  • C++實(shí)現(xiàn)STL容器的示例

    C++實(shí)現(xiàn)STL容器的示例

    本文主要介紹了C++實(shí)現(xiàn)STL容器的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • 使用C語(yǔ)言實(shí)現(xiàn)字符串逆序操作案例

    使用C語(yǔ)言實(shí)現(xiàn)字符串逆序操作案例

    這篇文章主要介紹了使用C語(yǔ)言實(shí)現(xiàn)字符串逆序操作案例,本文包含使用C語(yǔ)言的兩種方法去實(shí)現(xiàn),遞歸和非遞歸,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 通過(guò)stringstream實(shí)現(xiàn)常用的類型轉(zhuǎn)換實(shí)例代碼

    通過(guò)stringstream實(shí)現(xiàn)常用的類型轉(zhuǎn)換實(shí)例代碼

    在本篇文章里小編給大家分享了關(guān)于通過(guò)stringstream實(shí)現(xiàn)常用的類型轉(zhuǎn)換實(shí)例代碼內(nèi)容,需要的朋友們可以參考下。
    2020-04-04
  • C語(yǔ)言非遞歸后序遍歷二叉樹

    C語(yǔ)言非遞歸后序遍歷二叉樹

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言非遞歸后序遍歷二叉樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C語(yǔ)言自定義類型的保姆級(jí)講解

    C語(yǔ)言自定義類型的保姆級(jí)講解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言自定義類型的保姆級(jí)講解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++中new/delete與malloc/free的區(qū)別小結(jié)

    C++中new/delete與malloc/free的區(qū)別小結(jié)

    本文主要介紹了C++中new/delete與malloc/free的區(qū)別小結(jié), malloc、free是C中的庫(kù)函數(shù) new、delete 是C++當(dāng)中的操作符,讀者可以更好地理解C++中內(nèi)存管理的方式和優(yōu)勢(shì)
    2023-08-08
  • VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例

    VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例

    這篇文章主要介紹了VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例,對(duì)于學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的朋友有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C++連接數(shù)據(jù)庫(kù)SqlServer、MySql、Oracle、Access、SQLite、PostgreSQL、MongoDB、Redis

    C++連接數(shù)據(jù)庫(kù)SqlServer、MySql、Oracle、Access、SQLite、PostgreSQL、Mong

    C++是一種通用的編程語(yǔ)言,可以使用不同的庫(kù)和驅(qū)動(dòng)程序來(lái)連接各種數(shù)據(jù)庫(kù),以下是一些示例代碼,演示如何使用?C++?連接?SQL?Server、MySQL、Oracle、ACCESS、SQLite?、?PostgreSQL、MongoDB、Redis數(shù)據(jù)庫(kù)
    2024-08-08

最新評(píng)論

常德市| 沙雅县| 洛宁县| 岳西县| 循化| 乌鲁木齐县| 易门县| 苏尼特左旗| 岢岚县| 海盐县| 南丰县| 颍上县| 措勤县| 桃园县| 泽库县| 勐海县| 神木县| 弥渡县| 彭山县| 漳州市| 天津市| 姚安县| 德庆县| 宝丰县| 梨树县| 山西省| 凤翔县| 四川省| 监利县| 昌黎县| 崇阳县| 中超| 谢通门县| 灵宝市| 隆化县| 腾冲县| 黄浦区| 台北市| 东至县| 威远县| 商南县|