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
可能是&
类型?
答案 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?