我爱Aspx >> VC.Net >> 实例解析C++/CLI之开卷有益例2是一个使用了Point类的简单程序,下面以此为例简单讲解各方面的含义:
例2:
| using namespace System;int main(){ /*1*/ Point^ p1 = gcnew Point; /*2*/ Console::WriteLine("p1 = {0}, p1's HashCode = {1}", p1, p1->GetHashCode()); /*3*/ p1->Move(5, 7); /*4*/ Console::WriteLine("p1 = {0}, p1's HashCode = {1}", p1, p1->GetHashCode()); /*5*/ Console::WriteLine("p1 Equals Point(9, 1) = {0}", p1->Equals(gcnew Point(9, 1)));} |
分配托管内存:在标记1中,定义了一个指向Point类型的句柄,并用gcnew操作符返回的位置初始化它,gcnew操作符是一个关键字,它为一个新的Point对象在托管堆中,分配了相应的空间,与大家想的一样,此处还会调用默认的构造函数。在目前的C++/CLI版本中,引用类的对象只能驻留于堆栈或托管堆中,与其他CLI语言不同,C++/CLI可以让你编写能被传递,并通过复制构造函数或 = 操作符赋值的引用类,还可以重载Clone函数,实现虚拟(深度)赋值。 格式化输出:CLI提供了一系列的I/O类型--使用功能性注解的函数。最简单的例子就是System::Console Write和WriteLine(见标记2)的重载版本,其向标准输出设备输出文本,WriteLine会跟上一个新行,而Write则不会。
这类函数有许多重载的版本,然而,最常见的形式是接受一个包含文本的格式化字符串,并带有可选的格式指定符--由花括号进行分隔,其后紧接需要格式化其值的参数。格式指定符 {0} 对应于紧接着格式化字符串传递进来的第一个参数;而 {1} 则对应于第二个参数,以此类推。与Concat类似,也有一些接受几个固定参数的重载版本,或可接受几个固定参数并同时接受一个可变数目的参数,在本例中,使用了如下的版本:
| static void WriteLine(String^ format, Object^ arg0, Object^ arg1); |
字符串在此被隐式转换为String^。因为p1是一个Point^,且Point是从Object继承而来,所以p1是is关系。GetHashCode返回一个int,因此在被传递之前,会被装箱为Object^。一旦执行到WriteLine,它会调用第二个和第三个参数的ToString函数,并输出结果字符串。以下是程序的输出:
| p1 = (0,0), p1's HashCode = 0p1 = (5,7), p1's HashCode = 11p1 Equals Point(9, 1) = False |
垃圾回收:由句柄p1引用的内存驻留于托管堆中,而托管堆则处于垃圾回收器"监视"之下,当一个句柄超出作用域时,其引用的内存就少了一个与此相联的句柄,继而当句柄计数为零时,内存就被自动回收了。如果一个句柄在某段时间内并没有超出作用域,但你已不需要其引用的内存了,就可以设置句柄为nullptr来减少其的引用计数,在此,没有办法来显式释放一块托管内存。另外,也可以对句柄调用delete,它会马上运行析构函数(Dispose函数),但这块内存仍不会被回收,直到垃圾回收器决定回收它。
【我对这篇文章有话说?】
“不完美”的VS 2005 Team Syste..[03-16]
ASP.NET 2.0移动开发之列表控件[03-16]
ASP.NET移动开发之SelectionList..[03-16]
ASP.NET 2.0中保证应用程序的安全[03-16]
病毒及流氓软件自我复制的简单实..[03-16]
ASP.NET1.0/2.0里用DIV层元素弹出..[03-16]
扩展ASP.NET 2.0内置GridView控件..[03-16]
ASP.NET中上传文件到数据库[03-16]
用ASP.NET2.0在数据库中存储二进..[03-16]
ASP.NET2.0的multiview和wizard控..[03-16]