我正在学习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;
}
我想问一下“ const”,它扮演什么角色,如果不使用它会产生什么作用?
为什么在数组名称已经是指针的情况下必须使用&n
答案 0 :(得分:0)
您的问题不仅涉及“ std :: vector”,还涉及“ const”和“引用”。
'const'关键字意味着您只能调用该类的'const'方法,这意味着(假定使用的类正确实现),您不能在该方法中修改该类。
'&'表示您通过“引用”而不是“值”传递参数,如果您不熟悉该差异,则可能需要阅读以下内容: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
。这有助于编译器检测逻辑错误并有时进行优化。