SystemVerilog学习——构造函数new

一、概述

        在 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
endclassMyClass obj;  // 声明对象
obj = new(10, "Test");  // 显式调用构造函数

3.1.1 为什么需要显式调用 new

        SystemVerilog 的类是动态分配的,它们并不像传统的C语言或者 Verilog 中的 structmodule 那样具有静态大小。因此,为了确保类的对象正确地创建和初始化,必须显式调用 new 来分配内存,并进行初始化。

3.1.2 new 的作用

  1. 内存分配new 构造函数会为类的对象分配内存空间。这是因为类的对象是动态创建的,并不直接存储在栈上,而是存储在堆中。

  2. 初始化成员变量new 方法通常用于初始化类的成员变量。你可以在 new 构造函数中设置初始值,确保对象创建时处于有效的状态。

  3. 继承时的构造函数调用:如果类是从其他类继承而来,子类的 new 方法通常会显式调用父类的 new 方法,以确保父类成员得到正确初始化。

3.2 自动调用的情况

3.2.1 默认构造函数

        如果类没有显式定义 new 构造函数,那么 SystemVerilog 会自动提供一个默认构造函数,这个默认构造函数会将类的所有成员变量初始化为默认值(如数字类型初始化为 0,字符串类型初始化为空字符串等)。但即便如此,您仍然需要显式地实例化类的对象。

        例如,如果没有显式定义 new,SystemVerilog 会自动创建一个默认构造函数:

class MyClass;int a;    // 默认为 0string name;  // 默认为 ""
endclassMyClass obj;  // 使用默认构造函数

        在这种情况下,obj 会被创建,并且其成员 a 会被初始化为 0name 会被初始化为空字符串 ""

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
endclassclass 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");

        在这个例子中,ChildClassnew 构造函数会显式调用父类 ParentClassnew 构造函数,并在初始化过程中设置 name 成员。

四、总结

        在 SystemVerilog 中,new 是类的构造函数,用于显式创建对象并初始化其成员变量。对象的创建必须通过调用 new(),并且可以使用带参数的 new 来传递初始化值。new() 会在堆上分配内存并执行初始化操作,确保对象的成员变量得到正确的初始值。尽管类可以定义多个构造函数,new 方法的调用总是与对象的动态内存分配紧密相关,且在实例化时自动触发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01 最舒适的python开发环境

0 前言 我自己经过尝试,总结出python3开发环境的最舒适方式。 python3安装创建虚拟环境 venvjupyter notebook 笔记本安装vscode插件(Python, Pylance, Jupyter) 1 python3安装 ubuntu系统下安装最新版本的python3 sudo apt update sudo apt install python32 …

vue3:computed

vue3:computed 扫码或者点击文字后台提问 computed 支持选项式写法 和 函数式写法 1.选项式写法 支持一个对象传入get函数以及set函数自定义操作 2.函数式写法 只能支持一个getter函数不允许修改值的 基础示例 <template><div><div>姓&#xff1a;<i…

【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练

2024-ESWA-Diffusion-based normality pre-training for weakly supervised video anomaly detection 基于扩散的弱监督视频异常检测常态预训练摘要1. 引言2. 相关工作3. 方法论3.1. 使用扩散自动编码器进行常态学习3.2. 全局-局部特征编码器3.2.1 局部块3.2.2 全局块3.2.3 协同…

124. 二叉树中的最大路径和【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 124. 二叉树中的最大路径和 一、题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径…

跳房子(弱化版)

题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起点右侧画 n 个格子&#xff0c;这些格子都在同一条直线上。每个格子内…

qt移植到讯为rk3568,包含一些错误总结

qt移植到arm报错动态库找不到 error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环…

【开发基础】语义化版本控制

语义化版本控制 基础三级结构主版本号次版本号修正版本号 思维导图在node包管理中的特殊规则 参考文件 基础 语义化版本控制是一套通用的包/库的版本管理规范。在各类语言的包管理中都有用到&#xff0c;一般以x.x.x的形式出现在包的命名中。 三级结构 在语义化版本控制中&a…

前端导出excel表格功能

缘由 大家好&#xff0c; 最近公司在做一个类似医疗的项目&#xff0c;由于前端的开发人员有些许变故&#xff0c;而且公司暂时没有找到合适的前端开发人员。所以&#xff0c;前端开发的任务也落在了我们后端的身上。没办法&#xff0c;时间紧任务重&#xff0c;只能硬着头皮上…

