命名的强制类型转换: 形式:
cast-name<type>(expression);
type是强制转换的类型,expression是强制转换的值。如果type是引用类型,则结果是左值。case-name是C++四种转换类型static_cast、dynamic_cast、const_cast和reinterpret_cast的一种。
int i;
float j = 10.2;
i = const_cast<int>(j);
const int constant = 21;
int* modifier = const_cast<int*>(&constant);
*modifier = 7;
std::cout << modifier << std::endl;
std::cout << &constant << std::endl;
std::cout << *modifier << std::endl;
std::cout << constant << std::endl;
const_cast常用的情况:
#include <iostream>
using namespace std;
void Printer (int* val,string seperator = "\n")
{
cout << val << seperator;
}
int main(void)
{
const int consatant = 20;
Printer(const_cast<int *>(&consatant));
return 0;
}
**作用于底层二进制。**是特意用于底层的强制转型,导致实现依赖(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制类型在底层代码以外应该极为罕见。操作结果只是简单的从一个指针到别的指针的值得二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。将一个指针转换成其他类型的指针。reinterpret_cast被作为二进制转换重新解释(没有数位损失)。
int j;
int *p = new(int);
j = reinterpret_cast<int>(p);
std::cout << j << std::endl;
主要用于执行“安全的向下转型(safe downcasting)”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。支持父类指针到子类指针的转换,这种转换时最安全的转换。它 是唯一不能用旧风格语法执行的强制类型转换,也是唯一可能有重大运行时代价的强制转换。
【扩展】 旧版的强制类型转换
在早期的C++语言中,显示地进行强制类型转换包含两种形式:
type (expr);
(type) expr;
根据涉及的类型不同,旧式的强制类型转换分别与static_cast、const_cast或reinterpret_cast有相似的行为。当我们在某处执行旧式的强制类型转换时,如果能换成static_cast、const_cast也合法,则其行为与对应的命名转换一致。如果替换不合法,则旧式指针强制转换类型与reinterpret_cast类似的功能。
如:
char *pc = (char*)ip;
char *pc = reinterpret_cast<char*>(ip)
本文参考:
- 《C++ primer》
- https://www.cnblogs.com/heyonggang/p/3361643.html
- https://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html
|