Delphi的代码如下:
---------------------------------------------------
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TTest = class
  public
    Value: Integer;
  end;  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure Test1(x: Integer);
    procedure Test2(var x: Integer);
    procedure Test3(T: TTest);
    procedure Test4(var T: TTest);
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Test1(x: Integer);
begin
  x := 5;
  ShowMessage('In Test1:'+IntToStr(x));
end;procedure TForm1.Test2(var x: Integer);
begin
  x := 5;
  ShowMessage('In Test2:'+IntToStr(x));
end;procedure TForm1.Test3(T: TTest);
begin
  T.Value := 5;
  ShowMessage('In Test3:'+IntToStr(T.Value));
end;procedure TForm1.Test4(var T: TTest);
begin
  T.Value := 5;
  ShowMessage('In Test4:'+IntToStr(T.Value));
end;procedure TForm1.Button1Click(Sender: TObject);
var
  x: Integer;
  tt: TTest;
begin
  tt := TTest.Create;  x := 10;
  ShowMessage('Before Test1:'+IntToStr(x)); 
  Test1(x);                      
  ShowMessage('After Test1:'+IntToStr(x));  //语句1  x := 10;
  ShowMessage('Befor Test2:'+IntToStr(x));
  Test2(x);
  ShowMessage('After Test2:'+IntToStr(x));  //语句2  tt.Value := 10;
  ShowMessage('Before Test3:'+IntToStr(tt.Value));
  Test3(tt);
  ShowMessage('After Test3:'+IntToStr(tt.Value));  //语句3
 
  tt.Value := 10;
  ShowMessage('Before Test4:'+IntToStr(tt.Value));
  Test4(tt);
  ShowMessage('After Test4:'+IntToStr(tt.Value));  //语句4
end;end.
-------------------------------------------------
语句3和语句4显示的结果为什么与语句1和语句2显示的结果不一致?
Test(var T: TTest)和Test(T: TTest)有什么区别?
Test(var T: TTest)和Test(T: TTest)哪一个对系统的开销小?
为什么基本数据类型和类的思想不一致?
-------------------------------------------------
与之对应的C++的代码如下
-------------------------------------------------
#include <iostream.h>class Test
{
public:
int Value;
};void Test1(Test t)
{
t.Value = 5;
cout << "In Test1:"<<t.Value<<endl;
}void Test2(Test &t)
{
t.Value = 5;
cout << "In Test2:" << t.Value << endl;
}void Test3(Test *t)
{
t->Value = 5;
cout << "In Test3:" << t->Value << endl;
}int main()
{
Test T; T.Value = 10;
cout << "Before Test1:" << T.Value << endl;
Test1(T);
cout << "After Test1:" << T.Value << endl << endl; T.Value = 10;
cout << "Before Test2:" << T.Value << endl;
Test2(T);
cout << "After Test2:" << T.Value << endl << endl; T.Value = 10;
cout << "Before Test3:" << T.Value << endl;
Test3(&T);
cout << "After Test3:" << T.Value << endl << endl; return 0;
}
----------------------------------------------------
C++中,基本数据类型和类的思想是一致的。
delphi对基本数据类型和类采取不一样的思想,是否造成了更多的混乱?
由于我初学Delphi,还希望高手指点一下。
我并不想讨论C++和Delphi谁更加强大,他们只不过是工具而已。
请勿吵架!!!非常感谢!

