C++/CLI解析之基于堆栈的对象与跟踪引用

在托管堆上分配对象实例,似乎是使用托管扩展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:

时间: 2024-10-04 00:04:01

C++/CLI解析之基于堆栈的对象与跟踪引用的相关文章

技术解析:基于Perl的VMWare虚拟机管理

本文讲的是 :  技术解析:基于Perl的VMWare虚拟机管理  , [IT168技术]众所周知,VMWare在虚拟化和云计算基础架构领域处于全球领先地位,所提供的经客户验证的解决方案可通过降低复杂性以及更灵活.敏捷地交付服务来提高IT效率.而旗下的VMWare vSphere是一整套虚拟化应用产品,它包含VMWare ESX Server.VMWare Virtual Center.VMotion,以及例如VMWare HA.VMWare DRS和VMWare统一备份服务等分布式服务.它提供

Yii基于数组和对象的Model查询技巧实例详解_php实例

本文实例讲述了Yii基于数组和对象的Model查询技巧.分享给大家供大家参考,具体如下: 对于一个Model Post 有如下的4中查询方法,返回对象或者对象数组. //查找满足指定条件的结果中的第一行 find the first row satisfying the specified condition $post=Post::model()->find($condition,$params); //查找具有指定主键值的那一行 find the row with the specified

解析Java中的String对象的数据类型

  解析Java中的String对象的数据类型     [摘要] 本文将全面解析Java中的String对象的数据类型.[关键字] Java 技巧   1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. new String()和new String("")都是申明一个新的空字符串,是空串不是null: 3. String str="

JavaScript 基于原型的对象(创建、调用)_js面向对象

JavaScript中的对象有三种 1,内部对象 如Array,Boolean,Data,Math,Number,Object,RegExp,String对象等 这些对象系统给我们提供了各自的属性与方法供调用. 2,基于类的对象 用类的方式实现对象的引用,这些类需要我们自己定义 3,基于原型的对象 提供有关如何使用 JavaScript 基于原型的对象模型的指南,并且提供指向特定信息的链接,这些信息描述基于原型的对象的自定义构造函数和继承. 在我们写js代码的时候,内部对象是不可避免的要引用,但

在JSP页面获取后台action封装的参数,这个参数里面又含有两个对象,二层引用,报错

问题描述 在JSP页面获取后台action封装的参数,这个参数里面又含有两个对象,二层引用,报错 javax.el.PropertyNotFoundException: Property 'userAccount' not found on type java.lang.String 上面是报错信息, 下面是JSP页面: 用户名: ${commentlist.userAccount.userName } 职业: ${commentlist.userAccount.job } ${commentl

从对象创建和引用小议解耦

简介:解耦是软件设计领域中一个永恒不变的话题,在软件设计过程中,为了最大程度降低各个应用 组件之间的耦合性,以提高其可维护性和可复用性,出现了诸多设计原则和解决方案.例如面向接口编程 ,开 - 闭原则,依赖倒转原则等,另外更出现一系列设计模式.同时,由于如何实现解耦涉及面相当广 ,大至组件的划分和关联,小至对象的创建和引用,往往使软件开发人员感到迷惑.本文将从对象创建和 引用的角度出发,介绍常见的一些解决方案,并比较之间的差别,期望读者能从一个侧面加深对解耦概念 的理解. 应用场景 为方便后续介

【C/C++学院】0820-Nullptr/const对象/类指针引用以及mallocfree与newde/类重载运算符/QT加法重载/类的重载赋值运算/自增在前在后差别/赋值重载深浅拷贝/重载下标

Nullptr #include<iostream> void go(int num) { std::cout << "gonum" << std::endl; } void go(void *p) { std::cout << "gop" << std::endl; } void main() { //void *p = nullptr; void *p = NULL;//C++是强类型,严格的类型检查

C++中对象的常引用、动态建立和释放相关知识讲解_C 语言

C++对象的常引用 我们知道,一个变量的引用就是变量的别名.实质上,变量名和引用名都指向同一段内存单元. 如果形参为变量的引用名,实参为变量名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间(常称为建立实参的一个拷贝), 而是把实参变量的地址传给形参(引用名),这样引用名也指向实参变量. [例] 对象的常引用. #include <iostream> using namespace std; class Time { public: Time(int,int,int); int

详解C++编程中类的声明和对象成员的引用_C 语言

C++类的声明和对象的创建 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化.每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数. 与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间.而对象是类这种数据类型的一个变量,占用内存空间. 类的声明 类是用户自定义的类型,如果程序中要用到类,必须先进行声明,或者使用已存在的类(别人写好的类.标准库中的类等),C++语法本身并不提供现成的类的名称.结构和内容. 一个简