【问题标题】:Why arrays in C++ didn't have member function size() until C++11? [closed]为什么 C++ 中的数组在 C++11 之前没有成员函数 size()? [关闭]
【发布时间】:2013-02-12 11:46:18
【问题描述】:

为什么 C++ 中的数组在 C++11 (std::array) 之前没有成员函数 size() ?这背后的原因是什么?诸如“如何获取数组的大小?”之类的问题相当频繁。

版本 由于普通数组是从 C 继承的,它没有这样的功能的原因是什么?因为我们可以检查数组中的数据类型。

【问题讨论】:

  • 原因是 std::array 直到 C++11 才成为 C++ 的一部分。 std::tr1::array 有一个 size() 成员函数。
  • 原始数组没有成员,它们不是类。数组是“原始”类型(ish)。在 C++11 中,唯一改变的是标准库中添加了一个新的 std::array 类,C++03 多年来一直有一个 tr1::array 类。
  • 数组和std::array's 是有区别的。您似乎将两者混为一谈,这令人困惑。 C++ 数组没有并且仍然没有size() 成员函数。 `std::array's(不是语言数组,而是库数组)可以。

标签: c++ arrays methods c++11


【解决方案1】:

因为它们来自 C,而 C 没有成员函数(数组甚至不是类类型)。

与 C 的兼容性至关重要,因为允许将现有的 C 代码库编译为 C++ 极大地提高了该语言的采用率。当您要设计新的语言功能时,在考虑兼容性的同时处理一些可行的东西在优先级列表中是很低的。

在 C++11 中,语言达到了所有这些美好的小东西都应运而生的地步。那么为什么不现在添加它呢?因为 C 数组仍然可以正常工作,要改变它需要大量的工作。引入一个新容器(而且是一个非常简单的容器)要容易得多,而这正是发生的事情。

【讨论】:

    【解决方案2】:

    C++ 中的数组(不是 std::array)与 C 中的数组没有什么不同。它们只是分配用于在内存中保存一些数据(相同类型)的连续内存区域。

    类型可以是原始数据类型,如 int、float、char 等,也可以是复杂数据类型,如结构或类。不管访问数组的元素只是转换为:

    base address + (sizeof(datatype) * index)
    

    相比之下,std::array 是一个重载 [] 运算符以进行数组访问的类,并且具有检索大小的特殊方法。它与 std::vector 非常相似。在内部,这些类可能使用数组来访问元素,但通过重载 [] 运算符巧妙地隐藏了这一点。

    【讨论】:

      【解决方案3】:

      原始数组不是对象,因此没有成员函数。 std::array 是一个封装数组的类,因此可以有成员函数和逻辑来获取数组的长度。

      如果你声明一个像这样的数组:

      int * myArray = new int[5];
      

      它将没有任何方法来获取它的长度。

      【讨论】:

        【解决方案4】:

        std::array 是一个模板类,与其他容器类一样。普通数组在 C++11 中仍然没有成员。

        由于普通数组是从C继承而来的,它没有这样的功能的原因是什么?

        可以使用sizeof 运算符找出普通数组中元素的数量:

        int a[10];
        std::cout << sizeof(a) / sizeof(*a);
        

        这将打印“10”。您可能会将数组与指针混淆。这里:

        int* a = new int[10];
        

        a 不是一个数组。这是一个指针。

        【讨论】:

        • 提问者似乎已经知道了这一切。他在问为什么会这样。
        • @GManNickG 这不是我理解问题的方式,因为 std::array 是 C++11 的新手。以前的标准中没有它,所以问它为什么没有 size() 成员没有意义。
        • 嗯?如果“它没有 size() 成员”中的“它”是指 std::array,我们正在阅读不同的问题。他在问为什么数组(普通数组,而不是 std::array's,他指出这是实现数组概念的新 C++11 方法)没有 size() 成员。
        • @GManNickG 所以你认为在 C++11 中他们确实有一个 size() 成员?他们仍然没有。 OP 写道:“为什么 C++ 中的数组在 C++11 之前没有成员函数 size()”。
        • sizeof(a)/sizeof(*a) 否则它不会在许多平台上打印 10。
        【解决方案5】:

        C 数组确实有一个已知的和可检索的大小——由sizeof 操作符访问。您似乎混淆了数组和指针。我们不再知道指针指向的内存块有多大,如果我告诉你我住在唐宁街 10 号,你就可以告诉我街上有多少房子。

        C 数组实际上只是指针的一种特殊情况。它们直接分配在堆栈上,虽然它们声明的原始数组变量是可见的,但编译器能够告诉我们数组的大小。但是,数组经常分解为指针。这可能是因为它被传递给另一个方法或存储在另一个变量中。发生这种情况时,由于编译器不能再 100% 确定指针指向一个数组(即在所有情况下),我们就无法知道指针所引用的数组的大小。

        【讨论】:

        • 好点,谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-05
        • 1970-01-01
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        相关资源
        最近更新 更多