C++中的显式类型转换
一、学习总结
1.C++中额外提供的类型转换有
(1) reinterpret_cast:
格式:reinterpret_cast<type-id> (expression)
①type-id必须是一个指针、引用、算术类型、函数指针或成员指针。
②可以把一个指针转换成一个整数,也可以把一个整数转换成指针。
③跟C风格的强制类型转换类似(相当于C中使用小括号进行的类型转换),没有安全性检测。
eg:
int *p = (int *)pstr;
int *p = reinterpret_cast<int *>pstr;
注意:reinterpret_cast只能进行类型转换,但是不能去掉const属性
(2) const_cast
格式:const_cast<type-id> (expression)
①const_cast用于去除原类型的const或volatile属性。除了const和volatile修饰之外type-id需要和expression的类型是一样的(也就是说只有去
除const和volatile属性的功能)
对于const的转换的作用应该只是去掉编译警告而已,例如:
char *ptr = const_cast<char *>("hello world");
ptr[1] = 'M'; //Segmentation fault (core dumped)
(3) dynamic_cast
格式:dynamic_cast<type-id> (expression)
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;
如果type-id是类指针类型,那么expression也必须是一个指针;如果type-id是一个引用,那么expression也必须是一个引用。
①用于多态场合,即:必须有虚函数。
②主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
③在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
注意:dynamic_cast只能用在具有虚函数的类里面
原因:使用虚函数后类中会多出一个虚函数指针,指向虚函数表,虚函数表中不仅仅只有虚函数,还有那些类的信息,里面包含了继承关系,
dynamic_cast依据这些信息进行类型转换。dynamic_cast这个函数根据虚函数指针找到虚函数表中的类信息,从而知道要转换的对象是不是属
于某一个类的。因此动态类型转换只能用在具有虚函数的类里面。
称为动态转换的原因:是在运行时决定的,比如父类指针作为参数接收子类对象。
(4) static_cast
格式:static_cast<type-id> (expression)
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
①用于类层次结构中基类和子类之间指针或引用的转换。
②进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
③进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。
④用于基本数据类型之间的转换,如把int转换成char,把int转换成enum:这种转换的安全性也要开发人员来保证。
⑤把void指针转换成目标类型的指针(不安全!!)
⑥把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
称为静态转换的原因:编译器在编译期决定的。
2.这些转换后面要跟一个()表明他们是函数,带有<type-id>表明他们是模板函数。
3.类之间的转换用于上下行转换,无关的类之间是不可以强制类型转换的。
4.多态是指向谁的实例就调用谁的函数,例如Child的指针指向new出来的Parent的实例,通过Child类型的类指针调用的是Parent的成员函数(前提是虚函数)。
5.类的指针通过类型可以直接调用成员函数,但是不可以直接操作成员变量。
Person *p1 = NULL;
p1->hello(); //这里是完全没有问题的!!!!
p1->a = 10; //Segmentation fault (core dumped)
二、Demo
#include <iostream>
using namespace std;
class Human {
int a;
public:
int b;
virtual void eating() {
cout << "use hands" << endl;
}
//this is an exception,return Human*/&Human*
virtual Human* return_test_ptr() {
return this;
}
};
class English : public Human {
public:
int b;
void eating() {
cout << "use knifes" << endl;
}
English* return_test_ptr() {
return this;
}
void descriptor() {
cout << "I am a English woman" << endl;
}
};
class Chinese : public Human {
public:
int b;
void eating() {
cout << "use chopsticks" << endl;
}
};
void eating_test(Human *h) {
English *pe = NULL;
h->eating();
if (pe = dynamic_cast<English *>(h)) { //转换成功返回非NULL
cout << "English man" << endl;
pe->descriptor();
}
if (dynamic_cast<Chinese *>(h)) { //转换失败返回NULL, 利用dynamic_cast的检查。
cout << "Chinese man" << endl;
}
}
int main() {
Human *ph1 = new Human();
Human *ph2 = new Human();
Human *ph3 = new Human();
Chinese *pc = new Chinese();
English *pe = new English();
cout << "---------test: reinterpret_cast---------" << endl;
int *pa = reinterpret_cast<int *>(~);
cout << "---------test: const_cast---------------" << endl;
char *ptr = const_cast<char *>("hello world");
cout << "---------test: static_cast---------------" << endl;
ph1 = static_cast<Human *>(pc); // Uplink convert
//pe = static_cast<English *>(pc); // error
pc = static_cast<Chinese *>(ph2); //Downlink conversion
pc->eating();
cout << "---------test: dynamic_cast-------------" << endl;
eating_test(pe);
return ;
}
/*
---------test: reinterpret_cast---------
---------test: const_cast---------------
---------test: static_cast---------------
use hands
---------test: dynamic_cast-------------
use knifes
English man
I am a English woman
*/
C++中的显式类型转换的更多相关文章
- C#中,使用显式类型转换(int)和Math.Round方法,将浮点数转换为整数的区别
主要区别就是,显式类型转换(int)是将浮点数的整数部分截取出来,然后转换为整数,所以相当于是向下取整.而Math.Round方法是对浮点数进行四舍五入后,转换为整数. 新建一个.NET Core控制 ...
- C++显式类型转换
C++显式类型转换 (注:本文例程改编自<C++ Primer>) 关于类型转换,C++保留了C语言中的类型转换方式,并提供了4中新的类型转换方式.<Effective C++> ...
- Spring装配bean(在java中进行显式配置)
1.简单介绍 Spring提供了三种装配机制: 1.在XML中进行显式配置: 2.在java中进行显式配置: 3.隐式的bean发现机制和自动装配. 其中,1和3项在项目中经常使用,而在java中进行 ...
- C++进阶--显式类型转换(casting)
//############################################################################ /* * 显式类型转换 * * 类型转换 ...
- C++中的显式类型转化
类型转化也许大家并不陌生,int i; float j; j = (float)i; i = (int)j; 像这样的显式转化其实很常见,强制类型转换可能会丢失部分数据,所以如果不加(int)做强制转 ...
- Java :构造器中的显式参数和this隐式参数
1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...
- javascript显式类型转换
尽管js可以做许多自动类型转换,但某些时候仍然需要做显示类型转换或为了代码逻辑清晰易读而做显示类型转换. 做显示类型转换最简单的方法就是用Boolean().Number().String()或Obj ...
- 【RS】CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Collaborative Filtering-CoupledCF:在推荐系统深度协作过滤中学习显式和隐式的用户物品耦合
[论文标题]CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Colla ...
- 008.在C#中,显式接口VS隐式接口
原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp (At ...
随机推荐
- TCP拥塞控制和流量控制
TCP 的流量控制与拥塞控制可以说是一体的.流量控制是通过滑动窗口实现的,拥塞避免主要包含以下2个内容: (1)慢开始,拥塞避免 (2)快重传,快恢复 1.流量控制——滑动窗口 TCP采用大小可变 ...
- HUSTOJ配置文件
转载:http://blog.csdn.net/zhblue/article/details/7366194 经常有用户询问如何开发一些功能,实际上这些功能都已经有,或者部分实现了,只需要修改配置文件 ...
- python字符串转换成数字
Action(){ int i; char *s="{str}"; i=atoi(lr_eval_string(s)); lr_output_message("%d&qu ...
- 7 Serial Configuration 理解(三)
*Dynamic Reconfiguration Port(DRP) 动态重配置端口:在7系列FPGA中,配置存储器主要用于实现用户逻辑,连接和I / O,但它也用于其他目的. 例如,它用于指定功能块 ...
- JSP组件Telerik UI for JSP发布R1 2019 SP1|附下载
Telerik UI for JSP拥有由Kendo UI for jQuery支持的40+ JSP组件,同时通过Kendo UI for jQuery的支持能使用JSP封装包构建现代的HTML5和J ...
- codeforce949A(顺带vector详细使用介绍)
A. Zebras time limit per test1 second memory limit per test512 megabytes inputstandard input outputs ...
- 基于.NET Core 框架搭建WebApi项目
一 什么是.NET Core? 随着2014年 Xamarin和微软发起.NET基金会,微软在2014年11月份开放.NET框架源代码.在.NET开源基金会的统一规划下诞生了.NET Core .也就 ...
- TCCSuperPlayerView让Delphi支持app视频播放!
今天ChinaCock发布了新版,完美支持视频播放!新版本中,发布了新的控件TCCSuperPlayerView,以支持视频播放. 这是一个可视控件,拖放到Form上,调整好大小与位置,就可以调用他的 ...
- linux 基本命令大全
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- 《统计学习方法》笔记(8):AdaBoost算法
AdaBoost是最有代表性的提升算法之一.其基本思想可以表述为:多个专家的综合判断,要优于任意一个专家的判断. 1.什么是提升算法? "装袋"(bagging)和"提升 ...