c++ 类型转换

类型转换操作

a = dynamic_cast<T*>(p)

Try to convert p into a T*. It may return 0

a = dynamic_cast<T&>(*p)

Try to convert *p into a T&. It maythrow bad_cast

a = static_cast<T>(p)

Convert p into a T if a T can be contertedinto p's type.

a = reinterpret_cast<T>(p)

Convert p into a T represented by the samebit pattern.

a =const_cast<T>(p)

Convert p into a T by adding or subtractingconst.

a = (T)v

C-style cast.

a = T(v)

Functional cast.

const_cast

const_cast 用来去掉对象的const 限制,c++中只有此操作符可以完成这个功能。

其语法格式为:

const_cast < type-name > (expression)

示例代码如下:

#include <iostream>
#include <cstring>
using namespace std;
int main () {
	string str("A123456789");
	const char *cstr = str.c_str();
	char *nonconst_cstr  = const_cast<char *> (cstr) ; 
	*nonconst_cstr ='B';
	cout << nonconst_cstr << endl;
	return 0;
}
reinterpret_cast
reinterpret_cast 是一种比较低级的转换,这种转帐非常不可靠,个人建议少用。
其语法格式为:
reinterpret_cast < type-name > (expression)
示例代码:

#include <iostream>
using namespace std;

struct data {
	short a; 
	short b;
};

int main () {
	long value = 0xA2345678;
	data* pdata = reinterpret_cast<data*> (&value);
	cout << pdata->a << endl;
	return 0;
}
static_cast
static_cast 用来强制的内存转换,如:non-const 对象到 const 对象,int 到double.此操作可以完成除const 到 non-const的所有转换。
语法格式:
static_cast < type-name > (expression)
示例代码:

class Base {};
class Derived : public Base {};
class UnrelatedClass {};

int main() 
{
	Base base;
	Derived derived;

	// #1: valid upcast
	Base *pBase = static_cast<Base *>(&derived);  

	// #2: valid downcast
	Derived *pDerived = static_cast<Derived *> (&base);

	// #3: invalid, between unrelated classes
	UnrelatedClass *pUnrelated 
		= static_cast<UnrelatedClass *> (&derived);
}

通过此示例代码可以得知:static_cast 可以在继承类间向上转换,向下转换但不能在不相关类之间做转换。
dynamic_cast
dynamic_cast 是用来在类的继承关系中安全的向下转换。
示例代码见上一个博文。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值