用户名: 密码: 免费注册 忘记密码? 网站地图 | 加入收藏 | 设为首页
首页 | 新闻 | 工具 | 系统 | 办公 | 聊天 | 多媒体 | 网页 | 运营 | 平面 | 欣赏 | 数据库 | 程序 | 服务器 | 组网
网页 | 3dmax | Ghost | Windows Xp| Dreamweaver | photoshop | Flash | office | Alexa | Css | QQ | Asp | PHP | Jsp | Access
Flash MX 2004入门 | 网站推广策略 | CorelDRAW入门 | ASP学习 | 网站建设大师功 | Word入门
  iTbulo.com > 学院 > 程序开发教程 > Visual C++教程 > Visual C++实例教程 > 文章正文
实例解析C++/CLI的“克隆”
iTbulo.COM 2006-9-11 谢启东编译()
C++/CLI不但支持基于堆栈的对象,同时也支持基于堆的对象;然而,如果想与其他基于CLI的语言(如C#、J#、Visual Basic)进行互操作的话,必须要清楚地知道,这些语言只支持基于堆的对象;当处于基于堆的对象环境中时,你与对象之间,永远只有"一臂之遥",比方说,两个给定的句柄h1与h2,只有在为这种句柄类型定义了相应的赋值操作符时,*h1 = *h2才会工作正常,而对C++/CLI之外的其他语言中的类型来说,情况可能就不是这样了。同样地,一个遵从CLS的机制需要创建对象的一份副本,这种机制被称为"克隆"。

  使用CLI库中的Clone函数

  请看例1中的代码,其使用了类似于矢量的一个System::ArrayList类,插1是程序的输出。

  例1:

using namespace System;
using namespace System::Collections;

void PrintEntries(String^ s, ArrayList^ aList);

int main()
{
 ArrayList^ al1 = gcnew ArrayList;
 /*1*/ al1->Add("Red");
 al1->Add("Blue");
 al1->Add("Green");
 al1->Add("Yellow");
 /*2*/ PrintEntries("al1", al1);
 /*3*/ ArrayList^ al2 = static_cast<ArrayList^>(al1->Clone());
 /*4*/ PrintEntries("al2", al2);
 /*5*/ al1->Remove("Blue");
 al1->Add("Black");
 al1->RemoveAt(0);
 al1->Insert(0, "Brown");

 /*6*/ PrintEntries("al1", al1);
 /*7*/ PrintEntries("al2", al2);
}
void PrintEntries(String^ s, ArrayList^ aList)
{
 Console::Write("{0}: ", s);
 for each(Object^ o in aList)
 {
  Console::Write("\t{0}", o);
 }
 Console::WriteLine();
}

  插1:程序输出

al1: Red Blue Green Yellow
al2: Red Blue Green Yellow
al1: Brown Green Yellow Black
al2: Red Blue Green Yellow


  ArrayList al1由4个代表不同颜色的字符串组成,通过在标记3中调用ArrayList::Clone函数,可以对此对象作一个完整的复制,所以,标记2与4表示的输出完全相同。

  接下来,从al1中移除了第二个元素,在末尾加入了一个新的元素,并修改了第一个元素的值。当把标记6与7表示的输出进行一个对比时,你会发现,对al1所作的修改,完全不会影响到al2。在此需要说明的是,al2内部的引用,指向其自身元素的私有副本,而不是al1中的元素,这就是通常提到的"深拷贝",反之,只是简单地把两个ArrayList内部引用指向同一个值集(如al2=al1的赋值操作),这称为"浅拷贝"。

  也就是说,如果你希望复制所拥有的对象,应该参照库函数Clone机制中的复制过程。

[1] [2] [3] [4] [5] [6] 下一页

文章搜索
相关资讯
相关文章 相关下载
深入理解C++中的mutable关键字
C++初学者应该关心的优秀图书一览
C++类对象的拷贝构造函数分析
C/C++是程序员必须掌握的语言吗?
Windows平台下基于串口的数据采集系统
焦点信息