SV,class学习笔记四,copying

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值