C++ C++;指针与取消引用的对象
我有以下C++/Qt代码:C++ C++;指针与取消引用的对象,c++,qt,pointers,dereference,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(
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
及
?不需要
在第一个代码段中,创建了一个新对象
SomeClass *a = ...;
SomaClass b = *a;
b.x();
因此,结果取决于复制构造函数的定义方式。例如,它只能复制原始对象的部分状态。不需要
在第一个代码段中,创建了一个新对象
SomeClass *a = ...;
SomaClass b = *a;
b.x();
因此,结果取决于复制构造函数的定义方式。例如,它只能复制原始对象的部分状态。问题:
取消引用的项不应该产生相同的结果吗?什么改变了指针
答复:
它取决于类的复制构造函数
使用时:
QTreeWidgetItem item = *itemPointer;
item
是使用QTreeWidgetItem
的复制构造函数构造的,它不是指针的简单解引用对象。如果QTreeWidgetItem
的复制构造函数没有复制子项,item
将不会有任何子项
如果只想使用取消引用的对象,则必须使用引用对象
QTreeWidgetItem& item = *itemPointer;
问题:
取消引用的项不应该产生相同的结果吗?什么改变了指针
答复:
它取决于类的复制构造函数
使用时:
QTreeWidgetItem item = *itemPointer;
item
是使用QTreeWidgetItem
的复制构造函数构造的,它不是指针的简单解引用对象。如果QTreeWidgetItem
的复制构造函数没有复制子项,item
将不会有任何子项
如果只想使用取消引用的对象,则必须使用引用对象
QTreeWidgetItem& item = *itemPointer;
您可以将该项设置为itemPointer的取消引用。您没有将项分配到与项=*itemPointer相同的内存位置。如果希望它们指向相同的位置,则项必须是与itemPointer(QTreeWidgetItem*item=itemPointer)具有相同地址的指针。复制构造中存在错误,将项设置为itemPointer的取消引用。您没有将项分配到与项=*itemPointer相同的内存位置。如果您希望它们指向相同的位置,则item必须是一个与itemPointer地址相同的指针(QTreeWidgetItem*item=itemPointer)。复制构造函数中存在错误,因此这里有两个问题。1) 我认为x=y意味着x等于y,而不是x等于y的副本。2) 正如你所说的复制构造函数没有给出一个完全相同的对象,这让我很困惑。1) 我认为x=y意味着x等于y,而不是x等于y的副本。2) 正如你所说的复制构造函数没有给出相同的对象,这让我很困惑。所以我明确需要一个复制构造函数来使用它?@mLstudent33这里可能是一个复制省略。但是复制构造函数是可以接受的。所以我明确地需要一个复制构造函数来使用它?@mLstudent33这里可以是一个复制省略。但复制建造师应是可接受的。