在托管堆上分配对象实例,似乎是使用托管扩展C++、C#、J#、VB.NET程序员的唯一方法,而使用本地C++的程序员,不但可以在堆上分配内存,甚至更惯于使用基于堆栈的对象实例。
现在回顾一下以前定义的Point引用类,再来看一下以下变量定义:
Point p1, p2(3,4);
从本地C++的角度来说,p1与p2应为基于堆栈的引用类Point实例,哪怕是从一般性的角度来看,它们也是。P1由默认的构造函数初始化,而p2由接受x与y坐标的构造函数初始化。从实现上来看,Point是自包含类型的(也就是说,它不包含任何指针或句柄),然而,作为一个引用类的实例,它仍处于CLI运行时的掌控之下,且在必要时,会被垃圾回收--正因为此,所以不能定义一个引用类的静态或全局实例。
同时,也不能将sizeof应用于指明是引用类实例的表达式,因为sizeof是在编译时进行计算的,而Point对象的大小要直到运行时才能确定;但是,可将sizeof应用于句柄,因为它的大小在编译时就已经确定了。
另外,还不能定义一个基于堆栈的CLI数组实例。
跟踪引用
本地C++可通过&来定义一个对象的别名,例如,对任意本地类N,可编写如下代码:
N n1;
N& n2 = n1;
引用必须在定义时进行初始化,且在整个生命期中,它们都锁定于引用同一对象,也就是说,它的值不会改变。引用一个引用类的实例与引用一个本地类基本一致,只不过语法不同而已。
在程序执行期间,引用类的实例会在内存中"移动",所以,需要对它们进行跟踪,而本地指针与引用却不能够胜任这项工作(尤其指不能对一个引用类的实例使用取地址符&),因此,C++/CLI对应地提供了句柄及用于跟踪的引用--在此简称为跟踪引用(Tracking References),例如,你可以定义一个跟踪引用p3,以追踪对象p2:
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!