C++11強制類型轉換、異常處理


static_cast、reinterpret_castconst_castdynamic_cast

1.static_cast

  • 用來進行比較“自然”和低風險的轉換,比如整形和實數型、字符型之間互相轉換。
  • 不能在不同類型類型的指針之間互相轉換,也不能用於整型和指針之間的互相轉換,也不能用於不同類型的引用之間的轉換。

2.reinterpret_cast

  • 用來進行各種不同類型的指針之間的轉換、不同類型的引用之間轉換、以及指針和能容納得下指針的整數類型之間的轉換。轉換的時候,執行的是逐個比特拷貝的操作。

3.const_cast

  • 用來進行去除const屬性的轉換。將const引用轉換成同類型的非const引用,將const指針轉換為同類型的非const指針時用它。

4.dynamic_cast

  • 專門用於將多態基類的指針或引用,強制轉換為派生類的指針或引用,而且能夠檢查轉換的安全性。對於不安全的指針轉換,轉換結果返回NULL。
  • 不能用於將非多態基類的指針或引用,強制轉換為派生類的指針或引用。

異常處理

通常的做法是:在預計會發生異常的地方,加入相應的代碼,但是這種做法並不總是適用的。

…//對文件A進行了相關的操作

fun(arg , …);//可能發生異常

…….

用try、catch處理異常

如果一個函數在執行的過程中,拋出的異常在本函數內就被catch塊捕獲並處理了,那么該異常就不會拋給這個函數的調用者(也稱“上一層的函數”);如果異常在本函數中沒被處理,就會被拋給上一層的函數。

C++標准異常類

  • C++標准庫中有一些類代表異常,這些類都是從exception類派生而來。常用的幾個異常類如下:

 

 

  • bad_cast

在用dynamic_cast進行從多態基類對象(或引用)到派生類的引用的強制類型轉換時,如果轉換是不安全的,則會拋出異常。

  • bad_allo

在用new運算符進行動態內存分配時,如果沒有足夠的內存,則會引發此異常。

  • out_of_range

用vector或string的at成員函數根據下標訪問元素時,如果下標越界,就會拋出此異常。

下面是一個類型轉換異常的小例子:

#include <iostream>

using namespace std;

class Base
{
private:
    int value;
public:
    virtual void print()
    {
        cout << "Hello world" << endl;
    }
    Base(int value) :value(value) {};
};

class Derived :public Base
{
public:
    void print()
    {
        cout << "hehh" << endl;
    }
};
int main()
{
    Base b(4);
    try
    {
        Derived & p = dynamic_cast<Derived &>(b);
    }
    catch (bad_cast & e)
    {
        cerr << e.what() << endl;
    }
    return 0;
}

 

程序運行結果:

 

 參考鏈接:

https://www.coursera.org/learn/cpp-chengxu-sheji


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM