C++ 中類型轉換有四種方式:
- C 風格的轉型
- C++ 風格的轉型
- 利用構造函數(shù)實現(xiàn)內置類型到用戶定義類型的轉換
- 重載類型轉換運算符
C 風格的轉型
形式:
(type_key)object
type_key(object)
如
double d = 3.14;
int i = int(3.14);
C++ 風格的轉型
C++ 風格的轉型有四種
- static_cast:強制轉型躬贡。
- dynamic_cast:在繼承體系中安全的向下轉型框喳,如將基類的指針或者引用轉換成子類的指針或者引用丈屹。
- const_cast:去除常量性。
- reinterpret_cast:執(zhí)行底層轉換孵户,不具備移植性。
C++ 中盡量使用 C++ 風格的轉型
利用構造函數(shù)實現(xiàn)內置類型到用戶自定義類型的轉換
主要利用的是單參數(shù)構造函數(shù)和隱式類型轉換,如下帅韧,有一個類:
class Complex{
private:
float _real = 0;
float _imaginary = 0;
public:
Complex():
_real(0), _imaginary(0) {}
Complex(float real, float imaginary):
_real(real), _imaginary(imaginary) {}
Complex(float real):
_real(real) {}
};
如果有如下代碼:
Complex com = 3.14;
其實是隱式的調用了構造函數(shù)
Complex(float real);
重載類型轉換運算符
強制類型轉換是可以被重載的榨为,具體形式是:
operator "type_key"()
它必須是一個類的成員函數(shù)惨好。沒有返回值煌茴,返回值類型就是轉換運算符的類型。沒有參數(shù)日川。
例如:
class Int{
private:
int _value = 0;
public:
operator int() const{
return _value;
}
};
當執(zhí)行
Int i;
int newValue = i + 5;
時蔓腐,首先 i 被隱式的轉換成 int 類型,然后執(zhí)行 int 類型的 "+" 運算符龄句。
使用重載類型轉換運算符時要避免二義性
重載了多種算數(shù)類型的轉換運算符
如果在類 Int 中添加一個到 float 類型的轉換元算符:
class Int{
private:
int _value = 0;
public:
operator int() const{
return _value;
}
operator float() const{
return static_cast<float>(_value);
}
};
那么:
Int i;
int newValue = i + 5;
將無法編譯合住,因為 Int 的定義產生了二義性。此時要轉換的目標類型(int 和 float)都可以執(zhí)行 "+" 運算符撒璧,并且它們之間也是可以互相轉換的透葛。