命名的强制类型转换符号的一般形式如下:
cast-name<type>(expression);
其中 cast-name 为 static_cast、dynamic_cast、const_cast 和reinterpret_cast 之一,type 为转换的目标类型,而 expression 则是被强制转换的值。强制转换的类型指定了在 expression 上执行某种特定类型的转换。
dynamic_cast
dynamic_cast 支持运行时识别指针或引用所指向的对象。对 dynamic_cast 的讨论将在第 18.2 节中进行。
const_cast
const_cast ,顾名思义,将转换掉表达式的 const 性质。例如,假设有函数 string_copy,只有唯一的参数,为 char* 类型,我们对该函数只读不写。在访问该函数时,最好的选择是修改它让它接受 const char* 类型的参数。如果不行,可通过 const_cast 用一个 const 值调用 string_copy 函数:
const char *pc_str;
char *pc = string_copy(const_cast<char*>(pc_str));
只有使用 const_cast 才能将 const 性质转换掉。在这种情况下,试图使用其他三种形式的强制转换都会导致编译时的错误。类似地,除了添加或删除 const 特性,用 const_cast 符来执行其他任何类型转换,都会引起编译错误。
static_cast
编译器隐式执行的任何类型转换都可以由 static_cast 显式完成:
double d = 97.0;
// cast specified to indicate that the conversion is intentional
char ch = static_cast<char>(d);
当需要将一个较大的算术类型赋值给较小的类型时,使用强制转换非常有用。此时,强制类型转换告诉程序的读者和编译器:我们知道并且不关心潜在的精度损失。对于从一个较大的算术类型到一个较小类型的赋值,编译器通常会产生警告。当我们显式地提供强制类型转换时,警告信息就会被关闭。
如果编译器不提供自动转换,使用 static_cast 来执行类型转换也是很有用的。例如,下面的程序使用 static_cast 找回存放在 void* 指针中的值(第 4.2.2 节):
void* p = &d; // ok: address of any data object can be stored in a void*
// ok: converts void* back to the original pointer type
double *dp = static_cast<double*>(p);
可通过 static_cast 将存放在 void* 中的指针值强制转换为原来的指针类型,此时我们应确保保持指针值。也就是说,强制转换的结果应与原来的地址值相等。
reinterpret_cast
reinterpret_cast 通常为操作数的位模式提供较低层次的重新解释。
reinterpret_cast 本质上依赖于机器。为了安全地使用 reinterpret_cast,要求程序员完全理解所涉及的数据类型,以及编译器实现强制类型转换的细节。
As an example, in the following cast
例如,对于下面的强制转换:
int *ip;
char *pc = reinterpret_cast<char*>(ip);
程序员必须永远记得 pc 所指向的真实对象其实是 int 型,而并非字符数组。任何假设 pc 是普通字符指针的应用,都有可能带来有趣的运行时错误。例如,下面语句用 pc 来初始化一个 string 对象:
string str(pc);
is likely to result in bizarre run-time behavior.
它可能会引起运行时的怪异行为。
用 pc 初始化 str 这个例子很好地说明了显式强制转换是多么的危险。问题源于类型已经改变时编译器没有提供任何警告或错误提示。当我们用 int 型地址初始化 pc 时,由于显式地声明了这样的转换是正确的,因此编译器不提供任何错误或警告信息。后面对 pc 的使用都假设它存放的是 char* 型对象的地址,编译器确实无法知道 pc 实际上是指向 int 型对象的指针。因此用 pc 初始化 str 是完全正确的——虽然实际上是无意义的或是错误的。查找这类问题的原因相当困难,特别是如果 ip 到 pc 的强制转换和使用 pc 初始化 string 对象这两个应用发生在不同文件中的时候。
分享到:
相关推荐
LabVIEW中TCP通讯需要用到的强制类型转换的使用方法
C++4种强制类型转换 C++4种强制类型转换 C++4种强制类型转换 C++4种强制类型转换
27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型转换.zip27.java强制类型...
有如下结构体定义: typedef struct cemsg { uchar dl; uchar mg; uchar data[10]; }CEMSG; typedef struct msg{ uchar id;... void ap_getmsg(MSG *d_OsMsgPtr,CEMSG *d_Ce
C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。
FLEX强制类型转换FLEX强制类型转换FLEX强制类型转换FLEX强制类型转换FLEX强制类型转换
python的强制类型转换规则 Python的强制类型转换规则 Python是一种动态类型语言,这意味着变量的类型是在运行时确定的。在Python中,变量可以随时被赋予不同类型的值,这使得Python非常灵活和易于使用。但是,有时候...
C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换C#2.0 泛型和强制类型转换
java 强制类型转换示例 java 强制类型转换示例 java 强制类型转换示例
文档是关于如何在C#中进行强制类型转换,很好的文档
C++ 四种强制类型转换的总结
初学,有些概念比较模糊,做了一个小程序对二者的区别加以总结
C++ 中的强制类型转换,显示转换也成为强制类型转换(cast),包括以下列名字命名的强制类型转换操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。
最近项目中经常需要int与float之间转换,有必要对它们之间转换的原理做个了解。
C++强制类型转换的资料,详细介绍了C++特有的四种类型转换机制,供有需要的人下载!
C语言类型转换-自动类型转换、强制类型转换、指针类型转换。 一篇文章带你快速了解!
c++四种强制类型转换 学习C++的可以好好的看看
C++的cast强制类型转换,C++的类型转换方式使用教程