为什么*这可以作为一个&类型?

时间:2013-03-16 07:48:00

标签: c++ qt

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

    QTableWidgetItem *clone() const;
...
}

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

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

我的问题是关于最后一句话,如果我将其改为:

return new Cell(this);

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

为什么呢?我知道this是指针,不能成为参数。 但*this可能是&类型?

1 个答案:

答案 0 :(得分:5)

由于您尚未为类定义复制构造函数,编译器会为您生成一个具有以下签名的复制构造函数: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)作为pass-by-reference(实际上它必须通过引用,但这是另一个故事)。在此处详细了解该主题:What's the difference between passing by reference vs. passing by value?