我有一个关于将std :: array传递给函数的问题

时间:2019-06-02 05:04:48

标签: c++

我正在学习c ++,将std :: array放入函数中的语法使我感到困惑。

#include <iostream>
#include <array>

using namespace std;

void printArray(const std::array<int, 5> &n)
{
    std::cout << "length: " << n.size() << endl;

    for (int j = 0; j < n.size(); j++ )
    {
        cout << "n[" << j << "] = " << n[j] << endl;
    }

}

int main()
{

    array<int, 5> n = {1,2,3,4,5};

    printArray(n);

    return 0;
}
  1. 我想问一下“ const”,它扮演什么角色,如果不使用它会产生什么作用?

  2. 为什么在数组名称已经是指针的情况下必须使用&n

5 个答案:

答案 0 :(得分:0)

您的问题不仅涉及“ std :: vector”,还涉及“ const”和“引用”。

  1. 'const'关键字意味着您只能调用该类的'const'方法,这意味着(假定使用的类正确实现),您不能在该方法中修改该类。

  2. '&'表示您通过“引用”而不是“值”传递参数,如果您不熟悉该差异,则可能需要阅读以下内容:Value vs. Reference

答案 1 :(得分:0)

void printArray(const std::array<int, 5> &n)

这是为了使您可以将{em> reference 传递给std::array的一个不可更改的(无论如何不进行常量转换)。该引用比数组本身小很多,通常仅是一个指针,而const位确保该函数不会尝试更改基础对象。

通常用于确保不要在不必要的地方复制“大”的东西,例如向量,数组或字符串。

答案 2 :(得分:0)

在这种情况下,const意味着printArray不会修改传递给它的对象。

std::array不是C样式的数组(例如int a[10]),因此您没有传递指针,而是传递了对std::array对象的引用。

答案 3 :(得分:0)

根据参数,您可以对函数进行某些假设。

void printArrayA(std::array<int, 5> n)

如果我调用printArrayA,则将复制传递给我的数组,因此该函数无法更改传递给我的数组,但会产生复制数组的开销。

void printArrayB(std::array<int, 5> &n)

如果我调用printArrayB,则复制我传递给它的数组,该函数可以在数组或存储在数组中的元素上进行更改。

void printArrayC(const std::array<int, 5> &n)

如果我调用printArrayC,则将复制我传递给它的数组,并且由于它是const,因此该函数无法对该数组或在其元素上。 (从理论上讲,我可以抛弃const,但这不是应该做的事情,const应该指示调用者,对象不会被更改)

答案 4 :(得分:0)

正如其他人所提到的,std::array的名称不会衰减到指针。要转换为指针,您可以调用.data()

为什么要传递(const引用,为什么在许多情况下foo[]会衰变为foo* const

您(实际上)从不希望复制数组。这需要大量的时间和内存。您始终希望通过引用将它们传递给函数。最重要的是,大多数适用于数组的算法都应该适用于任何大小的数组。 (Brian Kernighan,K&R中的K,particularly considered it a flaw in Pascal that the size of an array is part of its type.)因此,在20世纪70年代,C的设计者制定了一条规则,即将数组传递给函数与将指针传递给其第一个元素相同。 / p>

C ++为了向后兼容而坚持使用它:许多程序员在C ++编译器中编译C代码。一个著名的陷阱是C ++中的trying to take the sizeof an array parameter。由于数组参数会衰减到指针,因此可以得到指针的大小。在C ++中,您可以选择传递type (&name)[size]来代替;即通过引用传递type[size]。这会将大小保留为类型的一部分。 (C在1999年还获得了一些新的语法,这些语法从未应用到C ++中,包括能够传递数组参数的大小。)

在C ++中,std::array没有特殊的语法,并且像其他任何类型一样工作。您永远都不想复制不会修改的整个阵列。您仍然希望通过引用传递数组,因此您可以使用标准语法:&。每当不需要修改参数时,就声明为const。这有助于编译器检测逻辑错误并有时进行优化。