了解c++中的类型转换
来源:互联网 发布:java实战项目百度云 编辑:程序博客网 时间:2024/06/05 18:56
1、static_cast(隐式类型转换)—–>相关类型的转换
static_cast用于非多态类型的转换(静态转换),任何标准转换都可以用它,但
它不能用于两个不相关的类型进行转换。
2、reinterpret_cast(强制类型转换)
reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。
3.const_cast(去const属性的类型转换)
const_cast最常用的用途就是删除变量的const属性,方便赋值。
4、dynamic_cast(动态类型转换)——->适用于多态
dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针->父类指针/引用(不需要转换)
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)
重点:转换需要满足以下条件:
1. dynamic_cast只能用于含有虚函数的类
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
示例:
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;struct A{ A(int a) :_a(a) {} virtual void fun() {} int _a;};struct B :public A{ B(int a, int b) :_b(b) , A(a) {} int _b;};void Fun(A* pa){ //如何判断pa绑定的对象是父类对象还是子类对象 B* pb1 = dynamic_cast<B*> (pa);//动态转换 B* pb2 = reinterpret_cast<B*> (pa);//强制类型转换 cout << pb1 << endl; cout << pb2 << endl;}void Test(){ A a1(1);//构造函数 //应该为:先调构造函数使用4构造一个A类的对象,再使用这个临时对象拷贝构造一个A类的对象a2. //可以使用下面方式来构造一个A类类型的对象的条件是: //①构造函数必须是单参的; //②构造函数不能使用explict修饰,explict关键字防止隐式类型转换 A a2 = 4; //(隐式类型转换)编译器对这个表达式做了优化,即就是只调了A类的构造函数。 B bb(2,3); Fun(&a1);//绑定父类对象 Fun(&bb);//绑定子类对象}int main(){ Test(); return 0;}
结果如下:
从上述结果可得:
当将绑定父类对象的指针转换(强转或者动态转换)为子类的指针时,动态转换的子类指针结果为空(0)。
而将绑定子类对象的指针转换(强转或动态转换)为子类的指针时,动态转换的子类指针和强制类型转换的结果相等且不为0。
1 0
- 了解c++中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET中的类型转换
- c语言中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- C#.NET 中的类型转换
- Linux入门(5)——Ubuntu16.04安装网易云音乐
- rdis 缓存
- 我理解的MVC开发模式
- 2017Emacs
- collectionView 滚动到制定位置
- 了解c++中的类型转换
- java 5种设计模式
- How the backpropagation algorithm works
- Linux入门(6)——Ubuntu16.04安装atom
- html
- Leetcode -- 31. Next Permutation
- mysql从服务列表里消失了
- ganglia监控hadoop集群配置
- 我的Linux学习一(CentOS 7在虚拟机中的下载与安装)