在函数内部引用变量的引用。

时间:2015-07-10 08:13:41

标签: c++ memory reference arguments return-value

我正在尝试使用C ++引用,并遇到以下情况: 请考虑以下代码

void foo(float &y)
{
    float k = 0.0;
    k += 20.1;
    y = k;
    cout << "y = " << y << endl;
} 



int main() {

    float  i;
    foo(i);
    i+=10.00;
    cout<<"value of I after returning is :: "<<i<<endl;

    return 0;
}

程序编译并运行。输出是:

y = 20.1
value of i after returning is :: 30.1

现在发生这种情况我的困境是......在函数“foo”中我们将y(它是对i的引用)指定为k。 k的范围仅限于该功能。因此,一旦函数返回,k应该被销毁,而i的值应该是一些未定义的值。 但与我的期望相反,我在函数后面有k的值。

我是否错过了某些东西或以不同的方式理解事物......?有什么帮助来理解这里发生的事情? 提前致谢。

3 个答案:

答案 0 :(得分:2)

我认为你将C ++引用与指针混淆。他们是不同的东西!一旦引用设置为引用某个对象,就永远不能将其更改为引用另一个对象。并且对引用执行的任何操作实际上都是对引用对象的值进行的。在这种情况下,赋值y = k实际上将y引用的对象的值设置为k。

为了使事情更具体一点,我将使用评论描述正在发生的事情来注释你给出的例子:

void foo(float &y)
{
    float k = 0.0;
    k += 20.1;
    y = k;  /* The value of the object referred to by y (i, in this program)
               is set to k (20.1f) */
    cout << "y = " << y << endl; /* When we write y in this way, we are 
               really referring to the value of the object referred to by y. 
               This is why it prints 20.1 instead of some memory address. */
} 

int main() {
    float  i;
    foo(i);   /* i is passed as a reference to foo */
    i+=10.00; /* The value of i was modified in foo. */
    cout<<"value of I after returning is :: "<<i<<endl;

    return 0;
}

相比之下,这里是使用指针而不是引用的类似代码(错误 - 它指定指针y,而不是更改y指向的值):

void foo(float *y)
{
    float k = 0.0;
    k += 20.1;
    y = &k;
    cout << "y = " << *y << endl;
} 

int main() {
    float  i = 0;
    foo(&i);   /* i is passed as a reference to foo */
    i+=10.00; /* The value of i was modified in foo. */
    cout<<"value of I after returning is :: "<<i<<endl;

    return 0;
}

在这种情况下会发生什么?好吧,我们打印出y = 20.1,返回后i的值是10.00。在这个例子中,当我们分配y = &k时,我们正在改变变量y,它是foo的本地变量,以引用k。这对i没有影响(我们没有修改y指向的值),所以在退出foo后我没有变化。如果你想在foo之后将i更改为等于k,我们必须将该行更改为*y = k

希望清除C ++引用和指针之间的一些差异!有很多很好的教程可以很好地解释这个主题。

答案 1 :(得分:1)

float &y = k;  // Or float &y argument of a function initialized with i

非常不同
float &y = something;
...
y = k;

在以前的版本中,yk的引用。

在更高版本中,y仍然是某些内容的引用,而y = k会将k的值分配给y别名或something

始终记住无法重新分配参考。

例如:

int x = 10;
int &y = x;
int z = 20;

y = z;  // x= 20, y(x) = 20, z = 20
x = 15; // x= 15, y(x) = 15, z = 20
y= 25;  // x= 25, y(x) = 25, z = 20
z= 30;  // x= 25, y(x) = 25, z = 30
// Also note that &x and &y (addresses) are same. But &z would be different

答案 2 :(得分:0)

引用是指针的语法糖。您的代码等同于以下内容:

void foo(float * const y)
{
    float k = 0.0;
    k += 20.1;
    *y = k;
    cout << "y = " << *y << endl;
} 
int main() {
    float  i;
    foo(&i);
    i+=10.00;
    cout<<"value of I after returning is :: "<<i<<endl;
    return 0;
}

基本上,您只能在初始化时设置参考目标。如果您之后分配给引用,那么这些将是对引用值的赋值。