2010-10-02 115 views
10

在Delphi中,如果我有一個簡單的類myClass和我通過它的一個實例與myFunction(myClass)的功能,它是由function myFunction(myObject : myClass) : Boolean定義...Delphi:通過引用或傳遞值?

  • 將myObject的副本進行?

  • 當我在myFunction中調用myObject的方法時,原始對象是否也會受到影響和修改?

回答

22

對象通過引用傳遞。不會複製一份;將只有一個類的實例,只有一個對象。原始對象就是這樣。

+1

織補你打我吧... :) +1 – 2010-10-02 12:31:47

+5

是的,最初的對象是堆在一起的。但是,除非通過參考傳遞,否則您會獲得參考文獻的**副本**。在這種情況下,您將獲得對對象引用的引用。 – 2010-10-02 21:02:08

+1

[只能有一個](http://www.imdb.com/title/tt0091203/) – 2010-10-02 21:14:54

4

該對象通過引用傳遞。

+0

我打敗你了! :) - – 2010-10-02 12:31:45

7

它比「通過引用傳遞對象」還要多一點。對象是引用類型,所以它們總是默認通過引用傳遞。任何對象變量都是對象引用。但如果你傳遞一個對象變量「通過引用」(到一個var參數),那麼如果你用傳遞給它的例程中的一個不同的對象替換對象,那麼你最終會得到一個例程返回後的不同對象。這樣做時要小心;如果您更改對特定對象的唯一引用,則會導致內存泄漏。

+2

當你說你「用另一個對象替換對象」時,你的確意思是「用*引用替換另一個對象*的對象*引用*。您無法用另一個對象替換對象,但可以覆蓋所有您想要的引用。 – 2010-10-02 15:07:01

+0

和@Rob,在這種意義上你是對的,在調用「Object」這個引用「TObject」的變量時存在這樣一個流行的用詞不當......「MyForm.Width」是真正的寬度其參考由「MyForm」變量保存的表單。你改變'MyForm'變量,'MyForm.Width'是另一個Form的寬度。所以,「你最終會得到一個不同的對象」在某種程度上描述了程序員在實踐中的現實。 – 2010-10-02 20:09:14

13

在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中傳遞函數的參數爲​​你不同的方式更多:

Different function parameter modifiers in Delphi(存檔版本)

+3

偉大的鏈接文章! – Mick 2010-10-02 15:30:31

+1

我同意米克你的文章非常值得一讀。儘管如此,我認爲在發送到您的帖子之前發佈一個簡短的,直接回答這個問題是最有益的。特別是因爲它沒有詳細解決按值或var傳遞對象的差異。 – 2010-10-02 19:12:42

+0

謝謝,我在帖子中增加了一個簡短的描述和一個簡單的例子。 – vcldeveloper 2010-10-03 02:26:45