【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
1. static_cast
实现C++种内置基本数据类型之间的相互转换,不能用于两个不相关类型进行转换。
例如:将整形数据转换为浮点型
- c语言方式
int a = 8;
int b = 3;
double result = (double)a / (double)b;
- 1
- 2
- 3
- C++方式
int a = 8;
int b = 3;
double result = static_cast<double>(a) / static_cast<double>(b);
- 1
- 2
- 3
格式如下:
static_cast<类型>(变量表达式)
应用场景:
- 用于类层次结构中基类和派生类之间引用或指针的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的。
进行下行转换(把基类的指针或引用转换成派生类表示),由于没有动态类型检查,不安全。 - 用于基本数据类型之间的转换
- 把空指针转换成目标类型的空指针
- 把任何类型的表达式转换成void类型
2. dynamic_cast
用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)。
dynamic_cast< type_id >(expression)
- type_id 必须是类的指针、类的引用或者void*。
- 主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
- dynamic_cast只能用于含有虚函数的类;
- 进行上行转换的时候,与static_cast 的作用一样。下行转换的时候,具有类型检查的功能,比static_cast更安全。
- dynamic_cast会先检查是否能转换成功,如果能则转换,不能则返回0。
class B
{
public:
int m_iNum;
virtual void foo();
};
class D : public B
{
public:
char *m_szName[100];
};
void func(B *pb)
{
D *pd1 = static_cast(pb);
D *pd2 = dynamic_cast(pb);
}
- 1
- 2
如果pb指向一个D类型的对象,pd1 和 pd2 是一样的,并且这两个指针执行D类型的任何操作都是安全的。
如果指向B的对象,那么pd1将是一个指向该对象的指针,对它进行D类型的操作是不安全的。pd2将是一个空指针。
B要有虚函数:
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表,没有定义虚函数的类是没有虚函数表的。
3. const_cast
c语言中,const是用来限定变量,表示该变量的值不能更改。
const_cast 是用来强制去掉这种不能被修改的常数特性。不是去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,对象必须为指针或引用。
const_cast<type_id>(expression)
用来修改类型的const或volatile属性。
常量指针被转化成非常量指针,并且仍然指向原来的对象;
常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
include<iostream>
using namespace std;
int main()
{
const int a = 10;
const int * p = &a;
int *q;
q = const_cast<int *>(p);
*q = 20; //fine
cout <<a<<" "<<*p<<" "<<*q<<endl;
cout <<&a<<" "<<p<<" "<<q<<endl;
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
定义了一个普通指针q。将p通过const_cast去掉其常量性,并赋值给q指针。
4. reinterpret_cast
通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。
reinterpret_cast<type_id>(expression)
type_id 必须是一个指针、引用、算术类型、函数指针、成员指针。
应用场景:
改变指针或引用的类型、将指针或引用转换为一个足够长度的整形、将整形转换为指针或引用。
int *a = new int;
double *d = reinterpret_cast<double *>(a);
- 1
- 2
5. 为什么要需要四种类型转换?
C风格的转换格式很简单,但是也有缺点:
- 过于粗暴,可以在任意类型之间转换,很难判断其正确性。
- 隐式转换有些情况会出问题:比如精度丢失。
- 显示转换和隐式转换混合在一起,很难快速定位全部的强制转换语句。
但是在实际的工程中强制转换是不可避免的,为此C++提供的四种强制类型转换提供了更加安全可靠的转换。
【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)的更多相关文章
- 四种强制类型转换的总结(const_cast、static_cast、dynamic_cast、reinterpreter_cast)
四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast) 转载 2011年10月03日 23:59:05 标签: stru ...
- C++中的关键字用法--- 四种强制类型转换的总结
四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast 1. C风格的强制类型转换(Type Cast)很简单,不管什么类 ...
- [转载]C++中四种强制类型转换方式
C++中四种强制类型转换方式 原文地址:http://www.cnblogs.com/home123/p/6763967.html 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单( ...
- C++中的四种强制类型转换符详解
阅读目录 C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非con ...
- C++四种强制类型转换详解
什么是类型转换? 类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式.为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符. C与C++的类型转换 //C中: //复 ...
- C++中四种强制类型转换区别详解
C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 1.转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非const对 ...
- C++ 四种强制类型转换
来自csdn:http://blog.csdn.net/hgl868/article/details/46619399 C风格的强制类转换(Type Cast)很简单,不管什么类型的转换统统是: TY ...
- C++开发必看 四种强制类型转换的总结 [转]
一.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a 二.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. co ...
- C++四种强制类型转换关键字
C语言使用强制类型转换(Type Cast)很简单,不管什么类型的转换,形式都如下: TYPE b = (TYPE)a; c++提供了4种类型转换操作符来应对不同场合的应用. const_cast ...
随机推荐
- python得到当前版本号
import sys print(sys.winver) 3.7 # 导入sys模块的argv,winver成员,并为其指定别名v.wv from sys import argv as v, winv ...
- 微信小程序云开发-数据库表创建和操作
一.新建云数据库 进入[云开发]界面,点击[数据库]>添加>创建集合>确定. 二.向数据库中添加数据 选中[数据库],点击[添加记录],向数据库中添加记录 添加[字段]和[值],并选 ...
- 【LeetCode】144. 二叉树的前序遍历
144. 二叉树的前序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 输入:root = [1,null,2,3] 输出:[ ...
- 流畅的python--装饰器
装饰器:以某种方式增强函数.两大特性:1.可以将被装饰的函数替换成其他函数. 2.在加载模块时立即执行.案例1def make_avarage(): count=0 total=0 def avera ...
- 第十一篇 -- QMainWindow与QAction(斜体-粗体-下划线)
效果图: ui_mainWindow.py # -*- coding: utf-8 -*- # Form implementation generated from reading ui file ' ...
- Pb代理工具之mitmproxy
mitmproxy 一 . mitmproxy介绍 mitmproxy 就是用于 MITM 的 proxy,MITM 即中间人攻击(Man-in-the-middle attack). 不同于 fid ...
- 货币兑换问题(动态规划法)——Python实现
# 动态规划法求解货币兑换问题 # 货币系统有 n 种硬币,面值为 v1,v2,v3...vn,其中 v1=1,使用总值为money的钱与之兑换,求如何使硬币的数目最少,即 x1,x2,x3... ...
- 深入刨析tomcat 之---第8篇 how tomcat works 第11章 11.9应用程序,自定义Filter,及注册
writed by 张艳涛, 标签:全网独一份, 自定义一个Filter 起因:在学习深入刨析tomcat的学习中,第11章,说了调用过滤链的原理,但没有给出实例来,自己经过分析,给出来了一个Filt ...
- 构建前端第3篇之---使用scss
张艳涛 写于2021-1-20 主要解决俩个问题: 在单个vue文件中 <style rel="stylesheet/scss" lang="scss"& ...
- loadrunner 利用JDBC操作mysql数据库
import lrapi.lr;import java.util.ArrayList;import java.util.List; import java.sql.Connection; import ...