分配后参考和变量之间是否存在实际差异?

时间:2016-03-10 19:26:37

标签: c++ variables pointers reference

我的理解是,引用基本上是一个指针,其值不会改变,并且总是被解引用。所以,如果我有代码

int& thisIsAReference = someVariable;

然后基本上是一个指针被创建到someVariable的位置,并且该指针永远不会指向另一个位置并且总是被解除引用。

但这似乎与变量相同。据我所知,变量是指特定的内存位置,不能指代不同的内存位置,而是隐含地指代某个位置的值而不是位置本身。

那么,除了声明的不同语法之外,thisIsAReferencesomeVariable之间是否存在差异?

5 个答案:

答案 0 :(得分:3)

是的,你是绝对正确的。在概念层面,您可以将引用视为同一变量的另一个名称(如Stroustrup在TC ++ PL中所述)。反之亦然:您可以将任何变量视为伪装的引用 - 名称实际上属于引用,该引用与同名的未命名存储区域相关联。

然而,这就是概念层面的情况。

在实践中可能会有很大不同。从实际的角度来看,一般情况下,引用在引擎盖下作为指针实现。这意味着通过引用访问需要隐式运行时取消引用该指针。这使得引用访问执行速度比“普通”直接变量访问慢。

然而,在许多情况下,编译器可能足够聪明,可以弄清楚引用绑定的内容并消除指针取消引用,将其替换为直接访问目标变量。在这种情况下,上述概念(“引用只是变量的另一个名称”)在实践中得到了充分的实现。

答案 1 :(得分:2)

有一种方法可以区分引用和非引用:当decltype应用于 name 时,它将产生声明该名称的类型:

usage: PROG [-h] [--foo FOO] [bar [bar ...]]

positional arguments:
  bar         BAR! FOO! Lorem Ipsum is simply dummy text of the printing and
              typesetting industry.

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO   Just Normal Bullet Point with Some Enter in there

                  1. Lorem Ipsum has been the industry's standard dummy text
                     ever since
                  2. the 1500s, when an u
                  3. Lorem Ipsum is simply dummy text of the printing and
                     typesetting industry

              Some other Bullet POint

                  - Ipsum is simply dummy text of the printing and typesetting
                    industry
                  - Ipsum is simply dummy text of the printing and typesetting
                    industry

              And No BulletPoint and no Enter
                  Ipsum is simply dummy text of the printing and typesetting
                  industry
                  Ipsum is simply dummy text of the printing and typesetting
                  industry
  

错误:汇总template<typename T> class foo; //Incomplete type to force compiler error int main() { int i; int& j = i; foo<decltype(i)> x; foo<decltype(j)> y; } 的类型不完整,无法定义   错误:聚合foo<int> x的类型不完整,无法定义

答案 2 :(得分:1)

  

那么,除了声明的不同语法之外,thisIsAReferencesomeVariable之间是否存在差异?

不考虑读取访问的已解析值或已解析的写入地址。

您实际上可以将thisIsAReference视为someVariable的别名。

  

然后基本上是一个指针被创建到someVariable的位置,并且该指针永远不会指向另一个位置并且总是被解除引用。

不,这是一个未指定的实现细节,但可以用作思维导图模型。

答案 3 :(得分:0)

之后

int& thisIsAReference = someVariable;

thisIsAReferencesomeVariable之间没有区别。引用是别名,即每当您编写someVariable时,您也可以写thisIsAReference。但是,引用并不像变量&#34;那样,因为

int thisIsNotAReference = someVariable;
thisIsNotAReference = 20; // someVariable still has the old value

带参考

int& thisIsAReference = someVariable;
thisIsAReference = 20;    // now someVariable == 20 

答案 4 :(得分:0)

你是对的,变量引用特定位置的值,指针将引用该位置的地址。引用与指针相反的一个独特之处在于,您永远不会有NULL值。必须在创建时初始化引用,并且一旦初始化,它就不能被更改。与变量相比,这是一个巨大的差异,因为我可以不断改变变量的值,这就是变量如此有用的原因。