从函数返回多个参数

时间:2011-09-14 13:53:33

标签: c++

我知道这里存在类似的问题,但我在这些日子里看到了这个算法,并对它的实现方式感到惊讶。考虑以下功能

int divide(int numerator, int denominator, int &remainder) {
  remainder = numerator % denominator;
return numerator / denominator;
}

它是通过引用而不是值本身实现的功能 这是最终代码

int main() {
  int num = 14;
  int den = 4;
  int rem;
  int result = divide(num, den, rem);
  cout << result << "*" << den << "+" << rem << "=" << num << endl;

} 结果将以评论表格

撰写
// 3*4+2=12

我的问题是,当函数从除法函数范围返回一个值时,它如何确定第二个或提醒术语?请帮帮我。这是来自麻省理工学院官方网站的令牌。非常感谢

6 个答案:

答案 0 :(得分:2)

正如您所说,rem变量通过引用传递

答案 1 :(得分:2)

该函数的第三个参数是引用,这意味着它是传入的参数的别名。

当调用者传递名为rem的变量(左值)时,该函数将使用自己的参数remainder对该变量进行别名。对remainder的所有更改实际上都是rem的更改。所以从某种意义上说,函数会从调用者的范围中填充变量。

答案 2 :(得分:2)

变量rem内的值将是函数完成后的余数值。这是因为divide()函数接受remainder参数作为引用类型,这意味着当在divide()函数体内访问引用变量时,它实际上是访问原始变量记忆中的位置。因此,当您在函数体中设置引用变量remainder的值时,它会影响rem变量的原始内存地址的值,并且从divide()返回后函数,即使在函数返回后,对原始rem变量的更改仍然存在,因为该地址的值已更改。

因此,通过引用传递参数,您可以更改函数范围之外的多个值,从而有效地执行与返回多个变量相同的操作。

这是因为引用基本上是隐式指针...所以当您访问或更改引用变量的值时,它正在更改或访问引用绑定到的原始内存地址处的值。作为指针的引用的“隐式”特性是引用在创建时“绑定”到内存地址,因此不能为NULL,并且编译器会自动解除引用,因此省略了对手册的需要解除正常指针的引用。因此,你永远不可能创建一个“裸”的引用,如:

int& int_reference;

这会引发编译器错误。相反,引用总是必须“绑定”到实际的内存地址(即内存中的实际变量),如下所示:

int actual_variable;
int& int_reference = actual_variable;

现在int_reference已“绑定”到actual_variable,每当您更改int_reference的值时,您正在更改actual_variable所代表的内存位置的值。所以,如果你做了

int_reference = 5;

然后actual_variable的值也会为5.

将值传递给具有该数据类型作为引用的函数时,也会发生引用的“绑定”操作。例如:

void func(int& a)
{
    a = 5;
}

int main()
{
    int b = 2;
    func(b);

    std::cout << b; //a value of "5" will be printed

    return 0;
}

函数func()将更改b所代表的内存地址的值,因为我们在调用b时引用了func()。将b作为对func()的引用传递的行为称为“传递引用”。因此,您可以通过传入多个变量作为对函数的引用,有效地将多个值“返回”回调用函数。调用函数的副作用将改变您通过引用传入的值,这类似于您是否可以实际从函数本身返回多个值(但效率更高)。

答案 3 :(得分:1)

传递给函数的余数是一个非const引用,因此可以在函数内部更改该值,并且当函数返回时它将在函数外部可见。

答案 4 :(得分:1)

如果您想从函数中返回多个值,可以使用Boost Tuple Library进行此操作。

答案 5 :(得分:1)

我不喜欢输出参数。所以这是一个迭代返回所有值的解决方案 您可以使用boost :: tie并从函数中返回对(或tupples)。

#include <iostream>
#include <utility>
#include "boost/tuple/tuple.hpp"

std::pair<int,int> divide(int numerator, int denominator)
{
      int remainder = numerator % denominator;
      int result    = numerator / denominator;

      return make_pair(remainder, result);
}

int main() 
{
    int res;
    int rem;

    boost::tie(rem,res) = divide(10,3);
    std::cout << rem << ": " << res << "\n"; 
}