Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指针与取消引用的对象_C++_Qt_Pointers_Dereference - Fatal编程技术网

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

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(

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

?不需要

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

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这里可以是一个复制省略。但复制建造师应是可接受的。