现在的位置: 首页 > 综合 > 正文

C++显式类型转换—static_cast

2017年10月05日 ⁄ 综合 ⁄ 共 1633字 ⁄ 字号 评论关闭

显式类型转换

1.static_cast < type-id > ( expression )
说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。

来源:为什么需要static_cast强制转换?
情况1:void指针->其他类型指针(隐式转换会报错)
情况2:改变通常的标准转换
情况3:避免出现可能多种转换的歧义

任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast.当需要把一个较大的算术类型赋值给较小的类型时,static_cast非常有用,此时,强制类型转换告诉程序的读者和编译器:我们知道并且不在乎潜在的精度损失。

一般来说,如果编译器发现一个较大的算术类型视图赋值给较小的类型(double->int),就会给出警告信息,但是当我们执行了显式的类型转换后,警告信息就会被关闭了。
当把指针存放在void*中,并且使用static_cast将其强制转换回原来的类型时,应该确保指针的值保持不变。

它主要有如下几种用法:
(1)用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。 
(2)用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。 
(3)把void指针转换成目标类型的指针(不安全!!) 
(4)把任何类型的表达式转换成void类型。 

注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

代码示例:

#include<iostream>

using namespace std;

int main()
{
	char a='a';

	cout<<a<<":"<<static_cast<int>(a)<<endl;

	int i=2,j=3;

	double k=static_cast<double>(j)/static_cast<double>(i);

	cout<<k<<endl;

	double d=3.14;

	void *p=&d;//任何非常量对象的地址都能存入void*

	double *dp=static_cast<double*>(p);//正确,将*void转换回初始的指针类型,必须保证转回的类型与原类型相同

	cout<<*dp<<endl;

	system("pause");
	return 0;
}

运行结果:

#include<iostream>

using namespace std;

class A
{

};

class B:public A
{

};

class C:public A
{

};

class D
{

};

int main()
{
	A objA;
	B objB;
	A* pObjA = new A();
	B* pObjB = new B();
	C* pObjC = new C();
	D* pObjD = new D();

	objA=static_cast<A&>(objB);   //转换为基类引用   子类对象->基类对象(安全)
	objA=static_cast<A>(objB);

	//objB=static_cast<B>(objA);  //error 不能进行转换  基类对象->子类对象(不存在)

	pObjA = pObjB;                    //right 基类指针指向子类对象
	//pObjB = pObjA;                  //error 子类指针指向基类对象

	pObjA = static_cast<A*>(pObjB);   //right 基类指针指向子类
	pObjB = static_cast<B*>(pObjA);   //强制转换 OK 基类到子类

	//pObjC = static_cast<C*>(pObjB);   //error 继承于统一类的派生指针之间转换 
	//pObjD = static_cast<D*>(pObjC);   //error 两个无关联之间转换

	system("pause");
	return 0;
}

抱歉!评论已关闭.