C++编译器通过引用传递而没有我告诉它?

C++ Compiler passing by reference without me telling it to?

本文关键字:没有我 编译器 引用 C++      更新时间:2023-10-16

所以我在今年早些时候做了一个程序,教我们如何使用数组。就在最近,我被教导如何在C++中使用指针和结构。现在我有了这些知识和理解(或者我认为是这样(,我对我以前的程序是如何工作的感到困惑!

在我多说之前,这里是程序代码:

https://pastebin.com/AYyv2Bzt

特别注意我的askSales功能,因为它让我感到困惑

void askSales(int salesArray[], string namesArray[])
{
for (int counter = 0; counter <= NUM_OF_POS; counter++)
{
cout << "How many jars of " << namesArray[counter] << "sold? : ";
cin >> salesArray[counter];
while (salesArray[counter] < 0 )
{
cout << endl << "You cannot enter a negative number for sales. If no jars werensold please enter 0. Please answer prompt again."
<< endl << endl
<< "How many jars of " << namesArray[counter] << "sold? : ";
cin >> salesArray[counter];
}
}
}

以下是我感到困惑的地方:

当这些参数不是通过引用传递时,我的程序如何能够修改传递给 askSales 的数组的内容?

在你的函数声明和对它的调用中,你会得到数组到指针的衰减。

这意味着您的函数完全等效于以下内容:

void askSales(int* salesArray, string* namesArray)

这显然不会按值传递数组并创建数组的新副本,而是传递指向原始数组的指针。这给出了通过引用传递的效果(因为指针引用函数外部的原始数组(。

普通C++数组永远不会按值自行传递。它们衰减成指针。

在函数的声明/定义中,语法T id[](甚至带有数字,例如T id[4](只是T *id的语法糖。这是完全相同的事情。

将数组传递给函数时,它被隐式转换("衰减"(为指向其第一个元素的指针。


请注意,上述内容仅适用于纯数组。在现代C++中,您可以使用std::array<T, n>来声明类型为Tn对象的数组。由于std::array是一个类,它的行为类似于一个类,并且没有任何这样的衰减规则。这样的数组实际上是在通过 valaue 传递时复制的。