目录

一.static_cast(静态转换)

二.dynamic_cast(动态转换)

三.const_cast


一.static_cast(静态转换)

1.语法:

static_cast<new_type>(expression);
newtype dataname = static_cast<newtype>(expression);

new_type为目标数据类型,expression为原始数据类型变量或者表达式

2.解析:

static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐式转换如non-const对象转为const对象,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性

3.用法:

①.用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;(派生类拥有基类的所有data member,所以上行转换是安全的)
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。(基类没有派生类的data member,所以下行转换是不安全的)
②.用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。
③.把空指针转换成目标类型的空指针。
④.把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性

4.示例:

#include<iostream>
#include<typeinfo>
using namespace std;class base
{
};class derived:public base
{
};int main()
{base b1;derived d1;//上行转换cout << "d1转换前的类型:" << typeid(d1).name() << endl;base b2 = static_cast<base>(d1);cout<<"d1转换后的类型:"<< typeid(b2).name() << endl;int a = 10;cout << "a转换前的类型:" << typeid(a).name() << endl;double b = static_cast<double>(a);cout << "a转换后的类型:" << typeid(b).name() << endl;system("pause");return 0;
}

二.dynamic_cast(动态转换)

1.语法:

type必须是一个类类型且必须是一个有效的指针

dynamic_cast< type* >(e)

type必须是一个类类型且必须是一个左值

dynamic_cast< type& >(e)

type必须是一个类类型且必须是一个右值

dynamic_cast< type&& >(e)

e的类型必须符合以下三个条件中的任何一个:
①.e的类型是目标类型type的公有派生类
②.e的类型是目标type的共有基类
③.e的类型就是目标type的类型。

new_type为目标数据类型,expression为原始数据类型变量或者表达式

2.解析:

①.dynamic_cast主要用于类层次间的上行转换下行转换,还可以用于类之间的交叉转换(cross cast)

②.在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能(dynamic_cast也是一个RTTI运算符),比static_cast更安全。dynamic_cast是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

3.示例:

#include<iostream>
#include<typeinfo>
using namespace std;class base
{
};class derived:public base
{
};int main()
{derived *d1= new derived;cout << "d1转换前的类型:" << typeid(d1).name() << endl;base* b1 = dynamic_cast<base*>(d1);cout << "d1转换后的类型:" << typeid(b1).name() << endl;delete d1;system("pause");return 0;
}

三.const_cast

1.语法:

const_cast<type>(varible);

其中的type类型必须是指针、引用、或者指向对象类型成员的指针

const_cast用于将对象的常量属性转除,使常量可以修改。

2.示例:

 type类型必须是指针、引用或者指向对象类型成员的指针

#include<iostream>
using namespace std;int main()
{const int &a = 10;cout <<"const_cast修改之前a的值:"<< a << endl;const_cast<int&>(a) = 5;cout << "const_cast修改之后a的值:" << a << endl;const_cast<int&>(a) = 20;cout << "const_cast二次修改之后a的值:" << a << endl;system("pause");return 0;
}

其中:

const_cast可以修改定义为const的常量,但仅限于通过const_cast<>()语法进行修改,而不是消除了常量的const属性使得其可以在任意地方进行修改。

总结:

尽量减少转换操作的使用,转换操作耗时较高(特别是dynamic_cast),大量使用会导致性能的下降,尽量使用其他方法代替。

参考文章:(58条消息) static_cast和dynamic_cast详解_ShyHerry的博客-CSDN博客_dynamic_cast

static_cast,dynamic_cast,const_cast详解相关推荐

  1. 显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast

    显式强制类型转换(cast)包括以下操作符: static_cast,  dynamic_cast, const_cast, reinterpret_cast,对各种显式类型转换解释: static_ ...

  2. C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast

    文章目录 前言 数据类型自动转换 C语言中的强制类型转换 C++中的强制类型转换 static_cast dynamic_cast const_cast reinterpret_cast 强转关键字的 ...

  3. C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

    目录 第1部分. 隐式类型转换 第2部分. 显式类型转换 static_cast dynamic_cast reinpreter_cast const_cast 首先回顾一下C++类型转换: C++类 ...

  4. C++类型转换(static_cast,dynamic_cast,const_cast和reinterpret_cast)

    一.概述 类型转换(cast)是将一种数据类型转换成另一种数据类型.例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型(即 隐式转换 ).转换是非常有用的,但是它也会带来一 ...

  5. static_cast, dynamic_cast, const_cast

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况: 1) 算术转换(Arithmetic ...

  6. static_cast, dynamic_cast, const_cast探讨【转】

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况: 1) 算术转换(Arithmetic ...

  7. static_cast, dynamic_cast, const_cast,reinterpret_cast探讨

    http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...

  8. 类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast.

    呵呵,今天来好好看看着几个转换操作符的用法.以前老是看着眼熟,但是用着手生.今天决定搞定这些个东西. 在C语言中类型转换有几种方式: 1.      (expression). 在表达式外边加括号,由 ...

  9. static_cast, dynamic_cast, const_cast学习和探讨

    一 C语言中存在着两种类型转换: 隐式转换和显式转换 隐式转换:不同数据类型之间赋值和运算,函数调用传递参数--编译器完成 1) 算术转换(Arithmetic conversion) : 在混合类型 ...

最新文章

  1. 和csm_假面骑士ooo十周年纪念向csm周边 核心硬币和收纳盒再版
  2. mysql set 子表,mysql update set 更新表数据
  3. virtualenvvirtualenvwrapper on WindowsUbuntu
  4. opencv求解AX=0
  5. [转]避免PHP-FPM内存泄漏导致内存耗尽
  6. adb shell 运行时报错“adb server version (26) doesn‘t match this client (39); killing...“的解决方案
  7. 这是不是你想要的h5手机端弹窗
  8. 【三人行必有我师】同学提分经验分享大全,进步原来如此简单!
  9. 推荐6款习惯养成APP,送给想要提升自己的人!
  10. MKS Robin nano V3.0主板使用RRF 固件教程
  11. 空间句法软件Axwoman6.3 安装及ArcGIS 工具加载
  12. Tilemap瓦片地图
  13. 无法找到合适的显示设备.正在关闭程序
  14. 高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
  15. 谁说码农不懂浪漫?(js写的'老婆生日快乐'特效)
  16. 智安网络丨什么是等保2.0?
  17. docker 搭建在线vscode编辑器
  18. Maxwell-学习笔记
  19. 查看用户登陆历史记录
  20. sklearn降维算法1 - 降维思想与PCA实现

热门文章

  1. 小程序分享功能以及坑
  2. The Fool HDU - 6555
  3. 目标检测txt转xml
  4. 约四成的平板和智能手机用户看电视时“一心多用”
  5. c#写windows服务
  6. (ICLR2019)论文阅读-使用深度增强学习框架的基于场景先验知识的视觉语义导航
  7. DeepDive教程第一部分
  8. 【IOS】IOS工程自动打包并发布脚本实现
  9. 二(1-苯基-异喹啉)(乙酰丙酮)合铱(III)
  10. [SQL]如何实现表数据的去重