C++中四种类型转换方式
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a,但是c 风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非 const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区 分这些。还有一个缺点就是,c风格的转换不容易查找,他由一个括号加上一个标识符组成,而这样的东西在c++程序里一大堆。所以c++为了克服这些缺点,引进了4种类型转换操作符(C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。):
1、static_cast:可以实现C++中内置基本数据类型之间的相互转换,enum、struct、 int、char、float等。它不能进行无关类型(如非基类和子类)指针之间的转换。
int c=static_cast<int>(7.987);
如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class A
{};
class B: public A
{};
class C
{};
int main()
{
A* a= new A;
B* b;
C* c;
b= static_cast <B>(a); // 编译不会报错, B类继承A类
c= static_cast <B>(a); // 编译报错, C类与A类没有任何关系
return 1;
}
|
2、const_cast: const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。
3、reinterpret_cast: (interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。)有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
4、dynamic_cast:
(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。
(2)不能用于内置的基本数据类型的强制转换。
(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,
只有定义了虚函数的类才有虚函数表。
(5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比 static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
#include<iostream>
#include<cstring>
using namespace std;
class A
{
public :
virtual void f()
{
cout<< "hello" <<endl;
};
};
class B: public A
{
public :
void f()
{
cout<< "hello2" <<endl;
};
};
class C
{
void pp()
{
return ;
}
};
int fun()
{
return 1;
}
int main()
{
A* a1= new B; //a1是A类型的指针指向一个B类型的对象
A* a2= new A; //a2是A类型的指针指向一个A类型的对象
B* b;
C* c;
b= dynamic_cast <B*>(a1); //结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。
if (b==NULL)
{
cout<< "null" <<endl;
}
else
{
cout<< "not null" <<endl;
}
b= dynamic_cast <B*>(a2); //结果为null,向下转换失败
if (b==NULL)
{
cout<< "null" <<endl;
}
else
{
cout<< "not null" <<endl;
}
c= dynamic_cast <C*>(a); //结果为null,向下转换失败
if (c==NULL)
{
cout<< "null" <<endl;
}
else
{
cout<< "not null" <<endl;
}
delete (a);
return 0;
}
|
同时可以参考下:C++开发必看 四种强制类型转换的总结
C++中四种类型转换方式相关推荐
- C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)
Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而 ...
- 【C++】类型转换简述:四种类型转换方式的说明及应用
本文主要简述在C++中四种类型转换的方式:static_cast.reniterpret_cast.const_cast和dynamic_cast. 在介绍C++类型转换方式之前,我们先来看看C语言的 ...
- 【读MFiX源代码】MFiX中四种传热方式全面详解(对流、导热、辐射、反应热)并且输出以供后处理(2020-12-15更新)
文章目录 1 目标 2 代码结构 2.1 des_time_step外层总控制 2.2 颗粒导热 2.2.1 颗粒-颗粒导热:calc_force_dem.f和des_thermo_cond_mod. ...
- C++中四种类型转换运算符的使用方法
C++的四个类型转换运算符已经有很久了,但一直没有弄清楚它们的用法,今天看到一本书上的解释,才大致地的了解了其具体的用法. 具体归纳如下: reinterpret_cast 该函数将一个类型的指针转换 ...
- C++中四种类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast要点解析
1.static_cast typename dst_ptr = static_cast<typename> (src_ptr) 可用于c++基本类型之间的转换,子类与派生类之间的指针转换 ...
- Javascript中四种函数调用方式
为了解释方便,先创建一个函数: function showmsg(){ console.log(this);} 它的作用是打印this这个对象,也方便我们了解它到底指代什么. 一.直接调用 showm ...
- C++中四种 cast 转换
四种 cast 转换 C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast const_cast static_cas ...
- C++/面试 - 四种类型转换(cast)的关键字 详解 及 代码
四种类型转换(cast)的关键字 详解 及 代码 本文原创, 禁止转载, 如有需要, 请站内联系. 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...
- C++中四种cast转换
C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast 1.const_cast 用于将const变量转为非const ...
最新文章
- 【廖雪峰Python学习笔记】函数式编程
- numpy.savetxt()保存两列
- C++中如何访问全局变量和全局函数
- 通过oracle任务计划定期备份数据库
- LInux下du, df, top, free, pstack, su, sudo, adduser, password命令
- 站在Java的角度看LinkedList
- 23种设计模式(1)-单例模式
- paip.验证码识别---扭曲与旋转文字
- 《通关!游戏设计之道》学习笔记
- 倾斜摄影 正摄影_如何安全地在线购买摄影装备
- 火车采集器采集多页内容的抓取方法
- python筛选出csv满足某条件的行_python之pandas数据筛选和csv操作
- srs直播 java开发,通过srs实现直播
- 线性代数笔记17——正交向量与正交子空间
- (集成电路卡)ID卡
- IBM创始人 托马斯·约翰·沃森父子
- c#和python_饮冰三年-人工智能-Python-10之C#与Python的对比
- 供需关系——需求与满意度
- 计算机网络实验指导书谢希仁,计算机网络[谢希仁]实验指导书.doc
- Background背景