C++中的引用混淆 在C++程序设计语言中,它表示在初始化之后不能引用一个不同的对象。然而,当我写下面的代码时,它打印了20,这意味着引用引用了另一个对象 int a = 10; int b = 20; int& ref = a; ref = b; cout << ref << endl;

C++中的引用混淆 在C++程序设计语言中,它表示在初始化之后不能引用一个不同的对象。然而,当我写下面的代码时,它打印了20,这意味着引用引用了另一个对象 int a = 10; int b = 20; int& ref = a; ref = b; cout << ref << endl;,c++,C++,然而,当我写下面的代码时,它打印了10,a的值 int a; int b; int& ref = a; ref = b; a = 10; b = 20; cout << ref << endl; 为什么会发生这种情况?我应该如何理解C++引用? REF= B并不意味着RF现在应该引用B。 这意味着将b的值复制到ref引用的变量 所以这个代码: int& ref = a ref = b; a = 10; 相当于 a = b; a = 10; ref=b

然而,当我写下面的代码时,它打印了10,a的值

int a;
int b;
int& ref = a;
ref = b;
a = 10;
b = 20;
cout << ref << endl;
为什么会发生这种情况?我应该如何理解C++引用?

REF= B并不意味着RF现在应该引用B。 这意味着将b的值复制到ref引用的变量

所以这个代码:

int& ref = a
ref = b;
a = 10;
相当于

a = b;
a = 10;
ref=b并不意味着ref现在应该引用b。 这意味着将b的值复制到ref引用的变量

所以这个代码:

int& ref = a
ref = b;
a = 10;
相当于

a = b;
a = 10;
排队

int& ref = a;
您将ref设置为变量a的引用。然后在下一行中将此对象的值设置为b的值:

ref = b;
请注意,a现在的值为b,由于您尚未初始化它,因此该值将为零

接下来,将a的值设置为10

此时ref也将设置为10,因为它是对a的引用。然后将b的值设置为20。但这对ref没有什么区别,因为它是对a的引用,a仍然是10

所以,当你打印出ref时,你会得到一个-10的值。

int& ref = a;
您将ref设置为变量a的引用。然后在下一行中将此对象的值设置为b的值:

ref = b;
请注意,a现在的值为b,由于您尚未初始化它,因此该值将为零

接下来,将a的值设置为10

此时ref也将设置为10,因为它是对a的引用。然后将b的值设置为20。但这对ref没有什么区别,因为它是对a的引用,a仍然是10


因此,当您打印出ref时,您会得到a的值,即10。

引用只是别名。它没有单独的内存。所以当你写作时:

int a = 10; 
int b = 20;
int& ref = a; //ref has same address a a. Its just alias
ref = b; //value of b assigned to ref, ref still points to same address
cout << ref << endl;
它说ref是a的别名。和a地址一样

当您写入ref=b时,您将b的值分配给ref,然后再分配给a

因此,当您打印ref时,a和b都将打印相同的值,即20,但它们的地址不相同。a和b仍然使用不同的地址

在您的第二个示例中,ref是a的别名。然后给ref分配一个值b。ref的地址仍然是a。然后你改变了b的值。所以b得到一个新值,但ref仍然指向a的地址,而a的地址没有被修改

希望这能消除你的困惑


为了更好地理解,请尝试打印变量的地址和值。这样,您将更好地理解。

引用只是别名。它没有单独的内存。所以当你写作时:

int a = 10; 
int b = 20;
int& ref = a; //ref has same address a a. Its just alias
ref = b; //value of b assigned to ref, ref still points to same address
cout << ref << endl;
它说ref是a的别名。和a地址一样

当您写入ref=b时,您将b的值分配给ref,然后再分配给a

因此,当您打印ref时,a和b都将打印相同的值,即20,但它们的地址不相同。a和b仍然使用不同的地址

在您的第二个示例中,ref是a的别名。然后给ref分配一个值b。ref的地址仍然是a。然后你改变了b的值。所以b得到一个新值,但ref仍然指向a的地址,而a的地址没有被修改

希望这能消除你的困惑


为了更好地理解,请尝试打印变量的地址和值。这样,您会更好地理解。

我制作了一个小程序,试图说明引用和指针之间的区别。希望这将帮助您了解不能使引用不同对象的对象是如何工作的:

