大多数情况下,在Delphi中,强制转换是一个reinterpret_cast,即一种类型的位和字节被重新解释为好像它是另一种类型,例如整数(myEnum)或指针(MyDynamicArrayVar).
一些强制转换会切断位,即Integer(MyInt64)将切断Int64的前32位,而低32位的高位将成为新的符号位.一些演员阵容扩大,例如整数(myByte),虽然这种转换为更大的类型不需要强制转换.来自的转换,例如整数到浮点也不需要强制转换.
但有时它不是reinterpret_cast,并且强制执行转换(例如,如果字符串为空,则从字符串转换为PChar转换;从AnsiString转换为UTF8String将内容转换为UTF-8,UnicodeString(myAnsiChar)转换甚至两次,从AnsiChar到AnsiString再到UnicodeString,虽然这些步骤可能并非全部可见).并且一些演员表是不允许的(例如Int64(MyDouble)或某些尺寸不匹配的演员表).
请注意,对于运算符重载(主要用于记录),您也可以进行显式和隐式转换.显式转换采用强制转换的形式.隐式转换也可以通过“强制转换”来强制执行.
Delphi中的强制转换形式始终是typename(cast_object),它将cast_object强制转换为typename.
使用指针可以规避一些无效的强制转换.如果您执行以下 *** 作:
MyInt64 := PInt64(@MyDouble)^;
其中PInt64是指向Int64的指针,其他类型很明显,
那么你可以将一个Double转换为Int64.请注意,没有实际的指针杂耍.转换是直接的,就像你做的那样
MyInt64 := Int64(MyDouble); // InvalID typecast -- except in some versions
Delphi中没有额外的static_cast类型.我个人希望我们有像C这样的明确演员.德尔福更像是在C.
的dynamic_cast
如果涉及的类型是类或接口,则使用as和is关键字的等价物.例如:
myEdit := MyTObject as TEdit;myIntf := MyObj as ISomeInterface;
两个动态上调.与C不同,如果MyTObject不是TEdit的实例,或者如果myObj没有实现ISomeInterface,则会引发(抛出C)EInvalIDCast异常.它在其他方面等同于C:
TEdit *myEdit = dynamic_cast<TEdit *>(MyTObject);if (myEdit == NulL) throw ...
像C中的dynamic_cast一样,查询可以通过以下方式完成:
if MyObject is TEdit then TEdit(MyObject).Text := 'Hello,world!';
这或多或少等同于C中的这种“模式”:
TEdit *e = dynamic_cast<TEdit *>(MyObject);if (e != NulL) e->Text = "Hello,world!";总结
以上是内存溢出为你收集整理的c – Delphi中dynamic_cast的等价物是什么?全部内容,希望文章能够帮你解决c – Delphi中dynamic_cast的等价物是什么?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)