解决方案 »

  1.   

    简单来说,有var表示允许你对这个数据更改,没var则不能更改。
      

  2.   

    但对于(Object: TClass)和(var Object: TClass)来说,两者都可以对数据进行修改,上面的例子说明了这一点。
      

  3.   

    希望回答问题的朋友能仔细的看一下上面的代码,然后再回答问题。最好能把Delphi的代码运行一下。
      

  4.   

    对变量而言,其存在于栈中,不用var相当于在栈复制一个副本;而对象则被创建于堆中,我想其不能在参数传递时自动再复制一个自己而无论有无var始终当引用方式来调用,即只传指针过去
      

  5.   

    1 (Object: TClass)和2 (var Object: TClass)
      
         1中是按值进行传递的,形参与实参就相当于两个变量。2中是按引用传递的,形参与实参就相当于一个变量,两个指针,一个指针是另一个指针的副本,但是它们所指向的内存地址都是相同的。  1  function Fa(value:integer):Integer;
             begin
                value:=value+1;
                result:=value;
              end;
      2  function Fb(var value:Integer):integer;
              begin
                 value:=value+1;
                 result:=value;
               end;
       var
          Fa,a,Fb,b:Integer;
            begin
             a:=3;
             Fa:=fa(a);   //这时 fa等于4,a等于3
             b:=3;
             fb:=fb(b);   //这时 fb等于4,b等于4     
        end;
      

  6.   

    运行结果的解释也许只能是这样的:类的实例作为参数时, 总是按地址传递的方式运作的。将TTest的说明改成这样:
      TTest = record
        Value: Integer;
      end;并去除 tt := TTest.Create; 这个语句,然后再运行试试。
      

  7.   

    楼上的各位兄弟,你们都没有很好地理解楼主写这段测试代码的意图,建议你们把代码贴到Delphi中去运行一下,结果也许与你们一开始预料的根本不同喽。
      

  8.   

    为什么类的实例作为参数时,总是按地址传递的方式运作的。
    从上面的贴子中可以看出,大家都知道(x: Integer)是按值传递,(var x: Integer)是按地址传递,为什么Delphi在对待类时不能按照上面的规则呢?既然Delphi选择了这种方式,就有它的道理。它的道理又是什么呢?
    (Object: TClass)和(var Object: TClass)哪一个占用系统资源少?哪一个运行速度快?
      

  9.   

    对于类来讲,DELPHI传递的都是引用,因为对象变量本身就是对象的引用,两者的区别就在于(Object: TClass)的形式产生了对象变量的另一个副本,实际上就是对象的另一个别名。
    (var Object: TClass)则是直接传递的对象引用本身。
      

  10.   

    (Object: TClass)和(var Object: TClass)哪一个占用系统资源少?哪一个运行速度快?
    ===========================对于这个问题,关键是要明白其内部的机制就可以了,以免造成混乱
      

  11.   

    Delphi的参数要区分是否是对象。如果是对象,不管你用const、var还是没有限定符,都是可以修改的。如果不是对象,用const限定后就是不能重新赋值的;如果用var可以重新赋值,并且还会影响到调用此方法的代码之后的代码;如果没有限定符,该参数可以重新赋值,但不会返回。
    而且,如果是用var限定的,不能用类的属性做参数,即使类型兼容。
      

  12.   

    请教 aus(天兵) 
    我对下面的话不太理解:
    “如果用var可以重新赋值,并且还会影响到调用此方法的代码之后的代码;如果没有限定符,该参数可以重新赋值,但不会返回。而且,如果是用var限定的,不能用类的属性做参数,即使类型兼容。”能否举一个例子。
    非常感谢!!!
      

  13.   

    是的 Delphi它對自定義類型的對象好象都是默認傳引用的。。
    而C++裡面是有一個專門的語法來表示的class A;
    A a;void func(const A& a)
    void func(A& a)delphi這樣做的好處就是避免了C++中對copy constructor的處理,C++中拷貝構造函數是一個比較大的話題,
      

  14.   

    比如你有一个方法A(var c: integer)其中把c的值重新设为5;在方法B中定义了变量k:integer;k赋值为2,然后A(k)调用;调用之后k的值就变为5了,这时你后续的代码如果用到k的话就有影响了。其实有var跟没var的主要差别chinaandys(风雨含笑&鞭策自已,不断努力,方可峰回路转)已经说了。有var的话是直接传参数的地址,并且该地址的内容是可以修改的。没var的话,是类似于创建一个临时变量,并把传入的变量的值赋值给这个临时变量。如果是const的话,该参数的地址所包含的内容是被保护的,所以无法修改。
    另外我上面对于对象参数的说法也有点不对。对象参数的可写属性是一定可以修改的。对于对象参数本身的限制跟其他类型的参数是一样的。
      

  15.   

    无var 传值 
    有var 传地址  相当于引用  但是delphi中所有的对象都是指针,
    传值传的还是地址,故传对象时不用
    var也可修改对象
      

  16.   

    Var参数可传递返回值http://lysoft.7u7.net
      

  17.   

    回复人: zhangl_cn(五台山的和尚也编程) ( ) 信誉:100  2005-02-04 09:55:00  得分: 0     对于类来讲,DELPHI传递的都是引用,因为对象变量本身就是对象的引用,两者的区别就在于(Object: TClass)的形式产生了对象变量的另一个副本,实际上就是对象的另一个别名。
    (var Object: TClass)则是直接传递的对象引用本身。
      
     
    这个解释得比较清楚。使用(var Object: TClass)这种形式,我们能将一个对象指针指向另一个对象实例,而(Object: TClass)则做不到这一点。
      

  18.   

    in delphi primitive type is passed by value by default object type is passed by reference by default
      

  19.   

    看看这个例子就明白了:
    procedure varproc(var vari:integer);
    var
      i:integer;
    begin
      for i:=1 to 10 do
        vari:=vari+1;
    end;procedure proc(vari:integer);
    var
      i:integer;
    begin
      for i:=1 to 10 do
        vari:=vari+1;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      i:=1;
      varproc(i);
       showmessage(inttostr(i));
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i:integer;
    begin
      i:=1;
      proc(i);
       showmessage(inttostr(i));
    end;
      

  20.   

    區別在於:
    有var時,函數或過程對參數的修改會導致實參的修改,而沒有var的修改了
    參數,但是不會修改實參的值。
      

  21.   

    procedure EditMeAndNoSave(Value:Integer);
    begin
       inc(Value);
    end;procedure EditMeAndSave(var Value:Integer);
    begin
       inc(Value);
    end;
    ---------------------------------------
    var
       A:Integer;
       B:Integer;
    begin
       A:=10;
       B:=10;
       EditMeAndSave(A);
       EditMeAndNoSave(B);
       ShowMessage(IntToStr(A)); //'11'
       ShowMessage(IntToStr(B)); //'10'
    end;
      

  22.   

    同意chinaandys(降龙十八炒) 的看法。