繁体   English   中英

引用的内存分配

[英]Memory allocation for references

阅读pointersreferences之间的许多差异。

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

1 定义指针时分配内存。 但是,引用是名称别名,因此没有为它分配内存( Is it correct? )。

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

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

这里,p是参考。

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

     int i; int &r1=i; int &r2=r1; <-------------------2 

编译器将语句2解释为:
int&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 =&b +&c;
但是,如果在参数列表中使用指针,那么我们最终将添加地址而不是对象本身。

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

什么时候应该去指针和什么时候参考?

定义指针时分配内存。 但是,引用是名称别名,因此没有为其分配内存

什么是“分配内存?” 如果你的意思是堆分配,就像newmalloc或其他什么一样, 没有

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

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

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

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

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

引用自动被取消引用。

没有没有什么可以去参考。 引用仅是已存在对象的另一个名称。 就这样。

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

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

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

引用是已存在对象的另一个名称。 你不能得到一个名字的地址; 你只能得到一个对象的地址。

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

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

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

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

哦,作为奖励:

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

这已破了。 你正在返回一个const&你创建的临时。 你应该按价值归还它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM