1.浅层拷贝(shallow copy)
packet p1,p2;
p1 = new;
p2 = new p1;
如上所示,p1创建一个对象后,p2对p1经行了浅层拷贝,相当于p2也创建了一个对象只不过该对象的属性与p1都相同。值得注意的是如果p1的对象中包含类的嵌套,那么p2不能拷贝嵌套类里的属性。
class Header;
int addr;
function new(int addr);
this.addr = addr;
endfunction
endclass
class packet;
int data ;
string name ;
Header header; //将header类嵌套在packet类中
function new(string name,int data,addr);
header = new(addr);
this.data = data;
this.name = name;
endfunction
function display();
$display("\n name:%0s, data = %0d,addr = %0d\n",name,data,header.addr);
endfunction
endclass
module tb;
packet p1,p2;
initial begin
p1 = new("pl",10,1);
p2 = new p1; //浅层拷贝p1到p2,并打印显示p1,p2
p1.display;
p2.display;
p1.name = "larry"; //改变p1里面的string变量和int 变量
p1.data = 11;
p1.header.addr = 2; //改变p1里嵌套类的int变量,打印
p1.display;
p2.display;
p2.name = "larry_pl"; //改变p2里string和int变量
p2.data = 12;
p2.header.addr = 3; //改变p2里嵌套类的int变量,打印
p1.display;
p2.display;
end
endmodule
Sim log
当p2完成对p1的浅层拷贝之后,p1对象变量的变化与p2对象变量的变化互不影响。但浅层拷贝没有直接拷贝嵌套类里的变量,而是使得p2指向了嵌套的类。所以当改变p1嵌套类里的变量时,p2中嵌套类里的变量也会改变。
2.深层拷贝(deep copy)
packet p1,p2;
p1 = new;
p2 = new;
p2.copy(p1);
如上所示,p2对p1进行了深度拷贝,p1对象里所有的属性包括嵌套类的属性都被p2所拷贝。其中copy函数是在packet类中用户自定义的函数。值得注意的是,在对p1拷贝之前应该先对p2创建一个对象。
class Header;
int addr;
function new(int addr);
this.addr = addr;
endfunction
endclass
class packet;
int data ;
string name ;
Header header;
function new(string name,int data,addr);
header = new(addr);
this.data = data;
this.name = name;
endfunction
function copy(packet p);//用户自定义copy函数
this.data = p.data;
this.name = p.name;
this.header.addr = p.header.addr;
endfunction
function display();
$display("\n name:%0s, data = %0d,addr = %0d\n",name,data,header.addr);
endfunction
endclass
module tb;
packet p1,p2;
initial begin
p1 = new("pl",10,1);
p2 = new("a",0,0);
p2.copy(p1);//深度拷贝给p2,打印
p1.display;
p2.display;
//改变p1对象变量与嵌套类的变量,打印
p1.name = "larry";
p1.data = 11;
p1.header.addr = 2;
p1.display;
p2.display;
end
endmodule
Sim log
当调用用户自定义的copy函数时,因为在copy函数中定义了如下语句,对嵌套类的变量也进行了拷贝,所以当改变p1对象中嵌套类变量的值时,p2中该变量的值不会改变。
this.header.addr = p.header.addr;