C++ 引用的内存分配

C++ 引用的内存分配,c++,C++,阅读指针和参考之间的许多差异 以下是我所学知识的简要描述 1。定义指针时会分配内存。然而,引用是一个名称别名&因此没有为其分配内存(是否正确?) 2。引用必须在定义时初始化,因为引用是用常量指针实现的&因此不能指向其他对象。 然而,指针不需要在定义时初始化&因此也可以更改为指向其他对象 3。引用将自动取消引用。当你写cout时 定义指针时会分配内存。然而,引用是一个名称别名&因此没有为它分配内存 “内存已分配”是什么意思?如果您指的是堆分配,如new或malloc或其他,则否: 指针有大小,就像

阅读
指针
参考
之间的许多差异

以下是我所学知识的简要描述


1。定义指针时会分配内存。然而,引用是一个名称别名&因此没有为其分配内存(
是否正确?

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

3。引用将自动取消引用。当你写
cout时

定义指针时会分配内存。然而,引用是一个名称别名&因此没有为它分配内存

“内存已分配”是什么意思?如果您指的是堆分配,如
new
malloc
或其他,则否:

指针有大小,就像
int
有大小一样。但这与“分配”不同

引用必须在定义时初始化,因为引用是用常量指针实现的&因此不能指向其他对象

不,引用是在初始化时绑定的,因为引用就是这样工作的。它们是对对象的引用。该语言指出,它们不可能不受约束,它们的约束也不可能在以后改变。因此,有必要在初始化引用时对其进行绑定

编译器如何实现引用是完全无关的

引用将自动取消引用

没有。没有要取消引用的内容。引用只是已经存在的对象的另一个名称。就这些

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

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


指针的地址是可能的。参考地址是不可能的。它给出了变量的地址

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

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

对于指向以下类型的指针,没有任何东西可以阻止您重载
运算符+

A operator+(const A *lhs, const A *rhs) {...}
当然,这是一个非成员函数

哦,作为奖励:

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

这个坏了。您正在将一个
常量&
返回给您创建的临时变量。您应该按值返回它。

“然而,引用是一个名称别名,因此没有分配内存”-“引用是用常量指针实现的”-请参见矛盾?;)这些观点有太多的错误,任何答案基本上都会再次解释什么是指针和引用;他们一起工作。在某些情况下,您可能只能使用一个或另一个,但通常情况下,您可以手拉手使用它们。“指针地址是可能的。引用地址是不可能的。它给出了变量的地址。”在这两种情况下,您都会得到变量的地址。通常,除非您需要指向零(null)的方法,否则请使用引用或者,如果您遇到无法使用引用的情况。引用清楚地表明null是不可能的。编译器将语句a=b+c分解为a=b.operator+(c)[当然,它也将分解=operator]。那么,一个“+”重载运算符函数将如何使用指针作为参数?@Greengoblin尽管它被明确说明,但您完全没有抓住要点。仅当
运算符
被定义为类成员时,编译器才会执行该转换。如果有一个匹配的非成员二进制
运算符+
,那么这种语法是非常好的,它可以与任何两种类型一起使用,如
lhs
rhs
。正如NB已经说过并证明的那样。
int val = 5;
int *pVal = &val; //No dynamic memory allocation.
A operator+(const A *lhs, const A *rhs) {...}
const A& operator+(const A& o)
{
     return A(i+o.i);
}