delphi中如何实现深拷贝?
对象是类的动态实例,对象总是被动态分配到堆上。因此一个对象引用就如
同一个指针。当你分配一个对象引用给一个变量时,Delphi仅复制引用,而不是
整个对象。要实现所谓的“深拷贝”,即拷贝整个对象,在TPersistent类系下
的对象可以通过Assign方法,如果对象所在的类没有Assign方法例如TObject类
,可以把原始对象成员变量所在内存段的内容拷贝到被拷贝对象成员变量对应的
内存中。两种实现方法的程序如下:
程序1
type
TMyClass = class (TPersistent)
public
Fdata1:integer;
Fdata2:integer;
Fdata3:integer;
procedure Assign(Source: TPersistent); override ;
end ;
var
class1,class2:TMyClass;
implementation
procedure TMyClass.Assign(Source: TPersistent);
begin
Fdata1: = (source as TMyClass).Fdata1 ;
Fdata2: = (source as TMyClass).Fdata2 ;
Fdata3: = (source as TMyClass).Fdata3 ;
end ;
begin
class1: = TMyClass.create;
class1.Fdata1: = 123 ;
class1.Fdata2: = 456 ;
class1.Fdata3: = 789 ;
class2: = TMyClass.create;
class2.Assign(class1);
if ( @class1.Fdata1 = @class2.Fdata1)
then showmessage( ' equal ' ) ;
end .
TMyClass = class (TPersistent)
public
Fdata1:integer;
Fdata2:integer;
Fdata3:integer;
procedure Assign(Source: TPersistent); override ;
end ;
var
class1,class2:TMyClass;
implementation
procedure TMyClass.Assign(Source: TPersistent);
begin
Fdata1: = (source as TMyClass).Fdata1 ;
Fdata2: = (source as TMyClass).Fdata2 ;
Fdata3: = (source as TMyClass).Fdata3 ;
end ;
begin
class1: = TMyClass.create;
class1.Fdata1: = 123 ;
class1.Fdata2: = 456 ;
class1.Fdata3: = 789 ;
class2: = TMyClass.create;
class2.Assign(class1);
if ( @class1.Fdata1 = @class2.Fdata1)
then showmessage( ' equal ' ) ;
end .
程序2
type
TMyClass = class (TObject)
Fdata1:integer;
Fdata2:integer;
Fdata3:integer;
end ;
var
Form1: TForm1;
class1,class2:TMyClass;
PC1,PC2:PChar;
implementation
begin
class1: = TMyClass.create;
class1.Fdata1: = 123 ;
class1.Fdata2: = 456 ;
class1.Fdata3: = 789 ;
class2: = TMyClass.create;
PC1: = Pointer(Integer(class1) + 4 ); // class1数据开始地址
PC2: = Pointer(Integer(class2) + 4 ); // class2数据开始地址
System.Move(PC1^,PC2^,TMyClass.InstanceSize - 4 ); // 整体复制数据
if ( @class1.Fdata1 = @class2.Fdata1)
then showmessage( ' equal ' ) ;
end .
TMyClass = class (TObject)
Fdata1:integer;
Fdata2:integer;
Fdata3:integer;
end ;
var
Form1: TForm1;
class1,class2:TMyClass;
PC1,PC2:PChar;
implementation
begin
class1: = TMyClass.create;
class1.Fdata1: = 123 ;
class1.Fdata2: = 456 ;
class1.Fdata3: = 789 ;
class2: = TMyClass.create;
PC1: = Pointer(Integer(class1) + 4 ); // class1数据开始地址
PC2: = Pointer(Integer(class2) + 4 ); // class2数据开始地址
System.Move(PC1^,PC2^,TMyClass.InstanceSize - 4 ); // 整体复制数据
if ( @class1.Fdata1 = @class2.Fdata1)
then showmessage( ' equal ' ) ;
end .