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();
}