我正在尝试使用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的值。
我是否错过了某些东西或以不同的方式理解事物......?有什么帮助来理解这里发生的事情? 提前致谢。
答案 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;
在以前的版本中,y
是k
的引用。
在更高版本中,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;
}
基本上,您只能在初始化时设置参考目标。如果您之后分配给引用,那么这些将是对引用值的赋值。