实例解析C++/CLI之静态构造函数[VC/C++编程]
本文“实例解析C++/CLI之静态构造函数[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
就某些类而言,当在程序中第一次利用时,最好能有一个初始化历程;当程序不再需求时,也最好能做一些收尾工作,这些都是非常好的类计划习惯.
引出问题
假若有这样一种情形,某种范例的每个实例都必须有其唯一的ID,比方说某种交易范例,这些ID可用于在处理历程中追踪每笔交易,或之后用于审计员查看数据文件;为谈论便利,此处的ID为从0起始的有标记整型数.
假如把一个nextID值保存在内存中,并在每个新实例构造时,把它递增1,这无疑是一个不错的设法,但是,为使在程序持续的履行历程中保持ID值的唯一,就需求在每次程序完毕时保存此值,并在下次程序开始运行时恢复这个值,但在尺度C++中,是没办法来到达这个目的的,实际上,利用尺度CLI库也一样没办法完成.但是,在CLI的.NET实现中有几个扩大库,它们却可以完成这个任务.
问题重现
这回又用到了Point类,因为带有唯一ID的点很合适此主题.例1中的程序输出在代码之后:
例1:
using namespace System;
Point F(Point p) {
return p;
}
int main()
{
/*1*/ Point::TraceID = true;
/*2*/ Point^ hp1 = gcnew Point;
Console::WriteLine("hp1: {0}", hp1);
/*3*/ hp1->Move(6,7);
Console::WriteLine("hp1: {0}", hp1);
/*4*/ Point^ hp2 = gcnew Point(3,4);
Console::WriteLine("hp2: {0}", hp2);
/*5*/ Point p1, p2(-1,-2);
Console::WriteLine("p1: {0}, p2: {1}", %p1, %p2);
/*6*/ p1 = F(p2);
Console::WriteLine("p1: {0}", %p1);
}
输出:
hp1: [0](0,0)
hp1: [0](6,7)
hp2: [1](3,4)
p1: [2](0,0), p2: [3](-1,-2)
p1: [2](-1,-2)
在程序开始运行时,从一个文本文件中读取下一个可用的ID值,并用它来初始化一个Point类中的私有静态(private static)字段.最开始,这个文件包含的值为零.
基于大众静态布尔属性TraceID的值,Point中ToString函数生成的字符串可有挑选地包含Point的ID,并以 [id] 的情势作为一个前缀.假如此属性值为true,就包含ID前缀;不然,就不包含.默许情形下,这个属性值被设为false,因此,在标号1中我们把它设为true.
在标号2中,利用默许构造函数为Point分配了内存空间,并显示它的ID为0及值为(0,0).在标号3中,通过Move函数改正了Point的x与y坐标值,但这不会改正Point的ID,毕竟,它还是同一个实例--只不过用了差别的值.接着,在标号4中,利用了承受两个参数的构造函数为另一个Point分配了内存空间,并显示它的ID为1及值为(3,4).
在标号5中成立了两个基于仓库的实例,并显示出它们的ID及值.在第三个及第四个Point成立时,它们的ID辨别为2和3.
在标号6中,p1被赋于了一个新值,但是,p1还是它之前的同一个Point,所以它的ID没有改变.
第二次运路程序时,输出以下:
hp1: [6](0,0)
hp1: [6](6,7)
hp2: [7](3,4)
p1: [8](0,0), p2: [9](-1,-2)
p1: [8](-1,-2)
如上所示,4个新实例都被赋于了持续的ID值,且与第一次履行时截然差别,但是,还贫乏ID 4和5.请留神标号6及函数F的定义,Point参数是传值到此函数的,而一个Point也是通过值返回的.一样地,这二者城市调用到复制构造函数,而其则"忠厚"地成立了一个新实例,且每个新实例都有一个唯一的ID.因此,当p2通过值传送时,会成立一个ID为4的暂时Point,紧接着,当副本通过值返回时,又会成立一个ID为5的副本,而两个副本都是可丢弃的.当程序完毕时,写入到文件中下一个可用的ID为6,而在程序下次运行时,这就是第一个Point在分配空间时将用到的ID.
以上是“实例解析C++/CLI之静态构造函数[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |