c++ - 为什么 *this 可以用作 & 类型?

标签 c++ qt

class Cell : public QTableWidgetItem
{
public:
    Cell();

    QTableWidgetItem *clone() const;
...
}

上面是Qt程序中的类定义。 以下是其余部分。

QTableWidgetItem *Cell::clone() const
{
    return new Cell(*this);
}

我的问题是关于最后一句,如果我把它改成like:

return new Cell(this);

然后Qt会给出错误信息: enter image description here

为什么?我知道 this 是一个指针,不能作为参数。 但是 *this 可以是 & 类型吗?

最佳答案

由于您尚未为您的类定义复制构造函数,编译器会为您生成一个具有以下签名的复制构造函数:Cell(const Cell&)(在此处阅读更多信息:Conditions for automatic generation of default/copy/move ctor and copy/move assignment operator?)。当您尝试调用 Cell(this) 时,编译器会尝试在各种 Cell 构造函数中查找 Cell(Cell*) - 显然没有匹配项. Cell(*this) 与自动生成的复制构造函数 Cell(const Cell&) 匹配,因为它需要对类型为 Cell 的对象的引用一个参数(不是指向它的指针),并且 *this 取消引用该指针,因此可以通过引用传递实际对象。就所考虑的调用语法而言,编译器可以将 Cell(*this) 的调用解析为按引用传递或按值传递。由于在您的情况下,复制构造函数通过引用接收参数(由于签名中的 & ),编译器会将 Cell(*this) 解析为传递-reference(实际上必须是引用,但那是另一回事)。在此处阅读有关该主题的更多信息:What's the difference between passing by reference vs. passing by value?

关于c++ - 为什么 *this 可以用作 & 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15446900/

相关文章:

c++ - std::optional has_value() 怎么可能是 constexpr?

c++ - 如何在没有 webengine 的情况下构建 Qt5?

c++ - Windows 7 中的声子问题,代码在 XP 中编译

python - 在 QT4/PySide 中编辑不是基于树/表/列表的模型?

c++ - QGraphicsPixmapItem

c++ - 在 qtreewidget 项目之间设置线

c++ - 如何返回一个int和一个字符串?

c++ - 将对象的地址复制到缓冲区并检索它

c++ - 如何阻止重载的 new() 从 C++/Linux 中的 Ostream 调用?

c++ - 在编译时检查张量是否为矩形(即多维数组的所有范围都相等)