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;
我有以下 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;