c++类型转换
c++的类型转化分为两种:
一种是隐式转换,像int型和float型相加的时候,int型会自动转化成为float型的。
一种是显式转换,是要利用转换符来强制类型转换的。
显式转换符
- static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
static_cast
用于非多态类型之间的转换,不提供运行时的检查来确保转换的安全性。(long转int型的时候发生截断)
主要有如下- 基本数据类型转换
int
转换成enum
基类和子类之间指针和引用的转换
- 上行转换,把子类的指针或引用转换成父类,这种转换是安全的(通常使用默认转换)。不需要在用转换符了。
- 下行转换,把父类的指针或引用转换成子类,这种转换是不安全的,也需要程序员来保证(通常使用
dynamic_cast
)。
dynamic_cast
用于类的指针、类的引用或者
void *
转化。主要用于以下三种情况:
- 上行转换,把子类的指针或引用转换成父类,与
static_cast
相同。但是一般是默认隐式转换。 - 下行转换,把父类的指针或引用转换成子类,比
static_cast
安全。 - 交叉转换,兄弟之间指针转换,
static_cast
会出现编译错误。
- 上行转换,把子类的指针或引用转换成父类,与
-
如果是指针,进行正确的转换,获得对应的值;否则返回NULL,如果是引用,则在运行时就会抛出异常;
如果是菱形继承的话,要转换到爷爷级别去的话,必须指定上行转换的路径,否则就会转换失败,因为不知道如何转换。
const_cast
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;const_cast的作用是用来改变表达式里面的常量性(const)或易变性(volatile)
是去const的属性,但是其实是不安全的,会破坏const存在的意义。
reinterpret_cast(万能的强制类型转换符)
从指针类型到一个足够大的整数类型
从整数类型或者枚举类型到指针类型
从一个指向函数的指针到另一个不同类型的指向函数的指针
从一个指向对象的指针到另一个不同类型的指向对象的指针
从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针
小结:
符号 | 转换对象 | 作用 | 转换时机 |
---|---|---|---|
static_cast | 基本类型的转换,指针,引用 | 类似于c语言的小括号转化功能 | 编译期间 |
const_cast | const类型的对象,指针,引用 | 去掉const的属性当前 | 编译期间 |
dynamic_cast | 类的指针,类的引用 | 多态的时候,父类指针和引用转换成为子类的指针和引用 | 运行期间,指针转换失败返回NULL,引用转换失败返回异常。 |
reinterpret_cast | 指针,应用等等 | 万能的强制类型转换 | 编译期间 |