クラス・構造体の比較

キーワード
  クラス 構造体
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
{
}
※セミコロンの有無が異なります。

アクセス修飾子 (access modifier)

キーワード
  すべて可 基底クラス
のみ
同一アセンブリ内
のみ
基底クラスと
派生クラス
基底クラスと
同一アセンブリの
派生クラス
基底クラス、
派生クラスと
同一アセンブリの
外部コード
C++ public private --- --- protected ---
C++/CLI internal protected protected private public protected
C# protected internal protected ---

クラスに対するアクセス制御

  指定可能な値
C++
  • なし
 
C++/CLI
  • private (既定)
  • public
public ref class MyClass {};
C#
  • internal (既定)
  • public
public class MyClass {}

メンバに対するアクセス制御

C++
class MyClass
{
    int a; // これはprivate (既定)
public:
    int b; // これはpublic
    int c; // これはpublic
};
C++/CLI
ref class MyClass
{
    int a; // これはprivate (既定)
public:
    int b; // これはpublic
    int c; // これはpublic
};
C#
class MyClass
{
       int a; // これはinternal (既定)
public int b; // これはpublic
       int c; // これはinternal (後続するメンバには作用しない)
}
C#では、修飾子を指定したメンバにのみ作用する

継承 (inheritance)

  クラス 構造体
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() {}

抽象クラス (abstract class)

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 )
    {
    }
}

デストラクタ、ファイナライザ

  デストラクタ ファイナライザ
C++ ~クラス名 ---
C++/CLI ~クラス名 !クラス名
C# Dispose() ~クラス名※1
Finalize()メソッド

※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;
//      c = 1; // NG
    }
};

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;
    }
}

静的なメンバの初期化

C++ コンストラクタで初期化する。静的メンバのための特別な構文はない
C++/CLI  
C# 静的コンストラクタで初期化する
Java static初期化ブロックで初期化する