クラス・構造体の比較
キーワード
| |
クラス |
構造体 |
| C++ |
class |
struct |
| C++/CLI |
unmanaged |
class |
struct |
| managed |
ref class |
value struct (C++のstruct相当) |
| value class (C#のstruct相当) |
| C# |
class |
struct |
| Java |
class |
--- |
宣言
| C++ |
class MyClass
{
};
|
| C++/CLI |
ref class MyClass
{
};
|
| C# |
class MyClass
{
}
|
| Java |
class MyClass
{
}
|
※セミコロンの有無が異なります。
キーワード
| |
すべて可 |
基本クラス のみ |
同一アセンブリ内 のみ |
基本クラスと 派生クラス |
基本クラスと 同一アセンブリの 派生クラス |
基本クラス、 派生クラスと 同一アセンブリの 外部コード |
| C++ |
public |
private |
--- |
--- |
protected |
--- |
| C++/CLI |
internal |
protected |
protected private |
public protected |
| C# |
protected internal |
protected |
--- |
クラスに対するアクセス制御
| |
指定可能な値 |
例 |
| C++ |
|
|
| C++/CLI |
|
public ref class MyClass {}; |
| C# |
|
public class MyClass {} |
メンバに対するアクセス制御
| C++ |
class MyClass
{
int a;
public:
int b;
int c;
};
|
| C++/CLI |
ref class MyClass
{
int a;
public:
int b;
int c;
};
|
| C# |
class MyClass
{
int a;
public int b;
int c;
}
C#では、修飾子を指定したメンバにのみ作用する
|
| |
クラス |
構造体 |
| C++ |
class SubClass : MyClass
{
};
|
struct SubClass : MyClass
{
};
|
| C++/CLI |
ref class SubClass : MyClass
{
};
|
--- |
| C# |
class SubClass : MyClass
{
}
|
--- |
| Java |
class SubClass extends MyClass
{
}
|
--- |
多重継承 (multiple inheritance)
| C++ |
class SubClass : MyClass1, MyClass2
{
};
|
| C++/CLI |
--- |
| C# |
--- |
| Java |
--- |
クラスの多重継承をサポートするのはC++のみで、他の言語ではインターフェイスが多重継承をサポートすることで、これの代替としています。
オーバーライド (override)
| |
オーバーライド |
継承したメンバを隠蔽 |
| C++ |
void Func() {} |
--- |
| C++/CLI |
void Func() override {} |
void Func() new {} |
| C# |
override void Func() {} |
new void Func() {} |
| Java |
void Func() {} |
--- |
オーバーライドの不許可
| C++ |
--- |
| C++/CLI |
void Func() sealed {} |
| C# |
sealed void Func() {} |
| Java |
final void Func() {} |
| C++ |
class MyClass
{
public:
virtual void Func() = 0;
};
|
| C++/CLI |
ref class MyClass abstract
{
public:
virtual void Func() abstract;
};
※C++の書式も使用できます。
|
| C# |
abstract class MyClass
{
public abstract void Func();
}
|
| Java |
abstract class MyClass
{
abstract void Func();
}
|
C++/CLIやC#には、抽象メソッドのみのクラスに対して、インターフェイスという概念があります。
抽象クラスの継承
| C++ |
class SubClass : MyClass
{
public:
void Func()
{
}
};
|
| C++/CLI |
ref class SubClass : MyClass
{
public:
virtual void Func() override
{
}
};
|
| C# |
class SubClass : MyClass
{
public override void Func()
{
}
}
|
| Java |
class SubClass extends MyClass
{
void Func()
{
}
}
|
インスタンスの構築と破棄
キーワード
| C++ |
new |
| C++/CLI |
unmanaged |
new |
| managed |
gcnew |
| C# |
new |
コンストラクタの呼び出し
| |
基本クラスの コンストラクタ |
オーバーロードされた コンストラクタ |
| C++ |
class SubClass : MyClass
{
SubClass() : MyClass()
{
}
};
|
class SubClass : MyClass
{
SubClass() : SubClass( 10 )
{
}
SubClass( int a )
{
}
};
|
| C++/CLI |
ref class SubClass : MyClass
{
SubClass() : MyClass()
{
}
};
|
|
| C# |
class SubClass : MyClass
{
SubClass() : base()
{
}
}
|
class SubClass : MyClass
{
SubClass() : this( 10 )
{
}
SubClass( int a )
{
}
}
|
| Java |
class SubClass extends MyClass
{
SubClass()
{
super();
}
}
|
class SubClass extends MyClass
{
SubClass()
{
this( 10 );
}
SubClass( int a )
{
}
}
|
※1 この構文でFinalize()メソッドが暗黙的に呼び出されます。C# 2.0より前は、デストラクタと呼称されていました。
カレントオブジェクトや基本クラスの参照
カレントオブジェクトの参照
キーワード
| C++ |
this |
| C++/CLI |
this |
| C# |
this |
| Java |
this |
基本クラスの参照
| C++ |
[基本クラスの名前]:: |
| C++/CLI |
[基本クラスの名前]:: |
| C# |
base |
| Java |
super |
メンバの初期化
| C++ |
class MyClass
{
int a;
int b;
const int c;
static const int d = 1;
static const double e;
MyClass() : a( 10 ), c( 10 )
{
b = 1;
}
};
const double MyClass::e = 1.0;
|
| C++/CLI |
|
| C# |
class MyClass
{
int a = 1;
const int c = 1;
static const int d = 1;
static const double e = 1.0;
}
|
| Java |
class MyClass
{
int a = 1;
int b;
const int c = 1;
static const int d = 1;
static const double e = 1.0;
{
b = 1;
}
}
|
静的なメンバの初期化