通过引用传递并使用引用运算符

时间:2016-02-25 01:00:22

标签: c++ parameters reference

在我的第一个c ++编程类中,我们没有学习传递变量作为参考时参考运算符正在做什么,我们刚刚了解到在形式参数列表中使用引用运算符意味着变量直接改变了相应的变量在主要。但现在,我正在努力了解到底发生了什么,现在我正在进入我大学的第二个编程班。请考虑以下代码:

#include <iostream>
using namespace std;

void Reference(int & Cool, int Neato);

int main()
{
    int Awesome=10;
    int *P = & Awesome;
    int Neat=20;

    Reference(Awesome, Neat);

    cout << *P << endl;
}

void Reference(int & Cool, int Neato)
{
    ++Cool;
}

第一次使用引用运算符时,我给指针* P变量Awesome的地址。这对我来说很有意义。我得到P的值,值是Awesome的地址。之后,我通过引用将Awesome传递给函数,我理解发生了什么,但编译器如何读取它?

我使用变量Neat作为我要求的一个例子。 Neat正在通过值传递,所以我假设编译看起来像:

Neato = Neat;

但是如何通过编译器读取引用传递Awesome?遵循与上述相同的逻辑,我假设:

& Cool = Awesome;

但从语法和逻辑来看,这根本没有意义。特别是与第一个例子(完全有道理)相比时:

int *Pointer = & Awesome;

所以,我只是想弄明白到底发生了什么。我知道通过引用传递的变量在相应的函数变量发生变化时会直接更改,但后台会发生什么?

3 个答案:

答案 0 :(得分:3)

相同的符号&和号用作地址运算符(在运行时产生指针)和引用类型构建器(屈服)编译时的引用类型。)

在函数声明中,它是一个引用类型构建器。

而不是

void foo(int & Cool, int Neato);

你可以做到

template< class Some_type >
using Ref_ = Some_type&;

void foo( Ref_<int> Cool, int Neato );

在代码中使用&

int *P = & Awesome;
然而,

是地址运算符的含义。此处*&同时具有运算符和类型构建器含义,与其类型构建器含义一起使用。你可以把它写成

template< class Some_type >
using Ptr_ = Some_type_*;

// and later somewhere:
Ptr_<int> P = &Awesome;

顺便说一下,格式化该行的方式非常C-ish,重点在于应用于变量的运算符。这可以是理解符号的一种方式,声明反映了相同的符号如何用作运算符。但在C ++中,重点更多的是类型和严格的输入。

使用类型构建器别名Ref_Ptr_,您不再需要这样的助记符,并且可以从左到右直接读取声明。

答案 1 :(得分:3)

首先,让我们先解决一些基本规则。与您的问题没有直接关系,但需要建立这些基本规则。

&#39;&amp;&#39;运算符重载,在两个不同的内容中表示两个不同的东西。

int foo=0;

int *bar=&foo;

在这里,&#39;&amp;&#39;是一个地址运算符。它意味着获取某个其他对象的地址,这将成为指向该对象的指针。

void foo(int &bar);

在这里,&#39;&amp;&#39;声明一个引用。在这里,&#39;&amp;&#39;是指参考声明。这是一个细微差别的概念,但差异很重要。

现在,尽管如此,回答你的问题:

引用实际上是一个隐藏指针&#34;,以某种方式说话。要创建引用,编译器会生成与实现地址运算符时相同的代码,而内部引用只是一个指针。

void foo(int &);

// ...

int bar=0;

foo(bar);

这可以被认为类似于:

void foo(int *);

// ...

int bar=0;

foo(&bar);

这在逻辑上是等价的。

现在,对于答案的第二部分。无论何时使用引用,它都是取消引用运算符,&#39; *&#39; operator,应用于引用实际为的内部指针:

int foo(int &bar)
{
    int foobar=bar;

这类似于:

int foo(int *bar)
{
    int foobar=*bar;

总结:

A)创建新引用时,就像在引用的对象上使用地址运算符一样。

B)当使用现有引用时,它就好像在引用对象的实际指针上使用了解除引用操作符i。

这可以帮助您了解传递引用时会发生什么。

答案 2 :(得分:1)

相同的符号用于不同的目的。

&与正在声明的类型结合使用时,它会声明一个名为引用类型的复合类型

int& i = j; // i is a reference-type to int

&结合使用时,它将获取其地址并称为地址 - 运算符

int* p = &i; // take the address of i and store it in p (a pointer)

指针也是如此。

*与正在声明的类型结合使用时,它声明复合类型,称为指针类型

int* i = nullptr; // i is a pointer-type to int

*结合使用时,它会解除引用(查找)其地址,并称为解除引用运算符

int i = *p; // dereference (look up) the address in p (a pointer) and find its value

这两个符号在算术表达式中也有其他用途:

// Between two values acts as multiplication operator
a * b; // multiply a and b

// Between two values acts as logical AND operator
a & b; // bitwise combine a AND b