共享的解引用指针值显示不同的结果(当应用隐式复制构造函数时).为什么
Shared dereferenced pointer value displays different results (when applying implicit copy constructor). Why?
这段代码的输出是
21
我无法向自己解释这件事。我的想法(我所学到的)是调用隐式复制构造函数(由赋值触发),并一点一点地复制所有元素。但是,这不适用于外部元素,比如私有变量val
,它是一个指针。所以b
有一个不同的指针,但是它指向的是同一个元素
所以我期望结果是
22
即.get()
被a
和b
调用了两次,因此解引用的指针值应该是1
(在第一个get()
之后),然后是2
(在第二个get()
之后)。最后,将值写入控制台输出。
#include <iostream>
using namespace std;
class A {
int *val;
public:
A() {
val = new int;
*val = 0;
}
int get() {
return ++(*val);
}
};
int main() {
A a, b = a;
cout << a.get() << b.get();
return 0;
}
使用cout时,a.get()
和b.get()
的求值没有特定的顺序。因此,在您的示例中,首先计算b.get()
(到1),然后计算a.get()
(到2),然后在屏幕上打印"21"。
代码实际是这样做的:
cout.operator<<( a.get() ).operator<<( b.get() );
或
operator<<( operator<<( cout, a.get() ), b.get() );
(由于重载问题,我无法使后者编译,但它确实在幕后发生)
这意味着代码在b.get()之前计算std::endl,在a.get()之前计算b.get()。因此b.g get()将val的指向值增加1然后返回1,a.g get()将val的指向值增加1然后返回2。运算符在求值参数后按预期顺序调用。我猜这是编译器依赖的,但我运行了你的代码并得到了21。
在这种情况下,您使用隐式复制构造函数。它所做的是将实例a的内存复制到实例b(正如您所说的,一个字节一个字节)
所以b现在拥有自己的指针,它和a的指针保存着相同的值,也就是指向相同的地址。由于您在get()上增加了值,因此返回的值永远不会相同,因此您永远不会得到22作为结果。
编辑:你实际上没有使用std::endl,这是我的习惯。
首先为对象b调用get函数,然后为对象a调用get函数,因此得到一个0/p = 21
(gdb) s
main () at so2.c++:20
20 cout << a.get() << b.get();
(gdb) p &a
$6 = (A *) **0x7fffffffd0f0**
(gdb) p &b
$7 = (A *) *0x7fffffffd0e0*
(gdb) s
A::get (this=*0x7fffffffd0e0*) at so2.c++:14
14 return ++(*val);
(gdb) p *val
$8 = 0
(gdb) n
15 }
(gdb) p *val
$9 = 1
(gdb) s
A::get (**this=0x7fffffffd0f0**) at so2.c++:14
14 return ++(*val);
(gdb) s
15 }
(gdb) p *val
$10 = 2
从上面的调试会话中,我们可以看到流程和行为。 您的问题是序列点之一:std::cout << a.get() << b.get();
对a.get()
和b.get()
没有严格定义的求值顺序。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 即使在我为我的应用程序授予管理员后也无法从 Windows 系统复制目录
- 虚拟化和复制Qt应用程序20次
- 复制 std::vector,但将 lambda 应用于每个元素
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 是否可以动态翻译QT应用程序而无需复制代码
- QT应用程序崩溃但不容易复制,我捕获了转储堆栈以及如何通过堆栈找到源代码
- 在线程中复制文件以防止冻结应用程序
- memcpy或std ::复制我的特定应用程序
- 更快地将数组中的数据复制到目标,同时应用缩放或偏移因子
- VS 2010 中 win32 应用程序中的文件夹复制
- 如何将数据从一个windows应用程序复制到另一个
- 使用Qt创建者和Cocoa编程(从当前应用程序复制选定的文本)
- 如果WinRT应用程序在文件复制过程中终止,会发生什么
- QT c++可以使用自定义mime类型在多个应用程序上复制和粘贴
- 复制和粘贴剪贴板从不同的应用程序
- 控制台应用程序 - C++编程练习 - 深层复制
- 共享的解引用指针值显示不同的结果(当应用隐式复制构造函数时).为什么