2011-11-24 97 views
5

说我有一类FooC++取消引用指针之间

class Foo { 
} 

我做如下分配:

Foo *ptrFoo=new Foo(); 

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

我的问题:

1)当assignming为 “& REF”内存在内存中发生了什么? 它只是将“ptrFoo”的内存地址分配给“ref”?

2)当分配给“afoo”时,发生了什么?它是否调用复制构造函数?这意味着内存分配给两个Foo对象?即“afoo”和先前为“ptrFoo”分配的内存?

3)说我有一个所谓的 “空隙methodBar(常量富&实例)” 方法 如果我通过 “ptrFoo” 为:

methodBar((* preFoo));

这里“const”的意义是什么?

回答

8

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

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

2)当分配给“afoo”时,发生了什么?它是否调用复制构造函数?这意味着内存分配给两个Foo对象?即“afoo”和先前为“ptrFoo”分配的内存?

是,存储在动态存储的Foo的内容被复制(使用拷贝构造)至Foo中自动存储的实例。尽管这里没有动态分配。如果没有赋值,那么将会创建aFoo实例。例如,Foo aFoo;

3)说我有一个所谓的 “空隙methodBar(常量富&实例)” 如果我通过 “ptrFoo” 为: methodBar((* preFoo)方法); 这里最重要的“const”是什么?

const在该位置意味着,当该项目被通过引用传递,其宣称参考const该方法不允许修改实例的参考引用。

4
  1. 在做Foo& ref = *ptrFoo;,你是一个参考*ptrFoo。目前只有一个Foo。您对ref*ptrFoo所做的任何更改都会影响同一个对象。

  2. 当你Foo afoo = *ptrFoo;(这是一样的Foo afoo = ref;),创建另一个单独Foo,它存在的*ptrFoo独立。它由Foo的拷贝构造函数初始化。请注意,afoo存在于堆栈上,但在免费存储区(堆)上存在*ptrFoo。您对*ptrFoo所做的任何更改都不会影响afoo反之亦然。还要注意的是afoo将被销毁,当它超出范围内存自动释放,但*ptrFoo必须被销毁,它的内存做delete ptrFoo;

  3. const在这种情况下显式地释放意味着该函数接受一个参考它承诺不会修改的Foo。它不能调用Foo上未标记为const的任何方法。另外,当您调用此函数时,不会创建新的Foo(即,它不会按值传递)。

2

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

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

3)const意味着你正在传递一个对其数据不应该被修改的对象的引用。

2

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

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

3)const意味着方法methodBar不能修改名为instanceFoo&引用的对象。只允许拨打Foo上也标记为const的方法。