在Delphi中,如果我有一個簡單的類myClass
和我通過它的一個實例與myFunction(myClass)
的功能,它是由function myFunction(myObject : myClass) : Boolean
定義...Delphi:通過引用或傳遞值?
將myObject的副本進行?
當我在myFunction中調用myObject的方法時,原始對象是否也會受到影響和修改?
在Delphi中,如果我有一個簡單的類myClass
和我通過它的一個實例與myFunction(myClass)
的功能,它是由function myFunction(myObject : myClass) : Boolean
定義...Delphi:通過引用或傳遞值?
將myObject的副本進行?
當我在myFunction中調用myObject的方法時,原始對象是否也會受到影響和修改?
對象通過引用傳遞。不會複製一份;將只有一個類的實例,只有一個對象。原始對象就是這樣。
該對象通過引用傳遞。
我打敗你了! :) - – 2010-10-02 12:31:45
它比「通過引用傳遞對象」還要多一點。對象是引用類型,所以它們總是默認通過引用傳遞。任何對象變量都是對象引用。但如果你傳遞一個對象變量「通過引用」(到一個var參數),那麼如果你用傳遞給它的例程中的一個不同的對象替換對象,那麼你最終會得到一個例程返回後的不同對象。這樣做時要小心;如果您更改對特定對象的唯一引用,則會導致內存泄漏。
當你說你「用另一個對象替換對象」時,你的確意思是「用*引用替換另一個對象*的對象*引用*。您無法用另一個對象替換對象,但可以覆蓋所有您想要的引用。 – 2010-10-02 15:07:01
和@Rob,在這種意義上你是對的,在調用「Object」這個引用「TObject」的變量時存在這樣一個流行的用詞不當......「MyForm.Width」是真正的寬度其參考由「MyForm」變量保存的表單。你改變'MyForm'變量,'MyForm.Width'是另一個Form的寬度。所以,「你最終會得到一個不同的對象」在某種程度上描述了程序員在實踐中的現實。 – 2010-10-02 20:09:14
在Delphi中,對象是特殊指針,它指向堆內存上的數據結構。當你將一個對象傳遞給一個函數時,你實際上正在傳遞指針,而不是整個對象數據的副本。在這種情況下,當您通過該引用修改字段或屬性時,它將影響原始對象數據。下面是一個簡單的例子證明了該行爲:
program ObjParamTest;
type
TMyClass = class
private
FMyField : Integer;
public
property MyField : Integer read FMyField write FMyField;
end;
function ModifyObject(AnObj: TMyClass);
begin
AnObj.MyField := AnObj.MyField + 1;
end;
var
MyObj : TMyClass;
begin
MyObj := TMyClass.Create;
try
AnObj.MyField := 2;
Writeln(AnObj.MyField); // ==> Prints 2
ModifyObject(MyObj);
Writeln(AnObj.MyField); // ==> Prints 3
finally
MyObj.Free;
end;
end.
也注意到,參數調節劑(如VAR,常量,輸出)只改變對象引用傳遞給函數的方式,對原來沒有影響數據結構。
也許這篇文章澄清了有關的東西在Delphi中傳遞函數的參數爲你不同的方式更多:
偉大的鏈接文章! – Mick 2010-10-02 15:30:31
我同意米克你的文章非常值得一讀。儘管如此,我認爲在發送到您的帖子之前發佈一個簡短的,直接回答這個問題是最有益的。特別是因爲它沒有詳細解決按值或var傳遞對象的差異。 – 2010-10-02 19:12:42
謝謝,我在帖子中增加了一個簡短的描述和一個簡單的例子。 – vcldeveloper 2010-10-03 02:26:45
織補你打我吧... :) +1 – 2010-10-02 12:31:47
是的,最初的對象是堆在一起的。但是,除非通過參考傳遞,否則您會獲得參考文獻的**副本**。在這種情況下,您將獲得對對象引用的引用。 – 2010-10-02 21:02:08
[只能有一個](http://www.imdb.com/title/tt0091203/) – 2010-10-02 21:14:54