T.J*_*der 20
类型转换将变量引用的值(内存块)视为与声明变量的类型不同的类型.
类型转换实际上是在执行该值的转换.
在许多语言中,一些演员表(通常是数字演员表)会导致转换(这会因语言的不同而有所不同),但大多数只是"将此X视为Y".
与人类语言的大多数方面一样,遗憾的是,这些术语在不同的社区中使用的方式略有不同,主要是语言线.例如,请参阅James关于C++的评论 - "cast"这个词比上面的定义有更广泛的含义,更多的是在C或Java模型中.只是为了让事情变得有趣,Java语言规范实际上涉及各种类型的转换,包括转换转换.但以上是一个很好的经验法则.
但举一个简单的案例:
在Java中,在泛型之前,在处理地图时必须进行大量的类型转换:
Map m = new HashMap();
m.put("one", "uno");
// This would give a compiler error, because although we know
// we'll get a String back, all the compiler knows is that it's
// an Object
String italian = m.get("one");
// This works, we're telling the compiler "trust me, it's a String"
String italian = (String)m.get("one");
Run Code Online (Sandbox Code Playgroud)
幸运的是,添加仿制药解决了这个问题,因为以这种方式进行铸造往往是一个脆弱的过程,存在维护问题.
相反,如果您有一个数字字符串,您将转换:
String s = "1234";
Run Code Online (Sandbox Code Playgroud)
...并且需要知道这些数字以十进制表示的数字:
// Wrong (cast)
int n = (int)s;
// Right (conversion)
int n = Integer.parseInt(s, 10);
Run Code Online (Sandbox Code Playgroud)
Jör*_*tag 11
也许一个例子可以帮助:
33到一个字符串,你得到"!".33成一个字符串,你得到"33".[注意:这个例子对数字和字符串的编码和内存表示做出了各种不一定有效的假设,但我希望机制是清楚的.]
类型转换:
double value = 3; // implicit conversion to double value 3.0
int nValue = 3.14156; // implicit conversion to integer value 3
Run Code Online (Sandbox Code Playgroud)
Casting是程序员请求进行显式类型转换的请求.
int nValue = 10;
double dvalue = double(nValue); // explicit type casting
Run Code Online (Sandbox Code Playgroud)
这些术语通常可互换使用.
Java的
类型转换和类型转换在Java中是相同的,但如果有人说它们正在转换,它们通常指的是显式转换.
Java中的强制转换将在运行时完成,因此可能会失败(抛出异常).某些类型的无效强制转换可以在编译时捕获.当转换失败时,实例就位于object引用中,因此编译器无法确定要执行的转换,直到它实际运行代码.
C++
类型转换和类型转换在C++中是不同的.有五种类型的C++类型转换,它们都具有不同的行为:static_cast,dynamic_cast,reinterpret_cast,const_cast,和C风格的转换((int)someVariable).
一些C++强制转换执行类型转换(因此这个概念令人困惑),调用代码并可能进行运行时检查.其他C++强制转换只是伪造引用变量的类型更改 - 不会修改,移动或复制内存,因此可能无法正确转换生成的数据类型.这可以在运行时提供很快的速度,并且可以成为低级代码的强大工具,但对于高级代码往往会被避免.
请注意,c样式的强制转换语法(看起来与Java语法完全相同)是不必调用转换代码的强制转换之一.
C++中的类型转换通常是指调用复制构造函数或赋值运算符,它将数据复制到不同类/结构的新实例.如果类型定义了转换运算符,则转换语法可能看起来像是强制转换,或者只是直接赋值.这里的主要区别是调用代码来进行转换.
| 归档时间: |
|
| 查看次数: |
23025 次 |
| 最近记录: |