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

    QTableWidgetItem *clone() const; 
... 
} 

위의 내용은 Qt 프로그램의 클래스 정의입니다. 다음은 나머지 부분입니다. enter image description here왜 *이 유형에 & 사용할 수 있습니까?

이유 :

return new Cell(this); 

그런 다음 Qt는 오류 메시지를 줄 것이다 : 나는 그것을 좋아하는 변경하는 경우

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

내 질문은, 마지막 문장에 대해 무엇입니까? this은 포인터이며 인수가 될 수 없다는 것을 알고 있습니다. *this& 유형 일 수 있습니까?

+5

'* this *'는 '셀'이기 때문에. 'Cell'을 실제 매개 변수로 전달하는 것은'CELL '을 그것의 형식적 매개 변수로 취하는 함수에 C++에서 완벽하게 잘하고 그 매개 변수를 참조로 전달할 것입니다. 참조 변수를 초기화하는 방법과 유사합니다. – Michael

+0

좋은 설명 주셔서 감사합니다! –

+0

@Michael 귀하의 훌륭한 의견은 "귀하의 답변"상자를 몇 인치 만 놓 쳤습니다. 다음 기회에! –

답변

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 유형의 객체에 대한 참조가 매개 변수 (포인터가 아님)로 예상되므로 자동 생성 된 복사 생성자 Cell(const Cell&)과 일치하며 *this은 포인터를 역 참조하므로 실제 객체를 참조로 전달할 수 있습니다. 호출 구문이 고려되는 한, Cell(*this)의 호출은 컴파일러에서 참조로 전달하거나 값으로 전달하는 것으로 해결할 수 있습니다. 귀하의 경우 복사 생성자가 참조로 매개 변수를 수신하므로 (컴파일러는 & 서명으로 인해) Cell(*this)을 참조 전달로 해결합니다 (실제로 참조되어야하지만 다른 이야기입니다). 이 주제에 대한 자세한 내용은 여기를 참조하십시오 : What's the difference between passing by reference vs. passing by value?

관련 문제