代码之家  ›  专栏  ›  技术社区  ›  varesa

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

  •  0
  • varesa  · 技术社区  · 10 年前

    我有以下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 回复  |  直到 10 年前
        1
  •  4
  •   R Sahu    10 年前

    问题:

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

    答覆:

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

    使用时:

    QTreeWidgetItem item = *itemPointer;
    

    item 通过使用的复制构造函数构造 QTreeWidgetItem ,它不是指针的简单取消引用对象。如果的复制构造函数 QTreeWidgetItem数量 不会复制孩子, 项目 不会有孩子。

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

    QTreeWidgetItem& item = *itemPointer;
    
        2
  •  2
  •   Vlad from Moscow    10 年前

    不需要。

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

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

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