将变量分配给函数内部的引用

Assignement of variable to reference inside a function.

本文关键字:内部 引用 函数 变量 分配      更新时间:2023-10-16

我正在试验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的值。

我是错过了什么,还是对事物有不同的理解?了解这里发生的事情有什么帮助吗?提前谢谢。

我认为您混淆了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时,我们将更改foo的局部变量y以引用k。这对i没有影响(我们没有修改y指向的值(,因此在退出foo后,i保持不变。如果您想在foo之后将i更改为等于k,我们必须将行更改为*y = k

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

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

与非常不同

float &y = something;
...
y = k;

在以前的版本中,y是对k的引用。

在后来的版本中,y仍然是某个事物的引用,而y = kk的值分配给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

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

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;
}

基本上,您只能在初始化时设置引用的目标。如果之后指定给引用,则这些将是对引用值的指定。