区分 | キーワード | 型の種類 | 既定の修飾子 | 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