Dan*_*Dan 24 c++ arrays pass-by-reference
我最近发现了一些这样的代码:
typedef int TenInts[10];
void foo(TenInts &arr);
你能做些什么foo()是有用的,如果宣言是:
void foo(int *arr);    // or,
void foo(int arr[]);   // or,
void foo(int arr[10]); // ?
我发现了一个问题,询问如何传递对数组的引用.我猜我在问为什么.
此外,只有一个答案 "何时指向数组的指针有用?" 讨论了函数参数,所以我不认为这是一个重复的问题.
AnT*_*AnT 47
reference-to-array参数不允许数组类型衰减为指针类型.即确切的数组类型仍然保留在函数内部.(例如,您可以sizeof arr / sizeof *arr在参数上使用技巧并获取元素计数).编译器还将执行类型检查,以确保数组参数类型与数组参数类型完全相同,即如果参数声明为10个整数的数组,则参数必须是10的数组.整整而没有别的.
实际上,在数组大小在编译时修复的情况下,使用引用数组(或指向数组的指针)参数声明可以作为传递数组的主要首选方法.另一种变体(当允许数组类型衰减为指针类型时)保留用于需要传递运行时大小数组的情况.
例如,将编译时大小数组传递给函数的正确方法是
void foo(int (&arr)[10]); // reference to an array
要么
void foo(int (*arr)[10]); // pointer to an array
可以说是不正确的方法是使用"腐朽"的方法
void foo(int arr[]); // pointer to an element
// Bad practice!!!
"衰减"方法通常应保留用于运行时大小的数组,并且通常在单独的参数中伴随数组的实际大小
void foo(int arr[], unsigned n); // pointer to an element
// Passing a run-time sized array
换句话说,当涉及引用数组(或指向数组)传递时,实际上没有"为什么"的问题.默认情况下,如果在编译时修复了数组大小,则应该自然地使用此方法.当你使用数组传递的"衰减"方法时,应该真正出现"为什么"这个问题."decayed"方法只能用作传递运行时大小数组的专用技巧.
以上基本上是更通用原则的直接结果.当你有一个类型的"重"对象时T,你通常通过指针T *或引用传递它T &.数组也不例外.他们没有理由这样做.
请记住,尽管在实践中编写适用于运行时大小数组的函数通常是有意义的,尤其是涉及通用库级函数时.这些功能更加通用.这意味着通常在现实代码中使用"衰减"方法是有充分理由的.但是,这并不能成为代码的作者在编译时识别数组大小并使用引用时的情况的借口. - 相应的阵列方法.
您可以编写函数模板以在编译时找出数组的大小。
template<class E, size_t size>
size_t array_size(E(&)[size])
{
    return size;
}
int main()
{
    int test[] = {2, 3, 5, 7, 11, 13, 17, 19};
    std::cout << array_size(test) << std::endl; // prints 8
}
sizeof(test) / sizeof(test[0])我没有更多了;-)
| 归档时间: | 
 | 
| 查看次数: | 11506 次 | 
| 最近记录: |