C ++指针之间的引用

时间:2011-11-24 05:48:33

标签: c++ pointers memory-management

说我有一个班级Foo

class Foo {
}

我做以下作业:

Foo *ptrFoo=new Foo();

Foo &ref=*(ptrFoo);  //question 1
Foo afoo=*(ptrFoo); //quesion 2

我的问题:

1)当分配给“& ref”时,内存中会发生什么?  它只是将“ptrFoo”的内存地址分配给“ref”吗?

2)当分配到“afoo”时,会发生什么?它是否调用copy-constructor?这意味着内存是为两个Foo对象分配的?即“afoo”和先前为“ptrFoo”分配的内存?

3)假设我有一个名为“void methodBar(const Foo& instance)”的方法 如果我将“ptrFoo”传递给:

methodBar((* preFoo));

这里有“const”的重要性吗?

4 个答案:

答案 0 :(得分:8)

  

1)当分配给“& ref”时,内存中会发生什么?它只是将“ptrFoo”的内存地址分配给“ref”吗?

这取决于您的平台,编译器和编译器设置。您的编译器可能只生成解除引用的同义词。因为引用可能没有重新定义,所以编译器确实不需要为变量分配任何内存。

  

2)当分配到“afoo”时,会发生什么?它是否调用copy-constructor?这意味着内存是为两个Foo对象分配的?即“afoo”和先前为“ptrFoo”分配的内存?

是的,存储在动态存储中的Foo的内容将(使用复制构造函数)复制到自动存储中的Foo实例。但是这里没有动态分配;如果没有赋值,aFoo实例就会被创建。例如,Foo aFoo;

  

3)假设我有一个名为“void methodBar(const Foo& instance)”的方法,如果我将“ptrFoo”传递给:   methodBar((* preFoo));   什么是“const”的重要性?

该位置的

const表示当项目通过引用传递时,不允许声明引用const的方法修改引用引用的实例。

答案 1 :(得分:4)

  1. 执行Foo& ref = *ptrFoo;时,您正在引用*ptrFoo。目前只存在一个Foo。您对ref*ptrFoo所做的任何更改都会影响同一个对象。

  2. 当您执行Foo afoo = *ptrFoo;(与Foo afoo = ref;相同)时,您创建另一个单独的 Foo,其独立于{{ 1}}。它由*ptrFoo的复制构造函数初始化。请注意,堆栈上存在Foo,但免费存储(堆)上存在afoo。您对*ptrFoo所做的任何更改都不会影响*ptrFoo,而反之亦然。另请注意,afoo将被销毁并且当其超出范围时会自动释放其内存,但必须通过执行afoo

    来清除*ptrFoo并明确释放其内存LI>
  3. 在这种情况下,delete ptrFoo;表示该函数接受对它承诺不会修改的const的引用。它无法调用Foo上未标记为Foo的任何方法。此外,当您调用此函数时,不会创建新的const(也就是说,它不会按值传递)。

答案 2 :(得分:2)

1)它创建了对ptrFoo指向的对象的引用,没有创建新对象。

2)调用复制构造函数,它正在创建一个类型为Foo的新对象。

3)const表示您正在传递对不应修改其数据的对象的引用。

答案 3 :(得分:2)

1)它分配*(ptrFoo)返回的对象的内存地址,相当于ptrFoo

2)调用复制构造函数。您现在有两个对象,一个在堆上分配并由ptrFoo指向,另一个在堆栈上分配,名为afoo

3)const表示方法methodBar无法修改名为Foo&的{​​{1}}引用的对象。只允许在instance上调用也标记为Foo的方法。