说我有一个班级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”的重要性吗?
答案 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)
执行Foo& ref = *ptrFoo;
时,您正在引用*ptrFoo
。目前只存在一个Foo
。您对ref
或*ptrFoo
所做的任何更改都会影响同一个对象。
当您执行Foo afoo = *ptrFoo;
(与Foo afoo = ref;
相同)时,您创建另一个单独的 Foo
,其独立于{{ 1}}。它由*ptrFoo
的复制构造函数初始化。请注意,堆栈上存在Foo
,但免费存储(堆)上存在afoo
。您对*ptrFoo
所做的任何更改都不会影响*ptrFoo
,而反之亦然。另请注意,afoo
将被销毁并且当其超出范围时会自动释放其内存,但必须通过执行afoo
*ptrFoo
并明确释放其内存LI>
在这种情况下,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
的方法。