2013-02-03 109 views
0

我無法在標題中清楚地說明我的問題,但這確實是。帶指針參數的函數

void DChatbox::ClampObject(DTextbox _txtbox) { 

    this->_txtbox = &_txtbox; 

} 

這只是創建_txtbox沒有引用它的副本。

但這個工程。

void DChatbox::ClampObject(DTextbox* _txtbox) { 

    this->_txtbox = _txtbox 

} 

當我檢查第一個,它只是複製它,而不是引用它。這是爲什麼?

注:_txtboxDChatbox被聲明爲這個DTextbox* _txtbox

+0

DTextbox _txtbox應該是'DTextbox&_txtbox'.pointers和reference是不同的。 – Arpit

+0

@Arpit:我想你的意思是'DTextbox _txtbox'應該是'DTextbox&_textbox',不是嗎?第二個例子是正確的,而第一個例子是分配一個局部變量的內存地址(在堆棧中)。 –

+2

請小心,第一個版本將不起作用,因爲您正在取得一個局部變量的地址,該變量在函數結束時將被刪除。所以當函數結束時,'this - > _ txtbox'不會指向有效的'Dtextbox'對象 – lucasmrod

回答

2

在你的第一種情況,指針成員被分配一個DTextbox對象,它是本地的功能,並保證只活到了地址功能範圍{ }結束。
當您在功能DChatbox::ClampObject之外提及this->_txtbox時,您將得到的是未定義的行爲

在第二種情況下,指針成員被賦值給傳遞給該函數的對象的地址,並且可能(難以說出,除非您顯示調用它的代碼)該對象的生命週期被傳遞給函數足夠長的時間讓你的程序正常工作,因此它能夠正常工作。

+0

它被稱爲是這樣的: //在這裏初始化DTextbox實例...然後 mchatbox.ClamObject(&txtbox); 我現在明白了。謝謝! – mr5

1

這是因爲第一個版本通過值傳遞參數,即它使整個對象的副本。該方法完成後,只需刪除該副本。因此,該方法完成後,該局部對象的地址無效,因爲它指向一個已刪除的對象。

第二個版本使用指針傳遞參數,所以指針引用實際對象而不是對象的副本。因此,該方法完成後,指針的值仍然與指向仍然存在的對象相同。

+0

我認爲它不會被刪除,因爲我運行它時仍然可以在程序中看到該對象? – mr5

+0

@ mr5:這是未定義的行爲。本地對象只保證在該函數內存在。除了函數之外,該對象的地址*可能會或可能不會指向有效的對象。沒有保證。所以它有時可能會有效,也可能不會有其他時候。總之,這不是你應該依賴的行爲,只是避免它。 –

+0

@AlokSave我會記住它的。感謝您的建議。 – mr5