Dubbo 3.x源码(25)—Dubbo服务引用源码(8)notify订阅服务通知更新

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了接口级的服务引入订阅的refreshInterfaceInvoker方法&#xff0c;当时还有最为关键的notify服务通知更新的部分源码没有学习&#xff0c;本次我们来学习notify通知本地服务更新的源码。 Dubb…

使用 Ansys Mechanical 中的“螺栓工具”插件导出螺栓反作用力

概括&#xff1a; 对于处理复杂组件和结构的工程师和分析师来说&#xff0c;提高在 Ansys Mechanical 中提取多个螺栓反作用力表格的效率至关重要。在有限元分析 (FEA) 中&#xff0c;准确确定螺栓上的反作用力对于评估机械连接的完整性和性能至关重要。但是&#xff0c;手动提…

Docker部署Kafka SASL_SSL认证,并集成到Spring Boot

1&#xff0c;创建证书和密钥 需要openssl环境&#xff0c;如果是Window下&#xff0c;下载openssl Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 还需要keytool环境&#xff0c;此环境是在jdk环境下 本案例所使用的账号密码均为&#xff1a; ka…

机器学习(基础2)

特征工程 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 特征工程API 实例化…

CSS Module:告别类名冲突,拥抱模块化样式(5)

CSS Module 是一种解决 CSS 类名冲突的全新思路。它通过构建工具&#xff08;如 webpack&#xff09;将 CSS 样式切分为更加精细的模块&#xff0c;并在编译时将类名转换为唯一的标识符&#xff0c;从而避免类名冲突。本文将详细介绍 CSS Module 的实现原理和使用方法。 1. 思…

webpack案例----pdd(anti-content)

本文章中所有内容仅供学习交流&#xff0c;相关链接做了脱敏处理&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 目标网址&#xff1a;aHR0cHM6Ly9waW5kdW9kdW8uY29tL2hvbWUvM2M 加密参数&#xff1a;anti_content 载荷里面的rn是不变的 发现加密是anti-con…

Flume1.9.0自定义Sink组件将数据发送至Mysql

需求 1、将Flume采集到的日志数据也同步保存到MySQL中一份&#xff0c;但是Flume目前不支持直接向MySQL中写数据&#xff0c;所以需要用到自定义Sink&#xff0c;自定义一个MysqlSink。 2、日志数据默认在Linux本地的/data/log/user.log日志文件中&#xff0c;使用Flume采集到…

T265相机双目鱼眼+imu联合标定(全记录)

最近工作用到t265&#xff0c;记录一遍标定过程 1.安装驱动 首先安装realsense驱动&#xff0c;因为笔者之前使用过d435i&#xff0c;装的librealsense版本为2.55.1&#xff0c;直接使用t265会出现找不到设备的问题&#xff0c;经查阅发现是因为realsense在2.53.1后就不再支持…

RT-DETR融合[CVPR2023]FasterNet种的PConv及相关改进思路

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks》 一、 模块介绍 论文链接&#xff1a;Run, Dont Walk: Chasing Higher FLOPS for Faster Neural Netwo…

【测试框架篇】单元测试框架pytest(2):用例编写

一、 前言 前面一章我们介绍了pytest环境安装和配置&#xff0c;并在pycharm里面实现了我们第一个pytest脚本。但是有些童鞋可能在编写脚本的时候遇到了问题&#xff0c;本文会讲一下我们编写pytest用例时需要遵守哪些既定的规则&#xff0c;同时这个规则也是可以修改的。 二…

嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)

引言&#xff1a;在我们的日常使用中&#xff0c;MOS就是个纯粹的电子开关&#xff0c;虽然MOS管也有放大作用&#xff0c;但是几乎用不到&#xff0c;只用它的开关作用&#xff0c;一般的电机驱动&#xff0c;开关电源&#xff0c;逆变器等大功率设备&#xff0c;全部使用MOS管…

Conda安装软件错误(Pycharm)

conda的环境变量路径错误&#xff0c;比如移动了conda的文件位置conda的python版本不适合&#xff0c;python3.10现在更适合很多库conda对cmd没有初始化&#xff0c;conda init cmd.exe