5个cast转型

const_cast

  • 去除表达式的const性质
  • const_cast是唯一能将const性质转化掉的操作符,但执行其他任何类型的转换都会引起编译错误。

单纯的把常量转为变量是没多少意义的,也就是这种代码:

12
const int con =12;int cc= static_cast<int>(con);

直接用变量或者mutable就好了。

如果定义了一个非const的变量,却使用了一个指向const值的指针来指向它(不规范的风格),在进程的某处我们想改变这个变量的值了,但手头只持有指针,这是const_cast就可以用到了:

1234
int constant = 26;const int* const_p = &constant;int* modifier = const_cast<int*>(const_p);*modifier = 3;

这并不是一个好的设计,还是应该遵从这样的原则:使用const_cast去除const限定的目的绝对不是为了修改它的内容,只是出于无奈,所以最好少用转型。

如果有一个函数,它的形参是non-const类型变量,而且函数不会对实参的值进行改动,这时我们可以使用类型为const的变量来调用函数,也就用到const_cast了。

123456789
void InputInt(int * num){    cout<<*num<<endl;}int main(){    const int constant = 21;    InputInt(const_cast<int*>(&constant));}

dynamic_cast

dynamic_cast用于类继承层次间的指针或引用转换。和qobject_cast类似,用于执行“安全的向下转型“,也即是基类对象的指针或引用转换为同一继承层次的其他指针或引用。至于“向上转型”,本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的。

向下转型有两种情况。一种是基类指针所指对象是派生类类型的,这种转换是安全的;另一种是基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做类型检查,转换失败,返回结果为0;
最常用的情况是这样:

大专栏  5个cast转型 class="gutter">

123
Base* bb = new Derive();Derive* dd = dynamic_cast<Derive*>(bb);dd->test();

使用dynamic_cast转换的基类至少带有一个虚函数,否则会报错:error: C2683: “dynamic_cast”:“Base”不是多态类型。虚函数表是是dynamic_cast操作符转换能够进行的前提条件。当类没有虚函数表的时候,dynamic_cast无法使用RTTI,不能通过编译。

dynamic_cast在基类和派生类指针之间转换时,会遍历整个继承体系进行类型检查,因此dynamic_cast在执行效率上比static_cast要差一些,但安全性好。比如4级的继承结构,dynamic_cast<Base>将会调用4次strcmp才能确定最终的那个子类型,尤其避免连续使用转型,用虚函数代替这种情况。

static_cast

类似于C风格的强制转换。无条件转换,静态类型转换。用于:

  1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的,此时建议用dynamic_cast。
  2. 基本数据类型转换,例如double, int, char, float等,不能进行无关类型(如非基类和子类)指针之间的转换。
12
double a = 1.999;int b = static_cast<double>(a); //相当于a = b ;

大多数的编译器都会给出一个警告:从“double”转换到“int”,可能丢失数据。static_cast可以明确告诉编译器,这种损失精度的转换是在知情的情况下进行的

  1. 把空指针转换成目标类型的指针
1234
double a = 1.999;void * vptr = & a;double * dptr = static_cast<double*>(vptr);cout<<*dptr<<endl;//输出1.999
  1. 把任何类型的表达式转换成void类型。
  2. static_cast不能去掉类型的const、volitale属性(用const_cast)。

static_cast进行的是简单粗暴的转换,static_cast不做运行时的类型检查以保证转换的安全性,所以static_cast不如dynamic_cast安全,其正确性完全由进程员自己保证。

reinterpret_cast

qobject_cast

参考:qobject_cast 分析及QTBUG 20616

原文地址:https://www.cnblogs.com/liuzhongrong/p/12000102.html

时间: 2024-11-13 10:21:01

5个cast转型的相关文章

AndroidStudio中代码模板的使用

在使用AndroidStudio进行代码编写的过程中,随着使用时间的增加和各种插件的使用,我们发现了很多快捷快速敲代码的方式.如: "somethind".log 可以直接打印出Log日志的内容 Log.d("MainActivity", "something"); 这样的快捷方式还有很多,例如 .if的使用,Toast+Tab键的使用,fori的使用直接补全for循环结构,这些快捷方式都是AndroidStudio提供给开发者使用的,有一些功能

Java向上转型和向下转型(附具体样例)

                                            Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { public void eat() { System.out.println("父类的 eating..."); } } class Bird extends Animal { @Override publ

Java转型(向上转型和向下转型)

在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念"人".再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类).我们现实中也经常这样说:麻雀是鸟.这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类.这也符合Java提倡的面向抽象编程思想.来看下面的代码: package a.

重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)

多态,大概每个人都知道.但是,又有几个人真的理解什么是多态.多态有哪些细节呢?如果你看到这篇文章的名字,脑海中对多态没有一个清晰的概念,不妨点进来看看,也许会有收获. 什么是多态 简单的理解多态 多态,简而言之就是同一个行为具有多个不同表现形式或形态的能力.比如说,有一杯水,我不知道它是温的.冰的还是烫的,但是我一摸我就知道了.我摸水杯这个动作,对于不同温度的水,就会得到不同的结果.这就是多态. 那么,java中是怎么体现多态呢?我们来直接看代码: public class Water { pu

Java向上转型和向下转型(附详细例子)

                                            Java向上转型和向下转型(附详细例子) 熬夜整理的关于Java向上和向下转型的例子,非常的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { public void eat() { System.out.println("父类的 eating..."); } } class Bird extends Animal { @Override pub

Java面向对象作业-用接口方式测试向下转型

Java面向对象作业-用接口方式测试向下转型 根据视频的里实例 我们直接修改Test2测试方法: 1 package com.java1234.chap03.sec13; 2 3 public class Test2 { 4 5 public static void main(String[] args) { 6 People p1=new Student(); 7 p1.say(); 8 9 Student student=(Student) p1; 10 student.say(); 11

Java入门记(二):向上转型与向下转型

在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转型,动态绑定 例三:向上转型,静态绑定 例四:向下转型 转型的误区 1.运行信息(RTTI) 2.数组类型 3.Java容器 几个同义词 首先是几组同义词,由于在不同的书上使用的不同,是造成混淆的原因之一. 父类/超类/基类 子类/导出类/继承类/派生类 静态绑定/前期绑定 动态绑定/后期绑定/运行时绑定 向

C++四种cast

1. c风格强制转换 int a=1; char b=(char)a; 这种转换适用于面向过程的没有类的概念的c语言的转换,然而这样的转换符也能不分青红皂白的应用于类和类的指针,没有安全检查. 2. const_cast 用法:const_cast<type_id> (expression) 用于修改类型的const或volatile属性,一般用于强制消除对象的常量性,c中不提供消除这const的机制 3. static_cast 用法:static_cast<type_id> (

[转]向上转型与向下转型

原文地址:http://www.cnblogs.com/wuyuegb2312/p/3858521.html 在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转型,动态绑定 例三:向上转型,静态绑定 例四:向下转型 转型的误区 1.运行信息(RTTI) 2.数组类型 3.Java容器 几个同义词 首先是几组同义词.它们出现在不同的书籍上,这是造成理解混淆的原