详解C++中const_cast与reinterpret_cast运算符的用法
const_cast运算符
从类中移除const、volatile和__unaligned特性。
语法
const_cast< type-id >( expression )
备注
指向任何对象类型的指针或指向数据成员的指针可显式转换为完全相同的类型(const、volatile和__unaligned限定符除外)。对于指针和引用,结果将引用原始对象。对于指向数据成员的指针,结果将引用与指向数据成员的原始(未强制转换)的指针相同的成员。根据引用对象的类型,通过生成的指针、引用或指向数据成员的指针的写入操作可能产生未定义的行为。
您不能使用const_cast运算符直接重写常量变量的常量状态。
const_cast运算符将null指针值转换为目标类型的null指针值。
//expre_const_cast_Operator.cpp //compilewith:/EHsc #include<iostream> usingnamespacestd; classCCTest{ public: voidsetNumber(int); voidprintNumber()const; private: intnumber; }; voidCCTest::setNumber(intnum){number=num;} voidCCTest::printNumber()const{ cout<<"\nBefore:"<<number; const_cast<CCTest*>(this)->number--; cout<<"\nAfter:"<<number; } intmain(){ CCTestX; X.setNumber(8); X.printNumber(); }
在包含const_cast的行中,this指针的数据类型为constCCTest*。const_cast运算符会将this指针的数据类型更改为CCTest*,以允许修改成员number。强制转换仅对其所在的语句中的其余部分持续。
reinterpret_cast运算符
允许将任何指针转换为任何其他指针类型。也允许将任何整数类型转换为任何指针类型以及反向转换。
语法
reinterpret_cast<type-id>(expression)
备注
- 滥用reinterpret_cast运算符可能很容易带来风险。除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。
- reinterpret_cast运算符可用于char*到int*或One_class*到Unrelated_class*之类的转换,这本身并不安全。
- reinterpret_cast的结果不能安全地用于除强制转换回其原始类型以外的任何用途。在最好的情况下,其他用途也是不可移植的。
- reinterpret_cast运算符不能丢掉const、volatile或__unaligned特性。有关移除这些特性的详细信息,请参阅const_castOperator。
- reinterpret_cast运算符将null指针值转换为目标类型的null指针值。
- reinterpret_cast的一个实际用途是在哈希函数中,即,通过让两个不同的值几乎不以相同的索引结尾的方式将值映射到索引。
#include<iostream> usingnamespacestd; //Returnsahashcodebasedonanaddress unsignedshortHash(void*p){ unsignedintval=reinterpret_cast<unsignedint>(p); return(unsignedshort)(val^(val>>16)); } usingnamespacestd; intmain(){ inta[20]; for(inti=0;i<20;i++) cout<<Hash(a+i)<<endl; }
Output:
64641 64645 64889 64893 64881 64885 64873 64877 64865 64869 64857 64861 64849 64853 64841 64845 64833 64837 64825 64829
reinterpret_cast允许将指针视为整数类型。结果随后将按位移位并与自身进行“异或”运算以生成唯一的索引(具有唯一性的概率非常高)。该索引随后被标准C样式强制转换截断为函数的返回类型。