实例解析C++/CLI之静态构造函数 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
http://www.sina.com.cn 2006年11月21日 16:18 天极yesky | |||||||||||
作者:谢启东编译 就某些类而言,当在程序中第一次使用时,最好能有一个初始化过程;当程序不再需要时,也最好能做一些收尾工作,这些都是非常好的类设计习惯。
输出:
在程序开始运行时,从一个文本文件中读取下一个可用的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没有改变。 第二次运行程序时,输出如下:
如上所示,4个新实例都被赋于了连续的ID值,且与第一次执行时截然不同,但是,还缺少ID 4和5。请留意标号6及函数F的定义,Point参数是传值到此函数的,而一个Point也是通过值返回的。同样地,这两者都会调用到复制构造函数,而其则"忠实"地创建了一个新实例,且每个新实例都有一个唯一的ID。因此,当p2通过值传递时,会创建一个ID为4的临时Point,紧接着,当副本通过值返回时,又会创建一个ID为5的副本,而两个副本都是可丢弃的。当程序结束时,写入到文件中下一个可用的ID为6,而在程序下次运行时,这就是第一个Point在分配空间时将用到的ID。
|