天天看点

C++四种类型转换运算符类型转换运算符dynamic_castconst_caststatic_castreinterpret_cast

类型转换运算符

在c种允许以下转换

struct  Junk
{
	int junk[100];
};
Data d = { 11,23,124 };
char* pch = (char*)(&d);
char ch = char(&d);
Junk* pj = (Junk*)(&d);
           

C++新增

dynamic_cast

若A是B的基类, A *a,B b;

则a = dynamic_cast<A >b;

在类层次结构中进行向上转换

const_cast

该运算符用于执行只有一种用途的转换,即改变值为const 或volatile。语法和dynamic_cast相同

const_cast(expression)

若类型的其它方面也被修改,则上述的类型转换将出错。即除了const 或volatile可以不同外,其它的typename和expression必须相同。

High bar;

const High *pbar = &bar;

High *pb =const_cast<High >(pbar); //ok 删除const标签

const Lowp1 = const_cast<const Low *>(pbar); 不行,同时尝试将const High 转为const Low

也可以通过通用类型转换实现,但通用转换有时候可能会改变类型

High bar;

const High *pbar = &bar;

High *pb = (High *)(pbar);

Low p1 = (Low)(pbar);

由于编程时可能同时改变类型和常量特征,因此使用const_cast更安全。const_cast不是万能,它可以修改一个指向一个值的指针,但修改const值得结果是不确定得。

#include <iostream>
using namespace std;
///指针被申明为const int* ,因此不能修改指向得int。但pc删除了const,因此可以修改原来得值,但仅当指向得值不是const时才是可行得,
//因此可以修改pop1  不能修改pop2.
void change(const int* pt, int n)
{
	int* pc;
	pc = const_cast<int*>(pt);  //删除const
	*pc += n;
}

int main()
{
	int pop1 = 38383;
	const int pop2 = 2000;   //声明为const 禁止修改
	cout << " pop1 :" << pop1 << "; pop2: " << pop2 << endl;
	change(&pop1, -103);
	change(&pop2, -103);
	cout << " pop1 :" << pop1 << "; pop2: " << pop2 << endl;
	//输出
	/*pop1 : 38383; pop2: 2000
	pop1 : 38280; pop2: 2000*/
}

           

static_cast

C++四种类型转换运算符类型转换运算符dynamic_castconst_caststatic_castreinterpret_cast

第一种转换合理得,因为向上转换可以显示的进行,第二从基类指针,到派生类指针,不显示转换无法进行。由于无需进行类型转换,便可以进行另一个方向的类型转换,因此使用static_cast向下转换合法的

同理,由于无需进行类型转换,枚举值就可以被转为整型,因此可用static_cast将整型转为枚举,也可以将double转为int ,float 转为long以及其他各种数值转换

reinterpret_cast

C++四种类型转换运算符类型转换运算符dynamic_castconst_caststatic_castreinterpret_cast

继续阅读