******对象的引用*********(100分)

>用var:传地址
>不用:传值
错了,不用也是传地址。因为Delphi是基于“对象引用模型”的。
任何对对象变量的操作,都等于对对象指针的操作。
 
记住,一切对象皆指针:)
也就是说,对象都是传址的:)
 
没有区别。因DELPHI没复制构造函数如果我一定要传值DELPHI能做到吗?
如果我用基类指针指向派生类对象去调用基类的虚函数怎么办?如下
Type
TMyclass1=class(TComponent)
private
public
procedure showNumber;virtual;
end;
TMyclass2=class(TMyclass1)
public
procedure showNumber;override;
end;
{$R *.DFM}

{ TMyclass1 }

procedure TMyclass1.showNumber;
begin
showmessage('1');
end;

{ TMyclass2 }

procedure TMyclass2.showNumber;
begin
showmessage('2');
end;

procedure loadShow(x:TMyclass1);
begin
x.showNumber;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
h:TMyclass1;
begin
h:=TMyclass2.Create(self);
loadShow(h)
//结果是显示2,也就是说它调的是子类函数
//在C++中这样调的话是调用基类的函数(基类指针指向派生类对象)
h.free;
end;
 
呵呵!这个问题,大家讨伦了这么久,有谁真的去写过代码测试过啊!
 
大家来看看在过程中传递对象时用Var与不用Var有什么不同.
先做以下的试验:
1、传一个存在的对象
procedure TForm1.Button1Click(Sender: TObject);
begin
ChanageCap(Button1);
ShowMessage(Button1.Caption)
// 这里还是Button1,指向的Button 对象没有变,
                // 但属性改变了
end;
procedure TForm1.ChanageCap(Button: TButton);
begin
Button.Caption := 'Before'
// 这里改变了Button1的属性
Button := Button2
// 改变引用,引用Button2
Button.Caption := 'After'
// Button2的属性也改变了
end;
//-----------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
ChanageCap(Button1);
ShowMessage(Button1.Caption)
// 注意这里!!Button1现在指向了的对象是Button2;
// Button1指向的对象改变了
end;
procedure TForm1.ChanageCap(var Button: TButton);
begin
Button.Caption := 'Before'
// 这里改变了Button1的属性
Button := Button2
// 改变引用,引用Button2
Button.Caption := 'After'
// Button2的属性也改变了
end;

2、传一个不存在的对象
procedure TForm1.Button1Click(Sender: TObject);
var
B: TButton;
begin
ChanageCap(B)

B.Left := 100
// 出错!
end;

procedure TForm1.ChanageCap(Button: TButton);
begin
Button := TButton.Create(Self);  // 新建一个Button
Button.Parent := Self;
Button.Caption := 'Before';
//Button := Button2;
//Button.Caption := 'After';
end;
//------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
B: TButton;
begin
ChanageCap(B)

B.Left := 100
// 正常!
end;

procedure TForm1.ChanageCap(var Button: TButton);
begin
Button := TButton.Create(Self);  // 新建一个Button
Button.Parent := Self;
Button.Caption := 'Before';
//Button := Button2;
//Button.Caption := 'After';
end;

在Delphi中所有的对象都是指标,传一个对象给过程,是将这个这个对象的地址
传给了过程.大家该知道这个地址保存在哪里吧!就是在这个对象的变量中.这个
变量其实就是一个Pointer类型,他的值就是这个对象的地址。
在传值过程中,还是将变量的值Copy了一份给过程,只是这里不是整个对象,
而只是对象的地址。如果改变这个地址值使其指向别的对象并不会使原来变量的
引用改变!传址确把这个变量的地址传过了过程,如果改变了这个变量
的值使其指向别的对象的地址,也就影响了原来的变量所引用的对象
所以在对象传递过程中对象实例要不要先存在是没关系的,不过在必要的地方
判断这个变量所引用的对象是否存在是需要的,他的传递的方式也跟
其它数据类型是一样!
 
同意:fssky。
 
类变量是指针,所以传质和传地址方式差不多。传过去的都是对象在内存中的位置,值是一样的。
而对象变量身后的“.”相当于“^.”就好理解了。
例如
A.Name;//A是一个类变量
可以理解成
A^.Name;//A是一个类变量
 
顶部