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

    QTableWidgetItem *clone() const;
...
}

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

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

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

return new Cell(this);

然后Qt会给出错误信息: 在此处输入图像描述

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

4

1 回答 1

5

由于您尚未为您的类定义复制构造函数,因此编译器会为您生成一个具有以下签名的构造函数:(Cell(const Cell&)在此处阅读更多内容:自动生成默认/复制/移动 ctor 和复制/移动赋值运算符的条件?)。当您尝试调用Cell(this)时,编译器会尝试Cell(Cell*)在各种Cell构造函数中查找 - 显然没有匹配项。Cell(*this)匹配自动生成的复制构造函数Cell(const Cell&),因为它期望对类型对象的引用Cell作为参数(而不是指向它的指针),并*this取消引用指针,以便可以通过引用传递实际对象。就所考虑的调用语法而言,调用Cell(*this)编译器可以将其解析为按引用传递或按值传递。由于在您的情况下,复制构造函数通过引用接收参数(由于&签名中的),编译器将解析Cell(*this)为通过引用传递(实际上它必须是通过引用,但这是另一回事)。在此处阅读有关该主题的更多信息:按引用传递与按值传递有什么区别?

于 2013-03-16T08:13:57.867 回答