c ++或java中的类型转换和类型转换有什么区别?
c ++或java中的类型转换和类型转换有什么区别?
类型转换将变量引用的值(内存块)视为与声明变量的类型不同的类型。
类型转换实际上是在执行该值的转换。
在许多语言中, 一些演员(通常是数字演员)确实会导致转换(这会因语言的不同而有所不同),但大多数只是“将此X视为Y”。
与人类语言的大多数方面一样,不幸的是,这些术语在不同的社区中使用的方式略有不同,主要是语言线。 例如,请参阅James关于C ++的评论 – “cast”这个词比上面的定义有更广泛的含义,更多的是在C或Java模型中。 只是为了让事情变得有趣,Java语言规范实际上会涉及各种类型的转换,包括转换转换 。 但以上是一个很好的经验法则。
但举一个简单的案例:
在Java中,在generics之前,在处理地图时必须进行大量的类型转换:
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");
幸运的是,添加仿制药解决了这个问题,因为以这种方式进行铸造往往是一个脆弱的过程,存在维护问题。
相反,如果您有一个数字字符串,您将转换 :
String s = "1234";
…并且需要知道这些数字以十进制表示的数字:
// Wrong (cast) int n = (int)s; // Right (conversion) int n = Integer.parseInt(s, 10);
类型转换只是用笔在变量上写“现在是一个int”,转换实际上是将内容转换为所需的类型,因此值保持有意义。
也许一个例子可以帮助:
- 如果你将
33
转换为字符串,你得到"!"
。 - 如果将
33
转换为字符串,则会得到"33"
。
[注意:这个例子对数字和字符串的编码和内存表示做出了各种不一定有效的假设,但我希望机制是清楚的。]
类型转换:
double value = 3; // implicit conversion to double value 3.0 int nValue = 3.14156; // implicit conversion to integer value 3
转换是程序员请求进行显式类型转换的请求。
int nValue = 10; double dvalue = double(nValue); // explicit type casting
这些术语通常可互换使用。
Java的
类型转换和类型转换在Java中是相同的,但如果有人说它们正在转换,它们通常指的是显式转换。
Java中的强制转换将在运行时完成,因此可能会失败(抛出exception)。 某些类型的无效强制转换可以在编译时捕获。 当转换失败时,实例被置于object
引用中,因此编译器无法确定要执行的转换,直到它实际运行代码。
C ++
类型转换和类型转换在C ++中是不同的。 C ++中有五种类型的强制转换,它们都有不同的行为: static_cast
, dynamic_cast
, reinterpret_cast
, const_cast
和c-style强制转换( (int)someVariable
)。
一些C ++强制转换执行类型转换(因此这个概念令人困惑),调用代码并可能进行运行时检查。 其他C ++强制转换只是伪造引用变量的类型更改 – 不会修改,移动或复制任何内存,因此可能无法正确转换生成的数据类型。 这可以在运行时提供很快的速度,并且可以成为低级代码的强大工具,但对于高级代码而言往往会被避免。
请注意,c样式的强制转换语法(看起来与Java语法完全相同)是不必调用转换代码的强制转换之一。
C ++中的类型转换通常是指调用复制构造函数或赋值运算符,它将数据复制到不同类/结构的新实例。 如果类型定义了转换运算符,则转换语法可能看起来像是强制转换,或者只是直接赋值。 这里的主要区别是调用代码进行转换。
根据维基百科的文章 :
“在C语言系列中,单词cast通常是指显式类型转换(与隐式转换相对),无论这是对位模式还是实际转换的重新解释。”
这是一个C ++示例:
double d = 42.0; int i = d; // Here you have an implicit conversion from double to int int j = static_cast(d); // Here you have a cast (explicit conversion).
这是一个Java示例(请注意,在Java中,与C ++不同,您不能隐式地从double转换为int):
int i = 42; double d = i; // Here you have an implicit conversion from int to double int j = (int)d; // Here you have a cast (explicit conversion).
从对象到基元 – >类型转换
String s = "1234"; int i = Integer.parseInt(s); int j = Integer.valueOf(s);
从基元到对象 – >类型转换
int i = 55; String s = String.valueOf(i); String t = Integer.toString(i);
从原始到原始(或从对象到对象) – >类型转换(缩小时显式,加宽时隐式)
//explicit double d = 3.14156; int i = (int)d; //implicit int i = 100; double d = i;
注意:在对象类型转换的情况下,我们不能使用子类引用来保存父对象