引用的内存分配

时间:2012-07-26 01:55:03

标签: c++

阅读pointers&之间的许多差异references

以下是我学到的内容的简要说明。

1 即可。定义指针时分配内存。然而,参考是名称别名&因此没有为它分配内存(Is it correct?)。

2 即可。必须在定义时初始化引用,因为引用是使用常量指针和放大器实现的。因此不能指向另一个对象。 然而,在定义时并不需要初始化指针。因此也可以改为指向其他一些对象。

第3 即可。引用自动被取消引用。当你写cout << p; 它由编译器自动解除引用。视为cout << *p;由编译器。

这里,p是参考。

  1. 无法引用引用。无论何时,您声明对引用的引用,它实际上是对同一变量的引用。 e.g。

    int i;    
    int &r1=i;    
    int &r2=r1; <-------------------2
    
  2. 编译器将语句2解释为:
               int&amp; r2 =(* r1)
    和(* r1)只不过是我自己的变量。

    然而,可以指向指针。

    5 即可。指针数组是可能的,而引用数组是不可能的(为什么?)。

    6 即可。指针的地址是可能的。无法提供参考地址。它给出了变量的地址。

    7 即可。在某些情况下,您必须使用引用。您不能在那里使用指针。 请考虑以下示例:

    A a = b + c;

    其中a,b,c是A类的对象。 运算符'+'按如下方式重载:

    const A& operator+(const A& o)
    {
         return A(i+o.i);
    }
    

    请参阅此处的示例代码:http://ideone.com/Q0pE1

    这里参数列表中的引用用于保存内存占用 您不能在参数列表中使用指针,因为您必须在运算符函数中传递对象的地址      A =&amp; b +&amp; c;
    但是,如果在参数列表中使用指针,那么我们最终将添加地址而不是对象本身。

    我想知道我还缺少其他任何一点吗?

    什么时候应该去指针&amp;什么时候参考?

1 个答案:

答案 0 :(得分:8)

  

定义指针时分配内存。然而,参考是名称别名&amp;因此没有为它分配内存

“分配内存是什么意思?”如果您的意思是堆分配,就像使用newmalloc或其他任何内容一样,

int val = 5;
int *pVal = &val; //No dynamic memory allocation.

指针具有大小,与int具有大小的方式相同。但这与“分配”不同。

  

必须在定义时初始化引用,因为引用是使用常量指针&amp;因此不能指向另一个对象。

不,引用在初始化时被绑定,因为是引用的工作方式。它们是对象的引用。该语言指出,他们不可能不被束缚,他们的约束力不可能在以后改变。因此,初始化时必须绑定引用。

编译器如何实现引用完全无关紧要。

  

引用会自动被取消引用。

没有。 nothing 无法取消引用。引用仅是已存在对象的另一个名称。就是这样。

  

指针数组是可能的,而引用数组是不可能的(为什么?)。

因为初始化时必须绑定引用。并且不可能为数组的每个成员分配一个单独的对象。因此,在创建数组和引用的绑定之间需要一些步骤。这是不允许的。

  

指针的地址是可能的。无法提供参考地址。它给出了变量的地址。

引用是已存在对象的另一个名称。您无法获取名称的地址;你只能得到一个物体的地址。

  

在某些情况下,您必然会使用引用。

没有什么可以阻止你超载operator+指向类型的指针:

A operator+(const A *lhs, const A *rhs) {...}

当然,这是一个非会员功能。

哦,作为奖励:

const A& operator+(const A& o)
{
     return A(i+o.i);
}

这已经破了。您将const&返回到您创建的临时位置。你应该按价值归还。