4 回答
TA贡献2011条经验 获得超2个赞
“为什么我们不能声明未指定大小的数组”——因为 C++ 语言标准说你不能。“像 Java”——因为 C++ 不是 Java。不同的语言有不同的设计目标/标准以及不同的历史。如果您想要 C++ 中的动态数组,可以使用的工具是std::vector
. 数组在 C++ 中始终是静态大小的(甚至更好std::array
)。它需要知道预先分配多少空间(发生在编译时,而不是运行时)。这对性能很重要,因为您知道它以后不会进行动态重新分配。在某些情况下,它还可以让您了解对象的确切内存布局和大小,这可能很重要。
您真的无法像您尝试的那样比较语言。每个都必须自己学习。你不能真的把东西从一个转移到另一个——即使它看起来很相似。
TA贡献1712条经验 获得超3个赞
在 C++ 中,我们必须在声明数组时指定数组的大小。这是 C++ 创建者的设计选择,可追溯到其 C 起源。
另一方面,在 Java 中,我们只用 声明对数组对象的引用int arr[]
。然后我们为数组分配内存,比如arr = new int[10]
指定它的大小。
在 Java 中,数组是对象,就像 String 或 ArrayList 一样。但在 C++ 中情况并非如此。
TA贡献1934条经验 获得超2个赞
Java 和 C++ 在这方面实际上非常相似,只是语法略有不同。
爪哇:
// declare a reference to an array of integers
int[] arr;
// allocate an array of 10 integers on the heap and store a reference in arr
arr = new int[ 10 ];
C++:
// declare a pointer to an integer, set it to null to be safe
int* arr = nullptr;
// allocate an array of 10 integers on the heap and store a pointer to it in arr
arr = new int[ 10 ];
Java 通过在您使用完数组一段时间后对其进行垃圾回收,从而使事情变得更容易一些。你几乎可以在 C++ 中使用std::unique_ptr<int[]>or得到它std::shared_ptr<int[]>。或者std::vector<int>通常是更好的选择。
您可能感到困惑的地方是 C++ 在堆栈上分配数组的能力。这些数组必须是在编译时声明的固定大小。Java没有这个特性,只有原始类型和引用分配在栈上。
您还可以将这些固定大小的数组声明为对象成员,然后将其存储为对象的一部分。同样,Java 没有此功能,对象只能包含对数组的引用。
TA贡献1847条经验 获得超7个赞
简而言之,它需要知道要分配多少内存。
std::vector 会在幕后为您重新分配内存,如果您要实现自己的 std::vector,您可以先声明一个特定大小的数组,并在需要调整任何内存时使用。
添加回答
举报