C ++指针vs解除引用的对象

时间:2015-02-27 19:50:03

标签: c++ qt pointers dereference

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

2 个答案:

答案 0 :(得分:3)

问题:

  

取消引用的项目是否应该产生相同的结果?什么改变指针?

答案:

  

这取决于类的复制构造函数。

使用时:

QTreeWidgetItem item = *itemPointer;

item是使用QTreeWidgetItem的复制构造函数构造的,它不是指针的简单解除引用对象。如果QTreeWidgetItem的复制构造函数没有复制孩子,item将不会有孩子。

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

QTreeWidgetItem& item = *itemPointer;

答案 1 :(得分:1)

没必要。

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

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

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