我能像C++ java那样在C++中进行类型化/升级吗?
我最近开始自己学习C++,我有一些java的知识。我想知道有没有一种在C++中实现类型化的选项。p>就像在爪哇一样 char ch=(char)(65);将在ch中存储“A” 或int n='a';将在n中存储97
< > C++有相同或相似的选项吗?
你可以在下面搜索框中键入要查询的问题!
就像在爪哇一样 char ch=(char)(65);将在ch中存储“A” 或int n='a';将在n中存储97
< > C++有相同或相似的选项吗?
# 1 楼答案
()
(避免它们),static_cast
,dynamic_cast
,reinterpret_cast
(非常小心),const_cast
(只有非常很少是正确的选择),std::dynamic_pointer_cast
,std::forward
(是的,这是一个类型转换),std::move
(是的,这也是一个类型转换)C++是不是EEM>java。不要期望您的Java知识能够传承下去。在许多情况下,这两种语言的结构在源代码级别上看起来是相同的,但做的事情非常或微妙地不同。它们也使用了很多常用术语,但一种语言中的术语含义在另一种语言中可能有所不同
还有隐式转换、转换构造函数和转换运算符
# 2 楼答案
对于C++的第一次转换,您将很好地使用^{} 进行显式转换:
当然也有隐式转换:
及特别促销规则
然后还有其他cast操作符:
# 3 楼答案
C++有几种不同的CAST运算符,用于访问内存对象,它们各自在操作方式上存在差异。为了理解C++中的铸造,你需要了解这些不同的铸造方法之间的区别,以及为什么你要使用一种或另一种铸造方法。p>
但是,首先必须了解java和C++之间在如何将变量和对象分配和存储在内存中的两个基本区别。p>
两种语言之间最根本的区别是两种语言的编译目标。Java被编译成字节码并在虚拟机上运行。通常,C++被编译成本机代码,并使用硬件设备(如CPU寄存器)在实际硬件上运行。p>
我使用C++的“最常见”的警告,因为有编译器,微软Visual Studio有这样的选项,它将生成在虚拟机上运行的字节代码。但是在大多数情况下,C++被编译成本地的硬件机器代码。p>
二者之间的第二个主要区别是对象、变量和类的存储和管理方式、赋值的工作方式以及运行时关于对象、变量和类的信息类型
Java有一个中央内存存储,其中对象是用
new
操作符分配的。这意味着Java变量不是包含对象的物理存储区域,而是包含指向中央内存存储中实际存储区域的引用的物理存储区域这个中央存储区域不仅包含用于实际对象的内存区域,还包含有关实例化对象的类的信息。换句话说,编译时源代码中可用的大部分类型信息也可用于运行程序的虚拟机,从而允许虚拟机在转换完成时确定转换在运行时是否有效
C++变量是存储变量或对象的值的存储区域。C++具有指针变量,该指针变量包含存储对象的存储区域的地址,并且具有包含存储对象的存储区域地址的引用变量。但是,当您访问对象或变量名时,访问的是C++对象或变量,则直接访问对象的内存区域,而不是通过java中引用的方式访问对象。p>
因此,Java中的赋值语句将一个对象赋值给另一个对象实际上只是复制引用,而不是实际对象。这就是为什么在完成一个赋值之后,你现在有两个变量指向同一个东西。C++中的一个赋值语句将一个对象分配给另一个对象,它将实际对象本身复制到另一个内存区域中,从而导致同一对象的两个副本。p> <> P> C++语言和编译器设计为在编译源代码时进行有效性检查,并消除检查java虚拟机所涉及的开销。因此,C++编译器在编译源代码时,会删除大部分的类信息。运行时类型标识选项可以使用,但是使用该方法涉及额外的开销(参见How expensive is RTTI?),并且由于C++在硬件上运行原生,所以没有虚拟机使用该信息来决定操作的有效性。p> 多年来C++提高了程序员编写源代码的能力,允许编译器捕获典型的错误类型。cast运算符中的更改和几种类型的cast运算符的添加是其中一种改进,以解决容易犯错误的领域,该错误可能导致问题,但难以调试
进一步有关C++类型的不同类型的详细信息请参见以下内容:
When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?
Regular cast vs. static_cast vs. dynamic_cast
dynamic_cast and static_cast in C++
Why use static_cast<int>(x) instead of (int)x?