| 区分 | キーワード | 型の種類 | 既定の修飾子 | C#でのキーワード |
|---|---|---|---|---|
| クラス | ref class | 参照型 | private | class |
| value class | 値型 | struct (構造体) | ||
| 構造体 | ref struct | 参照型 | public | なし |
| value struct | 値型 | なし |
refやvalueキーワードを省略した場合は、アンマネージドなC++の型となります。
// MyClass.h
#pragma once
namespace MyNamespace {
public ref class MyClass
{
public:
void Func();
};
}
#include "MyClass.h"
using namespace MyNamespace;
void MyClass::Func()
{
}
MyClass^ myClass = gcnew MyClass();
class classname {
~classname() {} // デストラクタ (destructor)
! classname() {} // ファイナライザ (finalizer)
};
デストラクターとファイナライザー - 方法: クラスと構造体を定義および使用する (C++/CLI) | MSDN
C++/CLIではDispose()を呼び出してオブジェクトを破棄することはできず、deleteで破棄します。Dispose()を呼ぶと「C2039 'Dispose': '**' のメンバーではありません。」としてエラーとなります。 winforms - error C2039: 'Dispose' : is not a member of 'System::Windows::Forms::ErrorProvider' - Stack Overflow リソース管理 - C++: .NET Framework プログラミング最良の言語 | MSDN
ref class MyClass
{
// デストラクタ
~MyClass()
{
// マネージド リソースの破棄
this->!MyClass();
}
// ファイナライザ
!MyClass()
{
// アンマネージド リソースの破棄
}
};
int main()
{
MyClass^ myClass = gcnew MyClass();
delete myClass; // デストラクタの呼び出し
// デストラクタを呼ばない場合、ここでファイナライザが呼ばれる
}
C++/CLIではC#のようにusingステートメントを用いなくともコンパイラによって解釈され、不要になった時点で自動で破棄されます。C++/CLI, Finalize and Dispose - Christian Nagel's Blog - Thinktecture Blog (2006/04/10)
ただしそのオブジェクトをC#で利用する場合には、usingなどで明示的に破棄します。
MyClass^ operator + ( int i )
{
return gcnew MyClass( this->i - i );
}
C++以外の言語からのアクセスを可能とするには、静的な演算子として定義します。ユーザー定義の演算子 (C++/CLI) | MSDN
static MyClass^ operator + ( MyClass^ me, int i )
{
return ( gcnew MyClass( me->i + i ) );
}
static operator String^ ( MyClass^ me )
{
return me->str;
}
明示的な変換を強制するには、explicitを指定します。
static explicit operator String^ ( MyClass^ me )
{
return me->str;
}
ユーザー定義変換 (C++/CLI) | MSDN