クラス・構造体の比較
キーワード
|
クラス |
構造体 |
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;
}
}
|
静的なメンバの初期化