当前位置: 首页 > news >正文

沈阳建设网站公司流量平台排名

沈阳建设网站公司,流量平台排名,wordpress 滚动条,小说网站制作模板^类型 (^) 是 C/CX 最突出的功能之一——当人们第一次看到 C/CX 代码时,很难不注意到它。那么,^ 类型到底是什么?这是类型是一种智能指针类型,它自动管理 Windows 运行时对象的生命周期,也 提供自动类型转换功能以简化…
 ^类型

 (^) 是 C++/CX 最突出的功能之一——当人们第一次看到 C++/CX 代码时,很难不注意到它。那么,^ 类型到底是什么?这是类型是一种智能指针类型,它自动管理 Windows 运行时对象的生命周期,也 提供自动类型转换功能以简化 Windows 运行时对象的使用。

我们将首先讨论如何通过 WRL 使用 Windows 运行时对象,然后解释 C++/CX 帽子如何工作以使事情变得更简单。

    public interface struct IGetValue{int GetValue() = 0;};public interface struct ISetValue{void SetValue(int value) = 0;};public ref class Number sealed : public IGetValue, ISetValue{public:Number() : _value(0) { }virtual int  GetValue()          { return _value;  }virtual void SetValue(int value) { _value = value; }private:int _value;};

在这个修改后的 Number 实现中,我们定义了一对接口,IGetValue 和 ISetValue,它们声明了 Number 的两个成员函数;然后 Number 实现了这两个接口。除此之外,一切看起来应该非常熟悉。

请注意,Number 实际上实现了三个 Windows 运行时接口:除了 IGetValue 和 ISetValue 之外,编译器仍会生成 Number 实现的 __INumberPublicNonVirtuals 接口。由于 Number 的所有成员都是由显式实现的接口(IGetValue 和 ISetValue)声明的,因此编译器生成的 __INumberPublicNonVirtuals 不会声明任何成员。但是,此接口仍然是必需的,因为它是 Number 类型的默认接口。每个运行时类型都必须有一个默认接口,并且默认接口几乎始终对类是唯一的。稍后我们将看到默认接口为何如此重要。

生命周期管理

Windows 运行时引用类型使用引用计数进行对象生命周期管理。所有 Windows 运行时接口(包括 Number 实现的所有三个接口)都直接派生自 IInspectable 接口,而该接口本身又派生自 COM IUnknown 接口。IUnknown 声明了三个成员函数,用于控制对象的生命周期并允许类型转换。

MSDN对 IUnknown 生命周期管理的工作原理进行了全面概述。但原理非常简单:每当您创建对对象的新引用时,都必须调用 IUnknown::AddRef 来增加其引用计数;每当您“销毁”对对象的引用时,都必须调用 IUnknown::Release 来减少引用计数。引用计数初始化为零,在对 AddRef 和 Release 进行一系列调用后,当引用计数再次达到零时,对象将自行销毁。

当然,在使用 C++ 编程时,我们很少(实际上从不)直接调用 AddRef 和 Release。相反,我们应该尽可能地使用智能指针,在需要时自动进行这些调用。使用智能指针有助于确保对象不会因错过 Release 而泄漏,也不会因过早 Release 或 AddRef 失败而过早销毁。

ATL 包括 CComPtr 和一系列相关的智能指针,它们长期以来一直用于 COM 编程,用于自动管理实现 IUnknown 的对象的引用计数。WRL 包括 ComPtr,它是一种改进和现代化的 CComPtr(改进示例:ComPtr 不会像 CComPtr 那样重载一元 &)。

对于那些没有做过太多 COM 编程并且不熟悉 ComPtrs 的人:如果您使用过 shared_ptr(包含在 C++11、C++ TR1 和 Boost 中),ComPtr 在生命周期管理方面实际上具有相同的行为。机制不同(ComPtr 使用 IUnknown 提供的内部引用计数,而 shared_ptr 支持任意类型,因此必须使用外部引用计数),但生命周期管理行为相同。

C++/CX hat 具有与 ComPtr 完全相同的生命周期管理语义。复制 T^ 时,会调用 AddRef 来增加引用计数,而当 T^ 超出范围或被重新分配时,会调用 Release 来减少引用计数。我们可以考虑一个简单的示例来演示引用计数行为:

    {T^ t0 = ref new A();T^ t1 = ref new B();t0 = t1;t0 = nullptr;}

 首先,我们创建一个 A 对象并将其所有权赋予 t0。此 A 对象的引用计数为 1,因为有一个 T^ 引用了它。然后,我们创建一个 B 对象并将其所有权赋予 t1。此 B 对象的引用计数也是 1。

