参数问题1、对象作为参数的问题:
  procedure MyProc(a: TObject);
  procedure MyProc(var a: TObject);
  procedure MyProc(const a: TObject); 
 对象参数是否有必要写成第二种形式?(引用参数形式)
 我记得有些书说第一种调用传入的也是一个地址,而不是把对象的副本传入。
 而第二种写法如果是传入一个地址,第一种形式和第二种形式有什么差别? 第三种写法对参数有什么影响呢?

解决方案 »

  1.   

    楼上的说法不完全正确!Delphi 中的对象(即 class 类型的变量)一律都是引用(指针):
    type
    TSomeClass = class
    SomeField: SomeType;
    ...
    end;
    var SomeObj: TSomeClass;SomeObj 其实是个指针!SomeObj.SomeField 其实就是 SomeObj^.SomeField,只不过编译器替你写了“^”,用不着自己写罢了所以
    procedure MyProc(a: TMyObject);
    也是传的对象的地址(当然,对于那个指针本身,是传值),不会产生副本!对于
    var Obj1, Obj2: TMyObject;
    procedure MyProc1(a: TMyObject);
    begin
      a.SomeProp := SomeValue;
      a := Obj2;
    end;

    procedure MyProc2(var a: TMyObject);
    begin
      a.SomeProp := SomeValue;
      a := Obj2;
    end;
    对于 a.SomeProp := SomeValue; 这样的操作,两者结果一样。
    对于 a := Obj2; 这样的操作,两者就不同了。
    执行 MyProc1(Obj1); 后,Obj1 仍然指向原来的对象
    指向 MyProc2(Obj1); 后,Obj1 指向了 Obj2(原来 Obj1 指向的对象仍然存在,但无法通过 Obj1 访问了)const a: TObject 的作用是防止函数内部修改对象而已。
      

  2.   

    拙见:这三中方式无论在参数的读些特性还是内存分配都是一样的。关键在于传递到过程中的是一个对象引用,这有别于简单类型。不管你用那一种方式,你都可以调用Free方法,修改任何可写属性。不记得是Delphi中的哪一段帮助了,但请相信俺没说假话。上面的范例对简单类型有效,对对象引用则不适用。
    再次强调:这里传递的是对象引用,而不是简单类型。
      

  3.   

    我使用了
    procedure MyProc(var a: TObject);
    好象需要非常严格的对象匹配!我用TObject的子类的对象调用该过程,通不过编译!