类型转换

C++中类型之间的转换 有c风格 和 C++风格两种:
C风格:
int a = 5;
void fun(float n){...};
fun((float) a);
即是: (Type) expression 格式;
c++风格:
C++在C的基础上又提供了四种转换格式:
static_cast<Type>(Expression), const_cast<Type>(expression), dynamic_cast<Type>(Expression),
reiterpret_cast<Type>(expression);

dynamic_cast<Type>(expression)小例子:
class Cast//基类
{
public:
virtual ~Cast(){};//虚析构函数
virtual void CastTo(){cout<<"base"<<endl;}//虚函数实现动态绑定
void Ok(){cout<<"BaseOK"<<endl;}//非虚函数 实现静态绑定
};
class DeriveCast:public Cast//派生类 public 继承 一般是Isa的关系 即该派生类的对象也是一种基类的对象,反过来不成立
{
public:
~DeriveCast(){};
virtual void CastTo(){cout<<"Derive"<<endl;}
void Ok(){cout<<"DeriveOK"<<endl;}
}; 
void main()
{
Cast *pCast = NULL;
Cast *pBase = new Cast;
pCast = new DeriveCast;
pCast->CastTo();//由于CastTo()是虚函数属于动态绑定,而pCast动态类型是指向派生类的指针,所以调用派生类的CastTo()

pCast->Ok();//由于Ok()是非虚函数是静态绑定类型,既有pCast的静态类型决定调用哪个函数,pCast的静态类型是基类指针所以调用基类的Ok()函数
dynamic_cast<DeriveCast*>(pCast)->Ok();//经过转换,暂时改变了pCast的静态指针类型为派生类,所以调用派生类的
dynamic_cast<DeriveCast*>(pCast)->CastTo();//暂时改变静态类型为派生类指针类型,并不影响CastTo()动态绑定调用
if (pCast)//已经恢复为原来的静态指针类型 所以还是调用基类的静态绑定函数
{
pCast->Ok();
}
pBase->Ok();//静态绑定和动态绑定都是基类指针类型调用基类的

dynamic_cast<DeriveCast*>(pBase)->Ok();//暂时转换为派生类指针类型 调用派生类的函数
if (pBase)
{
pBase->Ok();//调用基类的函数
}
}
const_cast<Type>(Expression):功能是转换掉原先的Const类型:
const 类型是可以转换掉,但原先声明为 const 的那个变量所代表的数值并不会改变:例子:
void main()
{
const int num=1;
int *p=const_cast<int *>(&num);
*p=2;
cout<<num<<endl;//输出1
cout<<*p<<endl;//输出2
// 但&num和p却是相同的这是为什么?
cout<<&num<<endl;
cout<<p<<endl;
}
我的理解是,const 类型的对象,是不会改变的 所以在声明const类型时 就已经把整个对象完整不动的放置在一个别处的一个const表里,当用户要读它时 编译器直接从表里读取该对象,而不再是从变量名所对应的地址里读取了,所以即使你更改了该对象地址里的数据,也不会影响声明为const的对象变量值。
const_cast 只对对象的指针或引用好使,直接对对象本身则是不行的。
比如:const int a= 3;const_cast<int>(a) =5;则是无法通过编译的。报错不能将const int 类型 转为 int类型。

static_cast:其功能类似与c 函数的强制转换.使用方式:int a =1;static_cast<float>(a) = 2.1;

reinterpret_cast 最常见的用法是在函数指针类型之间进行转换。现在很少用到暂时不做总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值