[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++標準程式庫:自修教程與參考手冊