一、概述
在 SystemVerilog 中,new
是一个构造函数,用于创建类的实例(即对象)。它在面向对象编程(OOP)中起着重要作用,负责实例化一个对象并进行初始化。与传统编程语言(如 C++ 或 Java)中的构造函数类似,new
用来初始化对象的成员变量或执行必要的准备工作。
SystemVerilog 类的 new
构造函数通常用于创建一个类的对象实例。它有以下特点:
语法:
class_name new();
或class_name new(input_args);
作用:在创建类的对象时,
new
方法用来执行对象的初始化操作。初始化:
new
可以在类实例化时对类的成员变量进行初始化。
二、基本结构
构造函数与普通的方法不同,它通常没有返回值(并且不需要显式地写出 return
)。new
作为一个方法,通常会接受一些参数来初始化类的成员变量。
class MyClass;
// 成员变量
int a;
string name;
// 构造函数
function new(int a_value, string name_value);
a = a_value;
name = name_value;
endfunction
endclass
三、使用
在 SystemVerilog 中,类的实例化(即对象创建)并不会自动调用 new
构造函数;需要显式地调用 new
来创建对象并初始化它们。
3.1 对象的显式创建
类的对象(即类的实例)需要显式调用 new
构造函数进行初始化。这和许多面向对象编程语言(如 C++、Java)相似。
class MyClass;
int a;
string name;
function new(int a_value, string name_value);
a = a_value;
name = name_value;
endfunction
endclass
MyClass obj; // 声明对象
obj = new(10, "Test"); // 显式调用构造函数
3.1.1 为什么需要显式调用 new
?
SystemVerilog 的类是动态分配的,它们并不像传统的C语言或者 Verilog 中的 struct
或 module
那样具有静态大小。因此,为了确保类的对象正确地创建和初始化,必须显式调用 new
来分配内存,并进行初始化。
3.1.2 new
的作用
内存分配:
new
构造函数会为类的对象分配内存空间。这是因为类的对象是动态创建的,并不直接存储在栈上,而是存储在堆中。初始化成员变量:
new
方法通常用于初始化类的成员变量。你可以在new
构造函数中设置初始值,确保对象创建时处于有效的状态。继承时的构造函数调用:如果类是从其他类继承而来,子类的
new
方法通常会显式调用父类的new
方法,以确保父类成员得到正确初始化。
3.2 自动调用的情况
3.2.1 默认构造函数
如果类没有显式定义 new
构造函数,那么 SystemVerilog 会自动提供一个默认构造函数,这个默认构造函数会将类的所有成员变量初始化为默认值(如数字类型初始化为 0
,字符串类型初始化为空字符串等)。但即便如此,您仍然需要显式地实例化类的对象。
例如,如果没有显式定义 new
,SystemVerilog 会自动创建一个默认构造函数:
class MyClass;
int a; // 默认为 0
string name; // 默认为 ""
endclass
MyClass obj; // 使用默认构造函数
在这种情况下,obj
会被创建,并且其成员 a
会被初始化为 0
,name
会被初始化为空字符串 ""
。
3.2.2 动态创建对象
对象的动态创建是通过显式调用 new
来完成的。SystemVerilog 允许通过 new
来动态分配内存并初始化对象。没有 new
的话,类的对象会是一个句柄(或者空指针 null
),并且无法使用。
MyClass obj; // 仅声明对象,但未创建
obj = new(); // 通过 new 创建对象
3.3 继承与 new
class ParentClass;
int a;
function new(int a_value);
a = a_value;
endfunction
endclass
class ChildClass extends ParentClass;
string name;
function new(int a_value, string name_value);
super.new(a_value); // 显式调用父类的构造函数
name = name_value;
endfunction
endclass
// 实例化时显式调用 new
ChildClass obj = new(10, "ChildTest");
在这个例子中,ChildClass
的 new
构造函数会显式调用父类 ParentClass
的 new
构造函数,并在初始化过程中设置 name
成员。
四、总结
在 SystemVerilog 中,new
是类的构造函数,用于显式创建对象并初始化其成员变量。对象的创建必须通过调用 new()
,并且可以使用带参数的 new
来传递初始化值。new()
会在堆上分配内存并执行初始化操作,确保对象的成员变量得到正确的初始值。尽管类可以定义多个构造函数,new
方法的调用总是与对象的动态内存分配紧密相关,且在实例化时自动触发。