2013-03-16 66 views
0
class Cell : public QTableWidgetItem 
{ 
public: 
    Cell(); 

    QTableWidgetItem *clone() const; 
... 
} 

以上是Qt程序中的类定义。 以下是其余部分。为什么*这可以作为&type?

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

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

return new Cell(this); 

随后的Qt将给错误消息: enter image description here

为什么?我明白this是一个指针,不能是参数。 但*this可能是&类型?

+5

因为'* this *'是一个'Cell'。将一个'Cell'作为一个实际参数传递给一个接受'Cell&'作为其形式参数的函数在C++中是完全正确的,并且将通过引用传递该参数。这与您如何初始化参考变量类似。 – Michael 2013-03-16 08:07:39

+0

谢谢你的好解释! – 2013-03-16 08:20:43

+0

@Michael你的优秀评论错过了“你的答案”框几英寸。下次更好运! – 2013-03-16 08:21:30

回答

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)作为传递引用(实际上它必须通过引用,但那是另一回事)。阅读更多关于这里的主题:What's the difference between passing by reference vs. passing by value?