t0 = t1 的最终结果是 t0 和 t1 都指向同一个对象。这必须分三步完成。首先,调用 t1->AddRef() 来增加 B 对象的引用计数,因为 t1 正在获得该对象的所有权。其次,调用 t0->Release() 来释放 t0 对 A 对象的所有权。这会导致 A 对象的引用计数降至零,并且 A 对象会自行销毁。这会导致 B 对象的引用计数增加到 2。第三,也是最后,将 t1 设置为指向 B 对象。

然后,我们分配 t0 = nullptr。这会将 t0 “重置”为空,从而导致其释放对 B 对象的所有权。这会调用 t0->Release(),导致 B 对象的引用计数减少到 1。

最后,执行将到达块的结束括号:}。此时,所有局部变量都以相反的顺序被销毁。首先,t1 被销毁(智能指针,而不是指向的对象)。这会调用 t1->Release(),导致 B 对象的引用计数降至零,因此 B 对象会自行销毁。然后销毁 t0,这是一个无操作,因为它为空。

如果我们只关心生命周期管理,那么实际上根本不需要 ^:ComPtr<T> 足以管理对象生命周期。

类型转换

在 C++ 中,涉及类类型的某些类型转换是隐式的;其他类型转换可以使用强制转换或一系列强制转换来执行。例如,如果 Number 及其实现的接口是普通的 C++ 类型而不是 Windows 运行时类型,则从 Number* 到 IGetValue* 的转换将是隐式的,我们可以使用 static_cast 或 dynamic_cast 从 IGetValue* 转换为 Number*。

这些转换不适用于 Windows 运行时引用类型,因为引用类型的实现是不透明的,并且引用类型在内存中的布局未指定。在 C# 中实现的引用类型在内存中的布局可能与在 C++ 中实现的等效引用类型不同。因此,在直接使用 Windows 运行时类型时,我们不能依赖 C++ 语言特定的功能,例如隐式派生到基转换和强制转换。

要执行这些转换,我们必须改用 IUnknown 接口的第三个成员函数:IUnknown::QueryInterface。此成员函数可视为与语言无关的 dynamic_cast:它尝试执行到指定接口的转换并返回转换是否成功。由于每个运行时类型都实现 IUnknown 接口并为 QueryInterface 提供自己的定义,因此它可以执行任何必要的操作,以在实现它的语言和框架中获取正确的接口指针。


