Systemverilog-- OOP--对象的拷贝
目录
浅拷贝:
Packet p1;
Packet p2;
p1 = new;
p2 = new p1;

在创建p2对象时,将从p1拷贝其成员变量例如 interger,string和句柄等,这种拷贝方式称为浅拷贝(shallow copy)。
定义拷贝函数:
如果要拷贝对象,指的是首先创建一个新的对象(开辟新的空间),再将目标对象的成员变量拷贝给新对象的成员,使新对象与目标对象的成员变量数值保持一致,即完成了对象的拷贝(成员变量的拷贝)
例如如下的代码:
class basic_test; //父类
...
virtual function void copy_data(basic_test t);
t.def = def;
t.fin = fin;
endfunction
virtual function basic_test copy();
basic_test t = new(0);
copy_data(t);
return t;
endfunction
endclass
class test_wr extends basic_test; //子类
...
function void copy_data(basic_test t); //子类与父类的形参要相同,故 t 是父类句柄
test_wr h; // h 是子类句柄
super.copy_data(t); // 调用父类的copy_data()函数
$cast(h,t); //这把父类句柄转化为子类句柄,指向子类对象
h.def = def;
endfunction
function basic_test copy();
test_wr t = new(); // t是子类句柄,指向子类对象
copy_data(t); // copy_data里面的参数是父类句柄,这里有一个隐式转换,子类句柄转换为父类句柄,故 t 是父类句柄,指向子类对象
return t; // 这返回的还是父类句柄
endfunction
endclass

copy_data函数: 只拷贝变量,把当前的变量def/fin, 传递给t所指的新对象的成员变量,
copy函数:创建一个对象,然后调用copy_data()对里面的成员变量做赋值,最后返回该对象的句柄
拷贝函数总结:
1)将成员拷贝函数copy_data() 和新对象生成函数copy() 分为两个方法,这样使得子类继承和方法复用较为容易。
2)为了保证父类和子类的成员均可以完成拷贝,将拷贝方法声明为虚方法,且遵循只拷贝该类的域成员的原则,父类的成员拷贝应由父类的拷贝方法完成。
3)在实现copy_data() 过程中,应该注意句柄的类型转换,保证转换后的句柄可以访问类成员变量
Systemverilog-- OOP--对象的拷贝的更多相关文章
- java提高篇(六)-----使用序列化实现对象的拷贝
我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性能的提升非常 ...
- [改善Java代码] 推荐使用序列化实现对象的拷贝
建议44: 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题,实现Cloneable接口就具备了拷贝能力,那我们来思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何 ...
- java提高篇(五)-----使用序列化实现对象的拷贝
我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性 ...
- java对象深度拷贝
如何利用序列化来完成对象的拷贝呢?在内存中通过字节流的拷贝是比较容易实现的.把母对象写入到一个字节流中,再从字节流中将其读出来,这样就可以创建一个新的对象了,并且该新对象与母对象之间并不存在引用共享的 ...
- JS有关引用对象的拷贝问题
JS中有关引用对象的拷贝问题 问题描述:在开发过程中,拷贝一个对象数组给另一个数组的时候,改变新数组中对象的属性值,原数组中的对象属性值也跟着改变了. 例如新定义一个数组arr1,里面有两个对象,然后 ...
- OC学习篇之---对象的拷贝
在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来 ...
- JS对象的引用,对象的拷贝
目录 一.场景 二.浅拷贝 三.深拷贝 一.场景 除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝 将一个对象赋值给另外一个对象. var a = [1,2,3]; ...
- jvm源码解读--15 oop对象详解
(gdb) p obj $15 = (oopDesc *) 0xf3885d08 (gdb) p * obj $16 = { _mark = 0x70dea4e01, _metadata = { _k ...
- jvm源码解读--09 创建oop对象,将static静态变量放置在oop的96 offset处 第二篇
先打断点systemDictionary.cpp 1915行 Universe::fixup_mirrors(CHECK); 进入 void Universe::fixup_mirrors(TRAPS ...
- 《java基础——对象的拷贝》
java基础--对象的拷贝 一.浅拷贝: 规则: 1. 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化. 2. 浅拷贝相当于两个对象共用一套实例. 格式: 类名 对象 ...
随机推荐
- 2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机)
2021.11.10 P5231 [JSOI2012]玄武密码(AC自动机) https://www.luogu.com.cn/problem/P5231 题意: 给出字符串S和若干T,求S与每个T的 ...
- HTML5的基本功能
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- C++逆向 可变参数Hook
目录 C++逆向 可变参数Hook 0x00 前言: 0x01 C++可变参数: 可变参数简介 可变参数代码实战 0x02 逆向分析C++可变参数原理 0x03 printf Hook实战 Pwn菜鸡 ...
- echarts基本使用与注意事项
npm 安装echarts npm install echarts -D 使用流程 1. 引入echarts,并配置成全局方法 vue2 import * as echarts from 'echar ...
- windodws pyusb hub端口对应连接的usb设备
源码: 1 #!/usr/bin/python 2 import sys 3 import usb.core 4 # find USB devices 5 dev = usb.core.find(fi ...
- IOC创建对象的方式
1,采用无参构造创建(默认) 2,假设我们要使用有参构造创建对象 (1)下标赋值 <!--第一种 下标赋值 --><bean id="user" class=&q ...
- 基于STM32+华为云IOT设计智能称重系统
摘要:选择部署多个重量传感器和必要的算法.通过WiFi 通信模块.GPS定位模块,采集车辆称重数据一地理位置信息,并通过网络发送至云平台,设计图形化UI界面展示称重.地图位置等重要信息,实现对称重系统 ...
- Centos7上安装python3.7
Centos7安装python3.7 由于python2和python3在很大程度上有些不同,因为需要,就以决定安装python3.x的版本,但由于Centos上自安装的就是pyhton2.6.所以在 ...
- SpringMVC和spring集成
步骤:1.web.xml中配置spring的监听和spring配置文件位置 2.编写spring类并在spring的配置文件里配置bean 说明:源码中spring核心配置文件导入springAnno ...
- 929. Unique Email Address - LeetCode
Question 929. Unique Email Address Solution 题目大意: 给你一个邮箱地址的数组,求出有多少个不同的地址,其中localName有如下规则 加号(+)后面的字 ...