C++指针解引用的操作

5

假设我有一个叫做Foo的类

class Foo {
}

我负责以下任务:

Foo *ptrFoo=new Foo();

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

我的问题:

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

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

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

methodBar((* preFoo));

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

4个回答

8

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

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

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

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

3) 假设我有一个名为“void methodBar(const Foo &instance)”的方法,如果我将“ptrFoo”作为参数传递: methodBar((*preFoo)); 那么这里的“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 超出作用域时,它将被销毁并自动释放其内存,但必须通过执行 delete ptrFoo; 显式地销毁 *ptrFoo 并释放其内存。

  3. 在这种情况下,const 表示该函数接受一个对 Foo 的引用,承诺不修改它。它不能调用任何未标记为 const 的方法。此外,在调用此函数时,不会创建新的 Foo(即,它不是按值传递的)。


2

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

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

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


2

1) 它将*(ptrFoo)返回的对象的内存地址分配给了ptrFoo,它们是等价的。

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

3) const意味着methodBar方法不能修改以Foo&命名的instance引用的对象。它只能调用标记为constFoo方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接