1、句柄悬空
在声明句柄和创建对象以后,句柄是悬空的,在仿真没开始时内容为null。但是对于结构体和module的例化,仿真开始之前变量就给了一个不确定的值(32'hxxxx)
但是对于放在initial块里面的,在仿真之前,即使是结构体内的变量,仿真之前也不会给值
Value表示句柄c1指向的类是packet_c,@1表示这里是例化第一次
2、类的空间
上述程序一共会产生100个实例,最后c1指向的实例是最后一个实例,前面99个实例找不回来。因为类的对象是动态的,当没有任何一个句柄指向该对象时,该对象所占据的空间就被回收了(自动回收)
3、类的索引
43行虽然还没有例化c1,c2两个对象,但是可以找到data的值,因为data是静态变量,他的空间开辟在类下面,而不是某个变量下面。当然,更加规范的访问方法是使用
但是,类里面的对象,成员变量和方法默认都是动态的,例化的模块(module)是静态的。
同时还可以使用this来索引当前对象的成员。如下,this.x代表的是类里面的x,即1,而不是参数x2
变量的索引遵循就近原则。
同时还可以使用super来索引父类的变量
4、类的拷贝
Tansaction t1,t2; t1 = new(); t2 = new t1;
SV里面的拷贝都是浅拷贝。浅拷贝是拷贝了对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化;深拷贝是另外申请了一块内存,内容和原对象一样,更改原对象,拷贝对象不会发生变化。
5、类的继承
子类既继承父类的变量,也继承父类的方法,所以下属程序运行结果,p.i和 lp.i都是2
如果子类和父类拥有同名的方法或者函数,则在调用子类的该方法或者函数时,只会执行子类的
例子(重要!):
(1)
(2)
(3)
(4)
lp.i等于12,因为12行子类的 i 为,而12行super.shift只对父类的i进行操作。20行只对子类的i进行操作。
当子类和父类拥有相同的成员变量和方法时,想在子类里面调用父类的变量方法,一定要加super.
所以不要尝试子类与父类使用同名的变量
6、父类句柄与子类句柄的复制
子类句柄复制给父类句柄,经过复制后父类的句柄指向子类的对象,但是其能够访问的范围只有父类的范围。但是子类可以访问父类的方法和对象。
父类的句柄不能直接复制给子类句柄。
视频参看V0选学第七周类的继承1,2
7、对象的复制
输出结果分别为200,200,300,300.。对,没错,wr.def也为300。这是因为h = wr时句柄的复制,所以h.def = 300是对这两个句柄指向的共同对象做成员变量的赋值