C++命名的强制类型转换(static_cast dynamic_cast const_cast reinterpret_cast)

cast_name<type>(expression)

1.

static_cast:任何具有明确定义的类型转换,只要不包含底层const(比如常量指针,而不是指针常量),都可以使用。常用于窄化转换(告诉程序的读者和编译器:我们知道并且不在乎潜在的精度损失),编译器无法自动执行的类型转换(找回存在于void*指针中的值)。

a.用于类层次结构中基类和派生类之间指针或者引用的转换(up-casting把派生类的指针或引用转换成基类的指针或引用是安全的,down-casting把基类的指针或引用转换成派生类的指针或引用是不安全的)。

b.基本类型之间的转换。

c.把空指针转换成目标类型。

d.不能提供数字到指针的转换,不能提供不同类型指针之间的转换。


2.

const_cast:只能改变运算对象的底层const(一旦我们去掉了某个对象的const性质,编译器就不再阻止我们对该对象进行写操作了。如果对象本身不是一个常量,使用强制类型转换获得写权限是合法的行为。然而如果对象是一个常量,再使用const_cast执行写操作就会产生未定义的后果)。只有const_cast能改变表达式的常量属性,使用其他形式的命名强制类型转换改变表达式的常量属性都将引发编译器错误。同样的,也不能用const_cast改变表达式的类型。常用于函数重载中

//比较两个string对象的长度,返回较短的那个引用.
const string &shortString(const string &s1,const string &s2)
{
	return s1.size()<=s2.size()?s1:s2;
}
/*当我们对两个非常量的string实参调用这个函数,但返回的结果仍然是const string的引用。因此我们需要一种新的shortString函数,当它的实参不是常量时,得到的结果是一个普通的引用,使用const_cast可以做到这一点:*/
string &shortString(string &s1,string &s2)
{
	//调用这个函数的目的:我们只要比较大小,这样调用是声明我们不能修改参数!!
	auto &r=shortString(const_cast<const string&>(s1),const_cast<const string&>(s2));
	return const_cast<string&>(r);
}


3.

reinterpret_cast:通常为运算对象的位模式提供较低层次上的重新解释(数字到指针之间的转换,不同类型指针之间的转换)。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝,在类型之间指向的内容不做任何类型的检查和转换。慎用!!


4.

dynamic_cast:该转换符用于将一个指向派生类的基类指针或引用转换为派生类的指针或引用,注意dynamic_cast转换符只能用于含有虚函数的类。比如含有虚函数的基类B和从基类B派生出的派生类D,则B *pb; D *pd, d; pb=&d; pd=dynamic_cast<D*>(pb); 最后一条语句表示把指向派生类D的基类指针pb转换为派生类D的指针,然后将这个指针赋给派生类D的指针pd,有人可能会觉得这样做没有意义,既然指针pd要指向派生类为什么不pd=&d;这样做更直接呢?因为虚函数的基类版本和派生类版本必须具有相同的形参类型。就是当在派生类中覆盖虚函数时,若参数有基类指针或引用,需在函数里将参数强制转换为派生类指针或引用。也即有些时候我们需要强制转换,比如如果指向派生类的基类指针B想访问派生类D中的除虚函数之外的成员时就需要把该指针转换为指向派生类D的指针,以达到访问派生类D中特有的成员的目的,比如派生类D中含有特有的成员函数g(),这时可以这样来访问该成员dynamic_cast<D*>(pb)->g();因为dynamic_cast转换后的结果是一个指向派生类的指针,所以可以这样访问派生类中特有的成员。但是该语句不影响原来的指针的类型,即基类指针pb仍然是指向基类B的。如果单独使用该指针仍然不能访问派生类中特有的成员。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值