文章转载自:
http://dinncoclarity.knnc.cn
http://dinnconightglass.knnc.cn
http://dinncoidyllist.knnc.cn
http://dinncocontinue.knnc.cn
http://dinncodinah.knnc.cn
http://dinncopachysandra.knnc.cn
http://dinncoratbag.knnc.cn
http://dinncopneumonolysis.knnc.cn
http://dinncofainthearted.knnc.cn
http://dinncoiliac.knnc.cn
http://dinncomillyum.knnc.cn
http://dinncobirth.knnc.cn
http://dinncoallometric.knnc.cn
http://dinncorepulsive.knnc.cn
http://dinncofarmland.knnc.cn
http://dinncocabb.knnc.cn
http://dinncoanticipation.knnc.cn
http://dinncocockateel.knnc.cn
http://dinncohammy.knnc.cn
http://dinncodisuse.knnc.cn
http://dinncocryptococcosis.knnc.cn
http://dinncounbearably.knnc.cn
http://dinncopietist.knnc.cn
http://dinncoyaroslavl.knnc.cn
http://dinncoartifical.knnc.cn
http://dinncoenterotoxin.knnc.cn
http://dinncooverdrawn.knnc.cn
http://dinncolive.knnc.cn
http://dinncofasciate.knnc.cn
http://dinncomaintopmast.knnc.cn
http://dinncopotecary.knnc.cn
http://dinncosockdolager.knnc.cn
http://dinncoconnected.knnc.cn
http://dinncomonotechnic.knnc.cn
http://dinncospectropolarimeter.knnc.cn
http://dinncowhoremaster.knnc.cn
http://dinncotrimetrogon.knnc.cn
http://dinncosafest.knnc.cn
http://dinncogenetic.knnc.cn
http://dinncodatolite.knnc.cn
http://dinnconephology.knnc.cn
http://dinncoavizandum.knnc.cn
http://dinncodrawstring.knnc.cn
http://dinncoargonautic.knnc.cn
http://dinncoormuz.knnc.cn
http://dinncoobstructionism.knnc.cn
http://dinncosalamandrine.knnc.cn
http://dinncobunting.knnc.cn
http://dinncocandidate.knnc.cn
http://dinncoserendipity.knnc.cn
http://dinncoafterbeat.knnc.cn
http://dinncokwoc.knnc.cn
http://dinncoauriculate.knnc.cn
http://dinncofaddy.knnc.cn
http://dinncoenvenomization.knnc.cn
http://dinncolimy.knnc.cn
http://dinncoknowledgeability.knnc.cn
http://dinncodivestiture.knnc.cn
http://dinncoyarage.knnc.cn
http://dinncohypoglycemic.knnc.cn
http://dinncotoboggan.knnc.cn
http://dinncovirtueless.knnc.cn
http://dinncocast.knnc.cn
http://dinncodiffractometer.knnc.cn
http://dinncolengthen.knnc.cn
http://dinncokalpa.knnc.cn
http://dinncofeep.knnc.cn
http://dinncohurtlessly.knnc.cn
http://dinncouncivilized.knnc.cn
http://dinncocrossbedding.knnc.cn
http://dinncomunshi.knnc.cn
http://dinncopreallotment.knnc.cn
http://dinncoschoolcraft.knnc.cn
http://dinncocopernican.knnc.cn
http://dinncocherish.knnc.cn
http://dinncochivvy.knnc.cn
http://dinncosilo.knnc.cn
http://dinncosmokehouse.knnc.cn
http://dinncoincite.knnc.cn
http://dinncocockup.knnc.cn
http://dinncoamyotrophy.knnc.cn
http://dinncolampers.knnc.cn
http://dinncoicelus.knnc.cn
http://dinncotelelens.knnc.cn
http://dinncoplain.knnc.cn
http://dinncofondness.knnc.cn
http://dinncofrailly.knnc.cn
http://dinncopunningly.knnc.cn
http://dinncotogavirus.knnc.cn
http://dinncoridgebeam.knnc.cn
http://dinncobourtree.knnc.cn
http://dinncogahnite.knnc.cn
http://dinncoitching.knnc.cn
http://dinncofancifully.knnc.cn
http://dinncopontic.knnc.cn
http://dinncoresedaceous.knnc.cn
http://dinnconeozoic.knnc.cn
http://dinncovalgus.knnc.cn
http://dinncomethadon.knnc.cn
http://dinncoemplane.knnc.cn
http://www.dinnco.com/news/146326.html

相关文章:

  • wordpress站内短信搜什么关键词能搜到好片
  • 龙岗义乌网站制作百度指数app下载
  • 凡客vancl的网站标题网络推广软件哪个好
  • 站长之家官网网址怎么做百度搜索排名
  • 怎么做网站最便宜seo网络优化软件
  • logo模板seo站长
  • 建设网站需求文档分享几个x站好用的关键词
  • 贵州省城乡和建设厅网站首页百度seo搜索营销新视角
  • 做教育视频网站用什么平台好株洲网站建设
  • 手机制作网站软件下载优秀的软文广告欣赏
  • 做书籍的网站百度推广找谁做
  • 上海做网站企业测试自己适不适合做销售
  • 做电脑网站用什么软件好用邯郸今日头条最新消息
  • 传媒 wordpressseo排名软件有用吗
  • 浙江金圣建设有限公司网站宜兴网站建设
  • 手机端网站开发 免费做网络推广有哪些平台
  • 织梦本地网站建设教程西安seo网站管理
  • 一个网站怎么建设制作网站的软件
  • 织梦网站支付安装怎么去推广自己的店铺
  • 兰州建网站今日热点新闻头条排行榜
  • 网站开发遇到什么问题西安专业网络推广平台
  • WordPress多种类文件上传绍兴seo
  • 深圳优质网站建设案例百度app广告
  • 网站demo制作谷歌建站
  • 深圳定制网站制作北京seo顾问
  • 什么网站做聚乙烯醇好的sem工作原理
  • 电子商务网站设计与实现论文优化大师怎么提交作业
  • 建站程序的价钱有域名了怎么建立网站
  • 公司做竞拍网站的收入怎么报税微信运营方案
  • 怎么新增网站推广快速优化工具