C ++有关引用运算符返回类型的基本概念

时间:2012-07-07 06:29:57

标签: c++ function reference operator-keyword

我需要清除一个基本概念。这段代码工作正常。有人可以解释一下,如果函数calDouble已经返回int的地址(引用),为什么我需要使用&进一步在main int * j =& calDouble(i);获取int的地址(引用)?感谢。

int& calDouble(int x)
{
    x = x*2;
    return x;

}

int main(int argc, char *argv[])
{
    int i = 99;
    int *j = &calDouble(i);

    system("PAUSE");
    return EXIT_SUCCESS;
}

2 个答案:

答案 0 :(得分:3)

int& calDouble(int x)不会返回地址,而是返回int的引用。

您需要获取引用的地址才能将其分配给指针。

但请注意,您的代码会调用未定义的行为。因为您通过值传递参数,所以在函数内部创建了它的副本。所以你通过引用返回一个局部变量,这是不合法的。

我认为你的困惑来自&。这可以通过两种方式使用:

  • 应用于变量&x,它的地址为
  • 在声明int& x中,它定义了引用

引用只是一个别名,变量的名称不同。

int x = 0;
int& y = x;

现在,xy引用相同的变量。

int* z = &x;

x的地址。

答案 1 :(得分:1)

int&是参考类型。 地址。

要了解&calDouble(i)的作用,请考虑我们是否将其分为两个语句:

int& x = calDouble(i);
... = &x;

calDouble()函数返回一个引用类型,然后前面的&地址 - 返回。所以类型现在是int*,这就是该行编译的原因。

但是,您的程序显示未定义的行为!一旦函数结束,x中的calDouble()就会消失。最初存在的值可能仍在内存中,这就是您的程序“正常工作”的原因。但这在生产代码中并不可靠,有一天,完美的工作测试程序可能会在部署的那一刻爆炸。

出于这种不同的原因,返回对局部变量的引用通常是个坏主意。 (你会看到类方法返回对成员数据的引用,只要对象仍然在范围内就可以了,因为这些变量仍然存在。)只需返回常规int并继续生活。如果您在返回大型对象时真的担心性能,优化编译器可以执行一些return value optimization