关于将数组传递给函数的最佳实践,我有一个广泛的问题。
所以在过去,当我使用C进行编程时,我希望一个函数将其输入作为数组,我会声明函数的输入参数为指针。这工作得比较好。
但是,我已经开始使用C ++进行更多编程,并试图确定将数组传递给函数的最佳实践。因此,我注意到在C ++中流行通过引用传递对象,从而避免了昂贵的复制操作。但是,当我在Google中将数组传递给函数时,我读了一些语句,说数组是通过引用自动传递的...。那么这有什么用呢?为什么数组通过引用自动传递?假设我不希望函数修改数组,是否可以传递const数组?
我很难编译我的测试程序。因此,我很好奇是否有人可以解释将数组传递给C ++中的函数的含义以及它与C有何不同。
谢谢!
在C和C ++中,声明一个函数采用数组参数,例如下面的示例,实际上使该函数采用指针。例如:
void foo(int arr[]);
此功能签名与:
void foo(int *arr);
因此,当您尝试使用C或C ++传递数组时,已经避免了复制数组的任何开销。
为什么数组通过引用自动传递?
它们仅在宽松的意义上通过引用传递。它们实际上没有作为C ++参考传递,如下所示:
void foo(int (&arr)[10]); // arr is a reference to an array of 10 ints
C行为的原因是因为他们认为按值传递数组永远不会使用,因为它的复制成本很高。C ++具有相同行为的原因仅仅是为了兼容性。
经验表明,数组参数的特殊行为不是一个好主意,因此这是应避免在C ++中使用原始数组的众多原因之一。问题在于,以任何一种方式传递数组都是危险的:
void foo(int arr[10]) { arr[9] = 0; }
void bar() {
int data[] = {1, 2};
foo(data);
}
上面的代码是错误的,但是编译器认为一切都很好,并且不发出有关缓冲区溢出的警告。
而是使用std::array
或std::vector
,它们具有一致的值语义,并且没有任何会产生上述错误的“特殊”行为。
假设我不希望函数修改数组,是否可以传递const数组?
你可以:
void foo(int const arr[]);
void foo(int const *arr);
void foo(int const (&arr)[10]);
因此,我很好奇是否有人可以解释将数组传递给C ++中的函数的含义以及它与C有何不同。
如果您使用在C语言中有效的语法,那么它实际上并没有什么不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句