型別轉換 and 異常 and 對組

来源:http://www.cnblogs.com/mangoyuan/archive/2017/02/07/6373586.html
-Advertisement-
Play Games

[TOC] 2.2.7 新的型別轉換操作符(Type Conversion Operators) 1. static_cast 將一個值以符合邏輯的方式轉型。這可看做是“利用原值重建一個臨時對象,併在設立初值時使用型別轉換”。 3. const_cast 設定或去除型別的常數性,亦可去除volati ...


[TOC]

2.2.7 新的型別轉換操作符(Type Conversion Operators)

1. static_cast

將一個值以符合邏輯的方式轉型。這可看做是“利用原值重建一個臨時對象,併在設立初值時使用型別轉換”。

double x = 1.55;
cout<<static_cast<int>(x)<<endl; //輸出 1

2. dynamic_cast

將多態型別向下轉型(polymorphics type)為其實際靜態型別(real static type)。這是唯一在執行期進行檢驗的轉型動作。可以用它來檢驗某個多態對象的型別。
註意,從設計角度而言,你應該運用多態技術的程式中,避免這種“程式行為取決於具體型別”的寫法。

void f(Basic* pb) {
    Inhrit* pi = dynamic_cast<Inhrit*>(pb);
    if(pb == NULL) {
        // 如果pb是基類類型的指針指向了繼承類Inhrit指針,則不為空
        // 否則pb轉換失敗,為NULL
    }
}

3. const_cast

設定或去除型別的常數性,亦可去除volatile修飾詞。除此之外不允許任何轉換。

class Basic {
public:
    int value;
    Basic(int v): value(v) {};
}

int main() {
    const Basic* pb = new Basic(100);
    // pb->value = 1;
    Basic* pb1 = const_cast<Basic*>(pb);
    pb1->value = 1;
}

註意:不能直接對非指針和非引用的變數使用const_cast操作符去直接溢出它的const屬性。

4. reinterpret_cast

此操作符的行為由實際編譯器定義。可能重新解釋bits意義,但也不一定如此。使用此一轉型動作通常帶來不可移植性。

3.3.1 標準異常類別

1. 語言本身所支持的異常

  • 全局操作符new操作失敗,拋出bad_alloc。
  • 執行期間,當一個加於reference身上的“動態型別轉換操作”失敗時,dynamic_cast會拋出bad_cast異常。
  • 執行期型別辨識(RTTI)過程中,如果交給typeid的參數為零或空指針,typeid操作符會拋出bad_typeId異常。
  • 如果發生非預期的異常,bad_exception異常會接受處理。

2. C++標準程式說發生的異常

  • invalid_argument表示無效參數
  • length_error指出某個行為“可能超越了最大極限”
  • out_of_range指出參數值“不在預期範圍內”
  • domain_error指出專業領域範疇內的錯誤
    總是派生自logic_error。

3. 程式作用域之外發生的異常

  • range_error指出內部計算時發生區間錯誤
  • overflow_error指出算術運算發生上溢位
  • underflow_error指出算術運算發生下溢位
    派生自runtime_error的異常,用來指出“不在程式範圍內,且不容易迴避”的事件。

4.1 Pairs 對組

struct pair定義於<utility>

1. 構造函數

  • pair預設構造器接受類型,然後調用類型的構造器

    template<class T1, class T2>
    ...
    pair():first(T1()), pair(T2()) {};
  • 其次是接受具體的值,需要先指定具體的類型

    pair(const T1&a, const T2& b)
    :first(a), second(b) {};
  • 複製構造函數,這裡之所以使用模板,是因為構造過程中可能需要隱式型別轉換。

    template<class U, class V>
    pair(const pair<U, V>& p)
    :first(p.first), second(p.second) {};

2. Pair之間的比較

pair的比較第一個擁有更高的優先順序。

3. 便捷的make_pair()

template函數make_pair()使你無需寫出型別,就可以生成一個pair對。

namespace std {
    template<class T1, class T2>
    pair<T1, T2> make_pair(const T1& x, const T2& y) {
        return pair<T1, T2>(x, y);
    }
}

註意,一個算式如果明白指出型別,便帶有一個優勢,產生出來的pair將有絕對明確的型別。

來源:C++標準程式庫:自修教程與參考手冊



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、什麼是框架 2、Spring簡介 3、IOC(配置、註解) 4、Bean(配置、註解) 5、AOP(配置、註解、AspectJ、API) 資源: http://spring.io/ http://project.spring.io/spring-framework/ Spring是什麼? 1、S ...
  • 一:運算符 1.算數運算: a除以b a除以c為整除。輸出小數點後面的數字 a//b 為地板除。只去整數,小數點後面的數字舍掉 2.比較運算 3.賦值運算 4.位運算 ps:暫時用不到 5.邏輯運算 註意:所有的數據類型都有布爾值(True/False)。為False的數據有(0,' ',None) ...
  • 原文:http://blog.csdn.net/ysughw/article/details/8992322 ContextLoaderListener監聽器的作用就是啟動Web容器時,自動裝配ApplicationContext的配置信息。因為它實現了ServletContextListener這 ...
  • springmvc在處理器方法中通常返回的是邏輯視圖,如何定位到真正的頁面,就需要通過視圖解析器。 springmvc里提供了多個視圖解析器,InternalResourceViewResolver就是其中之一: 最常用的視圖解析器:InternalResourceViewResolver 當處理器 ...
  • xmlns是XML Namespaces的縮寫,中文名稱是XML(標準通用標記語言的子集)命名空間。 產生原因 比如: 下麵這個 XML 文檔攜帶著某個表格中的信息: table tr tdApples/td tdBananas/td /tr /table 下麵這個 XML 文檔攜帶有關桌子的信息( ...
  • 非常慚愧的說,由於之前一直使用的是windowservice,安裝apache來進行伺服器佈置的,這種方式也是最簡單最直接的方式, 但是由於php的服務大多都是linux棧的,咱們也不能落後呀,在寫了php半年之後,開始擁有的自己的第一臺centos的伺服器, 實話說,centos真的是簡潔,部署完 ...
  • 一、指針的四個關鍵概念1、指針的類型2、指針指向的類型3、指針的值,也就是指針指向的地址4、指針自己所占用的記憶體空間註意:指針變數所存的內容就是記憶體的地址編號!例如:int **pp = NULL;1、指針的類型是 int **2、指針指向的類型 int *3、指針的值為NULL4、指針自己所站記憶體 ...
  • 一:語法和語句 # :註釋 \ : 轉譯回車,繼續上一行,在一行語句較長的情況下可以使用其來切分成多行,因其可讀性差所以不建議使用 ; : 將兩個語句連接到一行,可讀性差,不建議使用 : : 將代碼的頭和體分開 語句(代碼塊)用縮進方式體現不同的代碼級別,建議採用4個空格(不要使用tab) pyth ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...