C++取消指针之间的引用

C++ de-referencing between pointer

本文关键字:引用 之间 指针 取消 C++      更新时间:2023-10-16

假设我有一个类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"的意义是什么?

1( 当分配给"&ref"时,内存内部会发生什么?它只是将"ptrFoo"的内存地址分配给"ref"吗?

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

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

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

3( 假设我有一个名为"void methodBar(const Foo&instance("的方法,如果我将"ptrFoo"传递为:methodBar((*preFoo((;这里"const"的意义是什么?

const在该位置意味着当项通过引用传递时,声明引用const的方法不允许修改引用引用的实例。

  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的引用,它承诺不修改该引用。它不能调用Foo上未标记为const的任何方法。此外,当您调用此函数时,不会创建新的Foo(也就是说,它不是按值传递的(。

1(它正在创建对ptrFoo指向的对象的引用,没有创建新对象。

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

3( const表示您正在传递对一个对象的引用,该对象的数据不应被修改。

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

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

3( const表示方法methodBar不能修改Foo&引用的名为instance的对象。它将只允许调用Foo上也标记为const的方法。