类型转换运算符
在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
第一种转换合理得,因为向上转换可以显示的进行,第二从基类指针,到派生类指针,不显示转换无法进行。由于无需进行类型转换,便可以进行另一个方向的类型转换,因此使用static_cast向下转换合法的
同理,由于无需进行类型转换,枚举值就可以被转为整型,因此可用static_cast将整型转为枚举,也可以将double转为int ,float 转为long以及其他各种数值转换