| 分類 | 關鍵字 | 備註 |
| 參考型別 | ref class/struct | GC 堆配置,語意參考 |
| 值型別 | value class/struct | 堆疊/內嵌配置,語意值 |
| 介面 | interface class/struct | 純抽象契約 |
| 列舉 | enum class/struct | 強型別,CLS 相容 |
| 委派 | delegate | 型別安全函式指標 |
| 原生型別 | class/struct | 傳統 C++,非 CLI 型別 |
所有 CLI 型別隱含繼承 System::Object(值型別繼承 System::ValueType)。
Point 類別完整範例
using namespace System;
public ref class Point {
int x, y;
public:
property int X {
int get() { return x; }
void set(int v) { x = v; }
}
property int Y {
int get() { return y; }
void set(int v) { y = v; }
}
Point() : X(0), Y(0) {}
Point(int xor, int yor) : X(xor), Y(yor) {}
void Move(int xor, int yor) { X = xor; Y = yor; }
virtual bool Equals(Object^ obj) override {
if (obj == nullptr) return false;
if (this == obj) return true;
if (GetType() == obj->GetType()) {
Point^ p = static_cast<Point^>(obj);
return X == p->X && Y == p->Y;
}
return false;
}
virtual int GetHashCode() override { return X ^ (Y << 1); }
virtual String^ ToString() override { return String::Concat("(", X, ",", Y, ")"); }
};
關鍵語法重點
property 關鍵字定義屬性,get/set 存取器可有不同存取性。
gcnew 配置 GC 堆物件,回傳控制代碼 ^(句柄)。
nullptr 統一空值常數(句柄/指標通用)。
- 虛擬函式需
virtual ... override,不可 const。
- 格式化輸出用
Console::WriteLine("{0}", obj),自動呼叫 ToString()。
- 裝箱隱含發生:
int → Object^ 配置堆上物件複製值。
簡單測試程式
int main() {
Point^ p1 = gcnew Point;
Console::WriteLine("p1 = {0}, Hash = {1}", p1, p1->GetHashCode());
p1->Move(5,7);
Console::WriteLine("p1 = {0}, Hash = {1}", p1, p1->GetHashCode());
Console::WriteLine("Equals(9,1) = {0}", p1->Equals(gcnew Point(9,1)));
}
輸出:
p1 = (0,0), Hash = 0
p1 = (5,7), Hash = 11
Equals(9,1) = False
垃圾回收
- 句柄離開作用域或設為
nullptr 減少參考計數。
- 計數歸零時記憶體合格回收,時機非確定性。
delete handle 呼叫 Dispose()(若實作 IDisposable),但記憶體仍待 GC 回收。
Visual Studio 2005 專案建置步驟
- 建立「空專案」
Point,輸出類型設「動態庫 (.dll)」,/clr、/MD。
- 加入
Point.cpp,建置產出 Point.dll。
- 建立第二個專案
Main(.exe),同樣 /clr//MD。
- 專案參考加入
Point.dll,建置執行。
提示:可同時開啟兩個 VS 實例分別編輯兩專案,提升效率。
- 上一篇文章: C++/CLI 靜態建構函式實戰:跨執行期保持物件 ID 唯一性
- 下一篇文章: 深入解析 C++/CLI 委派與事件機制
Copyright ©
程式碼之家 All Rights Reserved