在C语言中其实已有类型转换,比如强制类型转换,形式上是
(type) expression
对标C中的强制类型转换,C++中按照类型转换的意图对他们进行了分类,形式上是
static_cast <type> (expression)
static_cast可以理解成一种转换意图的说明,与其相关的操作符还有以下几个
1、 static_cast:实现基本数据类型的转换
基本数据类型转换在C语言中直接就是强制转换了,就比如像这样
double a = 1.0;
int b = (int)a;
但在C++中此种转换,可借助static_cast,写法是
double a = 1.0;
int a = static_cast <int> a;
2、dynamic_cast:主要用于对象指针(或引用)安全的向下转型(涉及继承时使用)
大致有下面这几种情况,这几种情况所描述的背景是,Base是一个父类,Derived是一个子类,继承了父类Base,其他具体看程序,
情况①
Base *base ;
Derived *der = new Derived;
base = dynamic_cast<Base*>(der); //正确,但不必要。
针对指针来说,这是一种向上转型(儿子向父亲转,往上嘛),向上转型是一定能成功的,并且不加dynamic_cast,因为其本身就是安全的,子类与父类相比,所包含的东西一定是大于等于父类,所以多的往少的转肯定是可以成功的。
情况②
Base* base = new Derived;
Derived *der= dynamic_cast<Derived*>(base);
针对指针来说,这是一种向下转型(父亲向儿子转,往下嘛),但是由于父类指针指向的是一个子类对象,咱就是说,虽然指针的级别不够,但是其实实在在有子类的东西,子类的东西属于多的那方,所以其往子类指针转,仍是安全可行的。
情况③
Base * base = new Base;
Derived *der = dynamic_cast<Derived*>(base)
这也是一种向下转型,但是其实实在在的内容只有父类对象那么多,是属于少的那一方,他却想要去转变成子类的指针,万一子类指针想去访问一下自己子类中的独有成员(而非父类继承来的),那不就寄了,这根本没有啊,实际有的只有父类的东西,所以说这种转型是一种不安全的转型。
3、const_cast:改变某物的常量性(constness)或变易性(volatileness) ,一般可以用于去除某个量的常量性,当然也可以是增加常量性。
4、reinterpret_cast:不需要有继承关系,将一种指针类型转换成另一种指针类型,往往用于不同类型的函数指针转换。但是这种转换是一种不具有可移植性的转换,不同的编译器可能会有不同,所以除非万不得已,否则别用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)