2013-03-16 61 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?