假设我有一个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“的意义是什么?
发布于 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的方法不允许修改引用引用的实例。
发布于 2011-11-24 13:55:45
Foo& ref = *ptrFoo;的时候,你是在引用*ptrFoo。此时只有一个Foo存在。您对ref或*ptrFoo所做的任何更改都将影响同一对象。Foo afoo = *ptrFoo; (与Foo afoo = ref;相同)时,您将创建另一个独立的Foo,它独立于*ptrFoo存在。它是由Foo的复制构造函数初始化的。请注意,堆栈上存在afoo,但空闲存储(堆)上存在*ptrFoo。对*ptrFoo所做的任何更改都不会影响afoo,反之亦然。还要注意,当afoo超出作用域时,它将被销毁并自动释放它的内存,但是*ptrFoo必须被销毁,并通过执行delete ptrFoo;const显式地释放它的内存。在这种情况下,这意味着函数接受对它承诺不会修改的Foo的引用。它不能调用未标记为const Foo上的任何方法。此外,当您调用此函数时,不会创建新的Foo (即,它不是通过值传递的)。发布于 2011-11-24 13:56:10
1)它正在创建对ptrFoo指向的对象的引用,不会创建新的对象。
2)调用复制构造函数,它正在创建一个Foo类型的新对象。
3)常量表示您正在传递对其数据不应被修改的对象的引用。
https://stackoverflow.com/questions/8252719
复制相似问题