C++取消指针之间的引用
C++ de-referencing between pointer
假设我有一个类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
的方法不允许修改引用引用的实例。
-
在执行
Foo& ref = *ptrFoo;
时,您正在参考*ptrFoo
。此时仅存在一个Foo
。对ref
或*ptrFoo
所做的任何更改都将影响同一对象。 -
当您执行
Foo afoo = *ptrFoo;
(与Foo afoo = ref;
相同(时,您将创建另一个独立的Foo
,它独立于*ptrFoo
而存在。它是由Foo
的复制构造函数初始化的。注意,afoo
存在于堆栈中,但*ptrFoo
存在于空闲存储(堆(中。对*ptrFoo
所做的任何更改都不会影响afoo
,反之亦然。还要注意,当afoo
超出范围时,它将被销毁并自动释放内存,但必须通过执行delete ptrFoo;
来销毁*ptrFoo
并显式释放内存 -
在这种情况下,
const
意味着函数接受对Foo
的引用,它承诺不修改该引用。它不能调用Foo
上未标记为const
的任何方法。此外,当您调用此函数时,不会创建新的Foo
(也就是说,它不是按值传递的(。
1(它正在创建对ptrFoo指向的对象的引用,没有创建新对象。
2( 复制构造函数被调用,它正在创建一个Foo类型的新对象。
3( const表示您正在传递对一个对象的引用,该对象的数据不应被修改。
1(它分配*(ptrFoo)
返回的对象的内存地址,相当于aFoo
0。
2( 复制构造函数被调用。现在有两个对象,一个在堆上分配并由ptrFoo
指向,另一个在堆栈上分配并命名为afoo
。
3( const
表示方法methodBar
不能修改Foo&
引用的名为instance
的对象。它将只允许调用Foo
上也标记为const
的方法。
- 常量引用和引用之间的区别
- C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
- 左值引用和右值引用之间的区别
- DLL 引用之间的区别?和用途?
- C++中的变量和引用之间的区别是什么
- 句柄、指针和引用之间有什么区别
- 未定义的引用-"a=-b;"之间是否存在差异和`a=-1*b;`和C++中的"a=0-b&
- 返回类型中 && 和没有引用之间的区别
- 如何在函数参数中的右值和右值引用之间进行区分
- 模板中的右值引用和常量左值引用之间的重载
- 作为自变量的右值引用和左值引用之间的差异
- c++中指针和引用之间的区别
- “迭代器”和“对元素的引用”之间的区别
- 基元引用之间的static_cast
- Go和C++中指针和引用之间的逻辑差异
- 引用和左值引用之间有什么区别吗
- 指针 (*) 和引用 (&) 之间的区别
- Lua注册表与轻用户数据和引用之间的区别是什么?
- 数组指针与数组引用之间的差异
- 在指针和引用之间进行转换