static_cast、reinterpret_cast、const_cast和dynamic_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