C++ 中类型转换有四种方式:
- C 风格的转型
- C++ 风格的转型
- 利用构造函数实现内置类型到用户定义类型的转换
- 重载类型转换运算符
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:执行底层转换,不具备移植性。
C++ 中尽量使用 C++ 风格的转型
利用构造函数实现内置类型到用户自定义类型的转换
主要利用的是单参数构造函数和隐式类型转换,如下,有一个类:
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;
其实是隐式的调用了构造函数
Complex(float real);
重载类型转换运算符
强制类型转换是可以被重载的,具体形式是:
operator "type_key"()
它必须是一个类的成员函数。没有返回值,返回值类型就是转换运算符的类型。没有参数。
例如:
class Int{
private:
int _value = 0;
public:
operator int() const{
return _value;
}
};
当执行
Int i;
int newValue = i + 5;
时,首先 i 被隐式的转换成 int 类型,然后执行 int 类型的 "+" 运算符。
使用重载类型转换运算符时要避免二义性
重载了多种算数类型的转换运算符
如果在类 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)都可以执行 "+" 运算符,并且它们之间也是可以互相转换的。