首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针之间的C++解除引用

指针之间的C++解除引用
EN

Stack Overflow用户
提问于 2011-11-24 13:48:33
回答 4查看 113关注 0票数 5

假设我有一个Foo类

代码语言:javascript
复制
class Foo {
}

我完成以下任务:

代码语言:javascript
复制
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“的意义是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-24 13:54:32

1)当赋值给"&ref“时,在内存方面内部发生了什么?它只是将"ptrFoo“的内存地址分配给"ref”吗?

这取决于您的平台、编译器和编译器设置。您的编译器可能只会为取消引用生成一个同义词。因为引用可能不会被重新定义,所以编译器没有理由真的需要为变量分配任何内存。

2)当赋值为"afoo“时,会发生什么?它会调用copy-constructor吗?这意味着内存被分配给两个Foo对象?例如,"afoo“和之前为"ptrFoo”分配的内存?

是的,存储在动态存储中的Foo的内容被复制(使用复制构造函数)到自动存储中的Foo实例。不过,这里没有进行动态分配;如果没有赋值,创建aFoo实例也会很简单。例如,Foo aFoo;

3)假设我有一个叫做“methodBar(const Foo &)”的方法,如果我把"ptrFoo“作为: methodBar( (*preFoo))来传递;"const”在这里有什么意义?

位于该位置的const意味着,虽然项是通过引用传递的,但声明引用const的方法不允许修改引用引用的实例。

票数 8
EN

Stack Overflow用户

发布于 2011-11-24 13:55:45

  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. The const显式地释放它的内存。在这种情况下,这意味着函数接受对它承诺不会修改的Foo的引用。它不能调用未标记为const Foo上的任何方法。此外,当您调用此函数时,不会创建新的Foo (即,它不是通过值传递的)。
票数 4
EN

Stack Overflow用户

发布于 2011-11-24 13:56:10

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8252719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档