int main()
{
    int a = 10;
    int b = 20;

    int* p = &a;
    std::cout << a << ", " << b << ", " << *p << ". p points to a\n";

    *p = 11;
    std::cout << a << ", " << b << ", " << *p << ". Changing p changes a\n";

    a = 12;
    std::cout << a << ", " << b << ", " << *p << ". Changing a changes p\n";

    p = &b;
    std::cout << a << ", " << b << ", " << *p << ". p points to b\n";

    *p = 21;
    std::cout << a << ", " << b << ", " << *p << ". Changing p now changes b, but a is unchanged as p no longer points to it\n";

    b = 22;
    std::cout << a << ", " << b << ", " << *p << ". Changing b changes p\n";

    int& r = a;
    std::cout << a << ", " << b << ", " << r << ". r references a\n";

    r = 13;
    std::cout << a << ", " << b << ", " << r << ". Changing r changes a\n";

    a = 14;
    std::cout << a << ", " << b << ", " << r << ". Changing a changes r\n";

    r = b;
    std::cout << a << ", " << b << ", " << r << ". The value of r is set to the value of b, but r still references a and thus a changes too\n";

    b = 23;
    std::cout << a << ", " << b << ", " << r << ". Changing b does NOT change r\n";

    r = 24;
    std::cout << a << ", " << b << ", " << r << ". Changing r only changes a\n";
}

这里的要点是,使用指针可以执行p=&b并引用不同的对象。这在引用中是不可能的。

我制作了一个小程序,试图说明引用和指针之间的区别。希望这将帮助您了解不能使引用不同对象的对象是如何工作的:

int main()
{
    int a = 10;
    int b = 20;

    int* p = &a;
    std::cout << a << ", " << b << ", " << *p << ". p points to a\n";

    *p = 11;
    std::cout << a << ", " << b << ", " << *p << ". Changing p changes a\n";

    a = 12;
    std::cout << a << ", " << b << ", " << *p << ". Changing a changes p\n";

    p = &b;
    std::cout << a << ", " << b << ", " << *p << ". p points to b\n";

    *p = 21;
    std::cout << a << ", " << b << ", " << *p << ". Changing p now changes b, but a is unchanged as p no longer points to it\n";

    b = 22;
    std::cout << a << ", " << b << ", " << *p << ". Changing b changes p\n";

    int& r = a;
    std::cout << a << ", " << b << ", " << r << ". r references a\n";

    r = 13;
    std::cout << a << ", " << b << ", " << r << ". Changing r changes a\n";

    a = 14;
    std::cout << a << ", " << b << ", " << r << ". Changing a changes r\n";

    r = b;
    std::cout << a << ", " << b << ", " << r << ". The value of r is set to the value of b, but r still references a and thus a changes too\n";

    b = 23;
    std::cout << a << ", " << b << ", " << r << ". Changing b does NOT change r\n";

    r = 24;
    std::cout << a << ", " << b << ", " << r << ". Changing r only changes a\n";
}
这里的要点是,使用指针可以执行p=&b并引用不同的对象。这是不可能的。

尝试打印A在你的第一个案例结束时,我应该如何理解C++引用?不能修改参考点所在的位置。初始化引用类型与分配引用类型不同。在int&ref=a;之后;,ref与a的意思完全相同。第一个等于int a=10;int b=20;a=b;,第二个是int a;int b;a=b;a=10;b=20;。尝试打印一个在你的第一个案例结束时我应该如何理解C++参考?不能修改参考点所在的位置。初始化引用类型与分配引用类型不同。在int&ref=a;之后;,ref与a的意思完全相同。第一个等于int a=10;int b=20;a=b;,第二个是int a;int b;a=b;a=10;b=20;。因为你还没有初始化它,所以它将是零
别指望了。只有当a是函数的局部自动变量且cout为True时,它才可能为零。还取决于您使用的编译器。由于您尚未初始化它,因此它将为零。不要指望这一点。只有当a是函数的局部自动变量且cout为True时,它才可能为零。也取决于您使用的编译器。引用本身没有内存地址。它甚至可能根本不使用变量来实现。一旦引用绑定到某个对象,查询该引用的地址将返回它所引用对象的地址。就像给引用赋值一样,也会给引用的对象赋值。从引用中读取值将从引用的对象中读取。引用本身没有内存地址。它甚至可能根本不使用变量来实现。一旦引用绑定到某个对象,查询该引用的地址将返回它所引用对象的地址。就像给引用赋值一样,也会给引用的对象赋值。从引用中读取值将从它引用的对象中读取。