有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我能像C++ java那样在C++中进行类型化/升级吗?

我最近开始自己学习C++,我有一些java的知识。我想知道有没有一种在C++中实现类型化的选项。p>

就像在爪哇一样 char ch=(char)(65);将在ch中存储“A” 或int n='a';将在n中存储97

< > C++有相同或相似的选项吗?


共 (3) 个答案

  1. # 1 楼答案

    <> C++有强制转换。C风格的类型转换()(避免它们),static_castdynamic_castreinterpret_cast(非常小心),const_cast(只有非常很少是正确的选择),std::dynamic_pointer_caststd::forward(是的,这是一个类型转换),std::move(是的,这也是一个类型转换)

    C++是不是EEM>java。不要期望您的Java知识能够传承下去。在许多情况下,这两种语言的结构在源代码级别上看起来是相同的,但做的事情非常或微妙地不同。它们也使用了很多常用术语,但一种语言中的术语含义在另一种语言中可能有所不同

    还有隐式转换、转换构造函数和转换运算符

  2. # 2 楼答案

    对于C++的第一次转换,您将很好地使用^{}进行显式转换:

    int i = static_cast<int>('c');
    

    当然也有隐式转换:

    int i = 'c';
    char c = 32;
    

    及特别促销规则

    char a = 'a', b = 'b';
    auto result = a + b;    // result is int now
    

    然后还有其他cast操作符:

    • ^{}从基类型强制转换为派生类型
    • ^{}使您的代码失败-有时-您不知道为什么
    • ^{}从表达式中删除常量(但仅当表达式不是常量时)
  3. # 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?