C++ 为什么数组没有长度属性

c++ why array doesn't have length attribute

本文关键字:属性 为什么 数组 C++      更新时间:2023-10-16

假设我们有一个数组

int arr[3];

在 C++11 中我们可以做到

end(arr);

以获得 ARR 的边界。

sizeof(arr)/sizeof(arr[0])

可以获取数组的大小。

实际上我来自Java,并且刚接触C++,像arr.length一样拥有sth.很直观,但是为什么C++没有这个不错的功能呢?使用外部函数来获取数组的大小非常奇怪。(而且结束功能甚至在C++11之后添加,在此之前事情就更麻烦了(我想它有sth。要与数组后面的实现有关,必须有一些边界标记,就像字符串末尾的"\0"一样。那为什么不更进一步呢?喜欢长度?

C++语言数组没有内置的大小方法,因为它们是从 C 继承而来的,并且通常只提供 C 赋予它们的行为。C++17 提供了一个非成员std::size函数,可以计算数组(实际上是任何大小的容器(的大小。

使用外部函数来获取数组的大小非常奇怪。

并非 C++ 中的所有内容都是成员函数。最好现在就习惯。

我会补充另一个答案,虽然其他人是对的,但我认为他们错过了一个核心点。

int arr[3];形式的数组是C++ C 根的余数,尽管它们完全有效,但它们缺乏很多,其中之一是知道自己大小的能力。不鼓励在C++中使用它们(但仍然是可能的,否则大量旧代码将停止工作!如果你编写新代码,你永远不应该考虑使用它们。没有优点,而且有很多缺点。

使用简单数组C++方法是标准库模板std::array<int,3> arr;。这是一个安全的数组,它知道自己的大小,并且可以在访问时进行边界检查。你可以像旧式数组一样使用arr[i],它有一个.size()方法(以及许多其他方法(。

该标准库中还有许多其他集合类型,例如vector<>(在使用过程中可以增长和收缩(、地图、集合等。

已编辑:

我不了解Java,但与许多语言相比,C++已知具有非常接近硬件的能力。为此,您使用低级技术。

对于大多数程序员来说,没有必要使用低级技术。事实上,根本不推荐这样做。考虑一下:(char a[6]; int i( -> a[i] == i[a]。这还不够可怕吗?

我不能代表硬件。每个平台都是不同的。但是想象一下一张纸,然后在那里写下你的数组。然后再写一个。还有一个。现在一些对象,字符串,一些未识别的二进制数据。也许来自不同程序的一些数据。

很快你就不会看到数组的末端在哪里。 C 字符串是的。他们有\0。但是整数?不是\0 == 0吗?

幸运的是,我们有高级编程。许多编程语言只支持高级编程,以防止程序员出错。

因为要环绕低级内置数组,您应该使用具有成员数组和成员大小的类。要使其可重用,您应该使其成为模板。然后你添加了很多东西,比如下标和迭代器。这听起来像是很多工作,不是吗?但幸运的是,一些聪明的人已经做到了。它是C++11的一部分,它们被称为容器。并选择合适的容器?除非你有理由使用其他东西,否则你应该使用"向量"。

#include <vector>
std::vector<int> arr;

长话短说。不要使用内置数组。使用向量。

从 c++17 开始,我们鼓励您在数组上使用size

例如,给定您的int arr[3],您可以调用:size(arr)得到 3。

我说你很受鼓励,因为size可以用作数组,也可以使用size方法的容器。允许模板代码独立于数组或容器是否为操作类型而运行。

因此,在这种情况下,数组可以作为其中一个或两个参数传递,就像容器一样:

template <typename FROM, typename TO>
bool foo(const FROM& lhs, TO& rhs) {
if(size(lhs) > size(rhs)) {
return false;
}
copy(cbegin(lhs), cend(lhs), begin(rhs));
return true;
}

现场示例

在早期C++被称为兼容C而C没有这个特性

另一个原因是C++数组不是一个真正的对象,它在 OOP 中的意思(对象具有属性和方法/函数等(

为什么数组没有长度属性?这是一个悠久的历史,C诞生于1970年代,当时所有计算机的内存都非常昂贵和小巧。甚至struct关键字在C语言的早期发展中也没有加入。

此链接可能对您有所帮助。

https://www.bell-labs.com/usr/dmr/www/chist.html