C++ 指针与取消引用的对象

C++ pointer vs dereferenced object

我有以下 C++/Qt 代码:

QTreeWidgetItem *itemPointer = this->widget->topLevelItem(0);
QTreeWidgetItem item = *itemPointer;
QTreeWidgetItem *itemPointer2 = &item;

qDebug() << itemPointer->childCount();   // 2 (answer I'm looking for)
qDebug() << (*itemPointer).childCount(); // 2
qDebug() << item.childCount();           // 0
qDebug() << itemPointer2->childCount();  // 0

qDebug() << itemPointer;  // 0xeb6f70
qDebug() << itemPointer2; // 0x7fffeeca7330

取消引用的 item 不应该产生相同的结果吗?什么改变了指针?

有什么区别

SomeClass *a = ...;
SomaClass b = *a;
b.x();

SomeClass *a = ...;
(*a).x();

?

不需要。

在第一个代码片段中,创建了一个新对象

SomeClass *a = ...;
SomaClass b = *a;
b.x();

所以结果取决于复制构造函数是如何定义的。例如,它只能复制原始对象的部分状态。

问题:

Shouldn't the dereferenced item produce the same results? What changes the pointer?

答案:

It depends on the copy constructor of the class.

当您使用时:

QTreeWidgetItem item = *itemPointer;

item是利用QTreeWidgetItem的拷贝构造函数构造的,它不是简单的指针解引用对象。如果 QTreeWidgetItem 的复制构造函数不复制子项,则 item 将没有任何子项。

如果您只想使用取消引用的对象,则必须使用引用对象。

QTreeWidgetItem& item = *itemPointer;