C++编译器通过引用传递而没有我告诉它?
C++ Compiler passing by reference without me telling it to?
所以我在今年早些时候做了一个程序,教我们如何使用数组。就在最近,我被教导如何在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>
来声明类型为T
的n
对象的数组。由于std::array
是一个类,它的行为类似于一个类,并且没有任何这样的衰减规则。这样的数组实际上是在通过 valaue 传递时复制的。
相关文章:
- 有没有办法让编译器在我放置字符串而不是 nlohmann::json 对象时抛出错误?
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- C++编译器通过引用传递而没有我告诉它?
- 编译器没有显示错误,但我没有得到任何输出.怎么了?
- 为什么在 Direct X 11 中没有我的程序输出?
- 当我将C++类拆分为标头和实现时,我得到了 20 个没有意义的编译器错误
- 乘以时输出错误.这是我编译器中的错误吗?C
- 我的 OpenGL QQuickItem 没有我想要的大小
- 为什么从 void 函数模板返回时没有收到编译器错误?
- 为什么Eclipse没有附带编译器
- 有没有我不会使用 std::make_shared 的情况?
- 我没有'我不理解Rcpp中的这种行为
- c++ 11变量缩小,没有GCC编译器警告
- unique_ptr没有在编译器资源管理器中生成删除指令
- 奇怪的数组东西(数组索引获取值没有我设置它)
- 为什么我没有得到编译器关于访问未初始化的成员变量的警告
- 生成没有预编译器的c++类
- linux上的Qt应用程序如何崩溃,堆栈中没有我的代码(只有Qt代码和std库)
- 如何在没有资源编译器的情况下将自定义窗口的资源添加到可执行文件中?
- 我怎么能画一个平铺图没有我的ram使用或cpu使用的方式上升