📄 00872.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>第十一章 类</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<meta name="generator" content="Doc-O-Matic" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="STYLESHEET" href="default.css" type="text/css" />
<script type="text/javascript" src="scripts.js"></script>
</head>
<body class="Element700" onload="onBodyLoadEx('systemverilog31a.html', 'topic', '00872.html');" onmousedown="onBodyMouseDown();">
<!-- Begin Popups -->
<div class="Element801" id="popup00188">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00924.html" target="topic">主题</a></div>
</div>
</div>
</div>
<!-- End Popups -->
<!-- Begin Page Header -->
<div class="Element710" id="areafixed">
<div class="Element92">
<table width="100%" cellspacing="0" cellpadding="0">
<tr><td width="33%">
<div class="Element1">
<a href="#" onmousedown="showPopup(this, 'popup00188');"><img src="seealsolink.png" border="0" alt="" title=""></a> SystemVerilog 3.1a语言参考手册</div>
</td><td width="34%">
<div class="Element2">
</div>
</td><td width="33%">
<div class="Element90">
<a href="00011.html" target="topic"><img src="btn_prev_lightblue.gif" border="0" alt="Previous" title="Previous" onmouseover="switchImage(this, 'btn_prev_lightblue_hover.gif');" onmouseout="switchImage(this, 'btn_prev_lightblue.gif');"></a><img src="btn_up_d.gif" border="0" alt="Up" title="Up"><a href="00012.html" target="topic"><img src="btn_next_lightblue.gif" border="0" alt="Next" title="Next" onmouseover="switchImage(this, 'btn_next_lightblue_hover.gif');" onmouseout="switchImage(this, 'btn_next_lightblue.gif');"></a></div>
</td></tr></table><div class="Element5">
第十一章 类</div>
</div>
</div>
<!-- End Page Header -->
<!-- Begin Client Area -->
<div class="Element720" id="areascroll">
<div class="Element721">
<!-- Begin Page Content -->
<div class="Element58">
<a name="主题"></a><div class="Element14">
<a onclick="toggleVisibilityStored('主题');" class="a_Element14"><img src="sectionminus.png" border="0" alt="" title="" id="img主题">主题</a></div>
<div id="div主题">
<div class="Element11">
<div class="Element10">
<div class="Element212">
<div class="TableDiv">
<table cellspacing="0" class="Table0">
<tr>
<td class="Element200" valign="top" width="50%">
<div class="Element201">
主题 </div></td><td class="Element204" valign="top" width="50%">
<div class="Element205">
描述 </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00012.html" target="topic">11.1 简介</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
SystemVerilog引入了一个面向对象的类数据抽象。类允许对象动态地产生、删除、赋值、以及通过对象句柄访问。对象句柄为语言提供了一种安全的、类似于指针的机制。类提供了继承和抽象建模的能力,这就将不带有任何类型安全性问题的C函数指针的优点引入到了SystemVerilog中,因此,它为Verilog带来了真正的多态性。 </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00023.html" target="topic">11.2 语法</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
</div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00031.html" target="topic">11.3 概述</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
类是一种数据类型,它包含了数据以及对数据进行操作的子程序(函数和任务)。类的数据被称为类属性,它的子程序被称为方法,无论是类属性还是方法都是类的成员。类属性和方法结合在一起,定义了某种类型的对象的内容和能力。<br><br>例如,一个数据包可以是一个对象。它可能具有一个命令域、一个地址、一个序列号、一个时戳、以及一个数据包净荷。另外,一个数据包可以实现多项不同的任务:初始化数据包、设置命令、读取数据包的状态、或者检查序列号。尽管每一个数据包都是不同的,然而作为一个类,数据包具有某些固有的属性,这些固有属性可以在类的定义中进行说明。 </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00032.html" target="topic">11.4 对象(类实例)</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
类定义了一个数据类型。对象是类的实例。在使用一个类的时候,需要首先声明一个类型为该类的变量(这个变量保存了一个对象句柄),然后使用<span style="color: #0000FF">new</span>函数产生该类的一个对象,然后再将它赋值给变量。 </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00033.html" target="topic">11.5 对象属性</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
一个对象的数据域可以通过将类属性名限定到一个实例名的方法来使用。继续使用先前的例子,Packet对象p的命令域可以按如下方式使用: </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00034.html" target="topic">11.6 对象方法</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
我们可以使用与访问类属性相同的语法来访问一个对象的方法: </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00035.html" target="topic">11.7 构造器</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
SystemVerilog没有要求C++那样的复杂的内存分配和释放。一个对象的构造是直接的,并且碎片收集象Java中那样是隐含的并且是自动的。它没有内存泄漏或其它微妙的行为,而这些往往成为C++程序员的噩梦。<br><br>SystemVerilog提供了一种机制在产生对象的时候初始化一个实例。当对象被产生的时候,例如: </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00036.html" target="topic">11.8 静态类属性</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
前面的例子仅仅声明了实例类属性。每一个类的实例(也就是Packet类型的每一个对象)的每一个变量都有它自己的拷贝。有时要求所有的实例共享变量的一个版本。这些类属性使用关键字static产生。下面的例子演示了一个类的所有实例需要访问一个共用的文件描述符的情况: </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00037.html" target="topic">11.9 静态方法</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
方法也可以被声明成静态的。一个静态方法遵从于所有的类范围和访问规则,但在表现上它就像一个常规的子例程一样可以在类的外部被调用,即使没有该类的实例。一个静态方法不能访问非静态的成员(类属性和方法),但它可以直接访问静态类属性或调用同一个类的静态方法。在一个静态方法体内部访问非静态成员或访问特殊的this句柄是非法的,并且会导致一个编译错误。静态方法不能是虚拟的。 </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00013.html" target="topic">11.10 this</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
<span style="color: #0000FF">this</span>关键字被用来明确地引用当前实例的类属性或类方法。<span style="color: #0000FF">this</span>关键字指示了一个预定义的对象句柄,这个句柄引用了被用来调用<span style="color: #0000FF">this</span>在其中使用的子例程的对象。<span style="color: #0000FF">this</span>关键字应该仅仅使用在非静态的类方法中,否则会发布一个错误。例如,下面的声明是一个用来编写初始化任务的基本方法: </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00014.html" target="topic">11.11 赋值、重命名与拷贝</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
声明一个类变量仅仅产生一个名字,这个名字表示了一个对象。因此: </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00015.html" target="topic">11.12 继承与子类</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
前一节定义了一个称为<i>Packet</i>的类。我们可以扩展这个类以便使<i>packet</i>串接在一起形成一个链表。一种解决方案是产生一个新的被称为<i>LinkedPacket</i>的类,它包含一个类型为<i>Packet</i>的变量:<i>packet_c</i>。<br><br>为了引用<i>Packet</i>类属性,需要引用变量<i>packet_c</i>。 </div></td></tr><tr>
<td class="Element202" valign="top" width="50%">
<div class="Element203">
<a href="00016.html" target="topic">11.13 过载成员</a> </div></td><td class="Element206" valign="top" width="50%">
<div class="Element207">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -