6

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

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

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) 只不过是变量 i 本身。

然而,指向指针的指针是可能的。

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

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

7 . 在某些情况下,您必须使用引用。您不能在那里使用指针。考虑下面的例子:

一个=b+c;

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

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

在此处查看示例代码:http: //ideone.com/Q0pE1

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

我想知道我还有什么遗漏的吗?

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

4

1 回答 1

9

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

“分配内存”是什么意思?如果您的意思是堆分配,例如newormalloc或其他,则no

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);
}

这已破了。您将 a 返回const&到您创建的临时对象。您应该按价值返回它。

于 2012-07-26T02:15:35.843 回答