> 文章列表 > C++中的类型转换

C++中的类型转换

C++中的类型转换

目录

一、C语言中的类型转换

二、C++中的类型转化

2.1 static_cast

2.2 const_cast2.2 const_cast

2.3reinterpret_cast    重解释转换

 2.4 dynamic_cast    动态转换(!!!)

3. explicit 防止隐式类型转化


一、C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。

1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败(例如将一个int*类型的变量赋值给int类型,那么必然会转化失败)

 

 2. 显式类型转化:需要用户自己处理

二、C++中的类型转化

在C语言中已经有了类型转化那么为什么C++中还要给出类型转化呢?

这是因为C风格的转换格式很简单,但是有不少缺点的:

1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失。

2. 显式类型转换将所有情况混合在一起,代码不够清晰。

2.1 static_cast

static_cast用于非多态类型的转换(静态转换:静态转化顾名思义就是在编译阶段就可以确定要转化为的类型了),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。例如:

总结一下:

static_cast只能对int,double,float 这些基本的静态类型进行转化,但是不可以将两一种不相关的类型转化,例如不可以将int*转化为int,不可以将char*转化为int*(事实上其他强制类型转换操作符也是不可以的)。

2.2 const_cast2.2 const_cast

最常用的用途就是删除变量的const属性(当然这里的删除不是指将原本const类型的对象的类型变为非const类型,而是例如下面的例子),方便赋值。

 

2.3reinterpret_cast    重解释转换

忽略原来的类型,只关心数值,用于将一种类型转换为另一种不同的类型

我们先来看一下基本的用法:

  

 再来看深入一点的:

 上图的情况我们在继承章节已经总结过,是很正常的现象,

我们这时候再用到reinterpret_cast来试一下

 

 2.4 dynamic_cast    动态转换(!!!)

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换),动态转换是一种向下转换

动态转换只用于多态

向上转型:子类对象指针/引用指向父类指针/引用(不需要转换,赋值兼容规则)

 向下转型:父类对象指针/引用指向子类指针/引用(用dynamic_cast转型是安全的)

我们先来看一种现象:

 再来看另一种现象:

结论:   能够把父类强转为子类,但不能真真实实访问子类的空间,看父类对象是不是真是指向一个子类空间,而不是一个单纯的父类对象

dynamic_cast就能很好的解决这个问题

1、如果是指向子类的父类

 2、如果只是一个单纯的父类

 dynamic_cast确保了向下转换的安全性

 

3. explicit 防止隐式类型转化

生成临时变量进行赋值,这里我们构造一个场景

 虽然可以这样写,但可读性太低了,别人看到   t2=20,还以为t2就是一个整数呢,也根本不知道还有底层的那么多临时变量啥的

我们可以用 explicit关键字修饰函数禁止这种情况