为什么 C++ 中的数组在 C++11 (std::array) 之前没有成员函数 size() ?这背后的原因是什么?诸如“如何获取数组的大小?”之类的问题 相当频繁。
版本 由于普通数组是从 C 继承而来的,它没有这样的功能的原因是什么?因为我们可以检查数组中的数据类型。
因为它们来自 C,而 C 没有成员函数(数组甚至不是类类型)。
与 C 的兼容性至关重要,因为允许现有的 C 代码库编译为 C++ 大大提高了该语言的采用率。当您需要设计新的语言功能时,在考虑兼容性的同时处理一些有用的东西在优先级列表中很低。
在 C++11 中,语言达到了所有这些美好的小东西都应运而生的地步。那么为什么不现在添加呢?因为 C 数组仍然可以正常工作,要改变它需要大量的工作。引入一个新容器(而且是一个非常简单的容器)要容易得多,而这正是发生的事情。
C++ 中的数组(不是 std::array)与 C 中的数组没有什么不同。它们只是分配用于在内存中保存一些数据(相同类型)的连续内存区域。
类型可以是原始数据类型,如 int、float、char 等,也可以是复杂数据类型,如结构或类。不管访问数组的元素是否都只是转换为:
base address + (sizeof(datatype) * index)
相比之下,std::array 是一个重载 [] 运算符以进行数组访问的类,并且具有检索大小的特殊方法。它与 std::vector 非常相似。在内部,这些类可能使用数组来访问元素,但通过重载 [] 运算符巧妙地隐藏了这一点。
std::array
是一个模板类,与其他容器类一样。普通数组在 C++11 中仍然没有成员。
由于普通数组是从 C 继承的,它没有这样的功能的原因是什么?
您可以使用运算符找出普通数组中的元素数量sizeof
:
int a[10];
std::cout << sizeof(a) / sizeof(*a);
这将打印“10”。您可能会将数组与指针混淆。这里:
int* a = new int[10];
a
不是数组。这是一个指针。
原始数组不是对象,因此没有成员函数。这std::array
是一个包装数组的类,因此可以具有成员函数和逻辑来获取数组的长度。
如果您声明一个数组,如:
int * myArray = new int[5];
它将没有任何方法来获得它的长度。
C 数组确实有一个已知的和可检索的大小——由sizeof
操作员访问。您似乎混淆了数组和指针。我们不再知道指针指向的内存块有多大,如果我告诉你我住在唐宁街 10 号,你可以告诉我街上有多少房子。
C 数组实际上只是指针的一种特殊情况。它们直接分配在堆栈上,虽然它们声明的原始数组变量是可见的,但编译器能够告诉我们数组的大小。但是,数组经常分解为指针。这可能是因为它被传递给另一个方法或存储在另一个变量中。发生这种情况时,因为编译器不能再 100% 确定指针指向一个数组(即在所有情况下),我们就无法知道指针所引用的数组的大小。