【问题标题】:Pass-By-Reference Function ParameterPass-By-Reference 函数参数
【发布时间】:2018-03-09 06:36:37
【问题描述】:

我正在查看我在教科书中阅读的一些代码来为自己测试运行,这里是:

#include <iostream>
#include <fstream>
using namespace std;

const double PI = 3.1415926535897932;

void area_of_circle(const double R, double& L, double& A);

int main() {
  const int N = 10;
  double R[N];
  double area, perimeter;
  int i;

  for (i = 0; i < N; i++) {
    cout << "Enter radius of circle: ";
    cin >> R[i];
    cout << "i= " << (i+1) << " R(i)= " << R[i] << "\n";
  }

  ofstream myfile ("AREA.txt");
  for (i = 0; i < N; i++){
      area_of_circle(R[i], perimeter, area);
      myfile << (i+1) << ") R= " << R[i] << " perimeter= "
      << perimeter << "\n";
      myfile << (i+1) << ") R= " << R[i] << " area= "
      << area << "\n";
    }

    myfile.close();
}

void area_of_circle(const double R, double& L, double& A) {
  L = 2.0*PI*R;
  A = PI*R*R;
}

我所做的与作者所做的不同之处在于没有引用我的 const double R 参数。他在 area_of_circle 函数中包含了 & 引用符号 (const double& R)。我运行代码尝试使用和不使用参考符号,我收到了相同的结果。

基本上我的问题是,如果作者都给出相同的答案,为什么还要包含它?我选择不包含它,因为我的理解是,如果 R 在整个函数计算过程中没有变化,为什么要包含它。

【问题讨论】:

  • 你是对的。而且你的教练给这个函数命名得很糟糕。
  • @liliscent 啊哈!那个也是!谢谢编辑:我的意思是作者,而不是讲师,哎呀!
  • 你真的没有参考就试过了吗?如果类型中没有 &,参数是“按值”传递的,并且仅在函数堆栈上进行修改,因此计算值在 area_of_circle 函数之外将不可用。在 C 中,只有两种方法可以从函数返回值: 1. 将其作为函数返回类型返回(在您的情况下这是不可能的,因为函数是 void)。 2. 通过引用传递参数。
  • @juanchopanza 为什么你说上面的版本不起作用,只要 R 没有被修改,这段代码似乎可以工作

标签: c++ reference pass-by-reference


【解决方案1】:

在您使用或不参考的示例中,R 参数对执行时间没有太大影响,因为参数很小(单双),但是如果你会通过整个表作为副本(非引用)可能会对程序的执行时间产生重大影响。

通过 const 引用传递不会导致内存复制。它只引用存储参数的内存。 const 用于避免修改引用传递的参数。如果您将简单参数(如 double)传递给函数,则不需要 const,因为您只能修改副本。

也检查一下这个:C++: Argument Passing "passed by reference"

【讨论】:

  • 请记住,对于小东西,通过复制传递比通过引用传递更快,尤其是在现代调用约定中(大多数参数通过寄存器传递)。这归结为这样一个事实,即通过引用传递有其成本 - 即间接成本和它对优化器构成的障碍。
  • @MatteoItalia 感谢您提供此信息! :)
  • @juanchopanza 我只说R参数,因为这是问题
  • @BartekPL 因此,如果您不想修改对象并避免复制它,我可以使用 ie const double R,就像我所做的那样,对吗?那么对于更大的数据,我为什么不继续使用 const 呢?因为它不复制内存,只引用/不修改?
  • @n0de 抱歉,我不明白你的问题:/ 看来你想知道是否仍然需要 const。请阅读这个问题和答案:stackoverflow.com/questions/117293/…
猜你喜欢
  • 2012-03-04
  • 2016-09-04
  • 1970-01-01
  • 2015-10-22
  • 2015-04-08
  • 2022-02-24
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多