【问题标题】:Reference - const pointer参考 - 常量指针
【发布时间】:2012-07-10 08:46:55
【问题描述】:

我在很多地方读过关于参考的文章:

引用就像一个常量指针

引用总是指向一个对象

一旦初始化,引用就不能被重新安置

我想明确最后一点。这是什么意思?

我试过这段代码:

#include <iostream>
int main()
{
    int x = 5;
    int y = 8;

    int &rx = x;
    std::cout<<rx<<"\n";

    rx = y;    //Changing the reference rx to become alias of y
    std::cout<<rx<<"\n";
}

输出

5  
8

那么“引用不能被重新定位”是什么意思呢?

【问题讨论】:

  • 不要认真对待Reference is like a const pointer 的断言。这是错误的。然后在main()std::cout&lt;&lt;x&lt;&lt;"\n"; 你会得到8
  • 引用就像一个常量指针。它 像一个指向常量的指针。详情见文章here
  • @AlexWilson 我不想让 cppcoder 误以为引用在某种程度上类似于常量指针。通常可以说“在访问被引用对象方面,引用表现类似于常量指针”。但它们在很多方面都是不同的实体。
  • @AlexWilson:一般来说,无论你熟人的编译器做什么或你认为它做什么,你的陈述(以及下面的答案)仍然是错误的。为什么您的假设错误的一个简单示例是临时对象生命周期延长。这永远不会发生在 const 指针上。如果引用衰减为指针,您的编译器将因此无法遵守标准提供的保证。
  • @Damon。现在这是一个很好的观点。我向所有人道歉。我会酌情更新。

标签: c++ reference


【解决方案1】:

这一行:

rx = y;

不使 rx 指向 y。它使 x 的值(通过引用)成为 y 的值。见:

#include <iostream>

int main()
{
    int x = 5;
    int y = 8;

    int &rx = x;
    std::cout << rx <<"\n";

    // Updating the variable referenced by rx (x) to equal y
    rx = y;    
    std::cout << rx <<"\n";
    std::cout << x << "\n";
    std::cout << y << "\n";
}

因此,在初始赋值后无法更改 rx 所引用的内容,但您可以更改所引用事物的值。

因此,就本示例而言,引用类似于常量指针(其中指针地址是常量,而不是该地址处的值)。但是有一些重要的区别,一个很好的例子(正如 Damon 指出的那样)是您可以将临时变量分配给本地 const 引用,编译器将延长它们的生命周期以在引用的生命周期内持续存在。

关于引用和 const 指针之间差异的更多详细信息可以在this SO post 的答案中找到。

【讨论】:

  • 所以,“References cannot be reseated”的说法,就是地址不变,但值可以变。
  • 是的。确实是这个意思。所以在this article(我在你的问题的评论中也提到过)它就像一个常量指针。
【解决方案2】:

您将 x 的值更改为 y 的值 :-)

【讨论】:

    【解决方案3】:

    int &amp;rx = x; 使 rx 成为 x 的别名。

    那么,rx = y 暗示 x = y

    创建别名后,对它的任何使用 (rx) 将等同于使用 x。您无法撤消此操作(重置rx)以使rx 成为说“y”的别名。

    【讨论】:

    • rxy 在第二次分配之后的别名?因为rx 的值与y 相同。
    • no: an alias of 表示指的是的存储位置,而不是具有相同的值跨度>
    • 这个答案完全正确。这就是引用,别名。
    猜你喜欢
    • 2011-01-21
    • 2011-03-27
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2020-10-23
    相关资源
    最近更新 更多