首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

實例解析 C++/CLI 的「複製」機制 (Clone 與追蹤參考)

     編輯:VC 教學

背景

C++/CLI 同時支援堆疊語意 (值類別) 與堆語意 (參考類別) 物件。但 CLI 規範 (C#、VB.NET 等) 僅支援堆上物件 (參考型別)。跨語言互操作時,需理解「複製」 (Cloning) 機制:為參考型別建立獨立副本,而非共用同一物件參考。

ArrayList.Clone 範例

using namespace System;
using namespace System::Collections;

void PrintEntries(String^ s, ArrayList^ a) {
    Console::Write("{0}: ", s);
    for each (Object^ o in a) Console::Write("\t{0}", o);
    Console::WriteLine();
}

int main() {
    ArrayList^ al1 = gcnew ArrayList;
    al1->Add("Red"); al1->Add("Blue"); al1->Add("Green"); al1->Add("Yellow");
    PrintEntries("al1", al1);                 // 1. 原始

    ArrayList^ al2 = static_cast(al1->Clone()); // 2. 淺層複製
    PrintEntries("al2", al2);                 // 3. 複本內容相同

    al1->Remove("Blue");
    al1->Add("Black");
    al1->RemoveAt(0);
    al1->Insert(0, "Brown");
    PrintEntries("al1", al1);                 // 4. 修改原始
    PrintEntries("al2", al2);                 // 5. 複本不受影響 (元素為不可變字串)
}

輸出顯示 al2 保持原狀,證明 Clone 建立了新的 ArrayList 實例 (淺層複製)。若元素為可變物件,修改元素內容仍會互相影響,需實作深層複製 (自行遞迴 Clone)。

追蹤參考 (Tracking Reference) %

C++/CLI 使用 % 宣告追蹤參考,對應 C# 的 ref/out。針對參考型別實例,因 GC 可能移動物件,普通指標 * 或參考 & 無法追蹤,必須用 %。

void Swap(Point^ %a, Point^ %b) { // 交換兩個參考型別變數指向的物件
    Point^ tmp = a; a = b; b = tmp;
}

此機制確保在 CLI 執行環境中安全操作參考型別變數本身 (而非物件內容)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved