クラス・構造体の比較

キーワード
  クラス 構造体
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 Foo
{
};
C++/CLI
ref class Foo
{
};
C#
class Foo
{
}
Java
class Foo
{
}
※セミコロンの有無が異なります。

アクセス修飾子 (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 Foo {};
C#
  • internal (既定)
  • public
public class Foo {}

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

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

継承 (inheritance)

  クラス 構造体
C++
class Foo : Bar
{
};
struct Foo : Bar
{
};
C++/CLI
ref class Foo : Bar
{
};
---
C#
class Foo : Bar
{
}
---
Java
class Foo extends Bar
{
}
---

多重継承 (multiple inheritance)

C++
class Foo : Bar1, Bar2
{
};
C++/CLI ---
C# ---
Java ---

クラスの多重継承をサポートするのはC++のみで、他の言語ではインターフェイスが多重継承をサポートすることで、これの代替としています。

オーバーライド (override)

  オーバーライド 継承したメンバを隠蔽
C++
void Foo() {}
---
C++/CLI
void Foo() override {}
void Foo() new {}
C#
override void Foo() {}
new void Foo() {}
Java
void Foo() {}
---
オーバーライドの不許可
C++ ---
C++/CLI
void Foo() sealed {}
C#
sealed void Foo() {}
Java
final void Foo() {}

抽象クラス (abstract class)

C++
class Foo
{
public:
    virtual void Bar() = 0;  // 純粋仮想関数
};
C++/CLI
ref class Foo abstract
{
public:
    virtual void Bar() abstract;  // 純粋仮想関数
};
※C++の書式も使用できます。
C#
abstract class Foo
{
    public abstract void Bar();  // 抽象メソッド
}
Java
abstract class Foo
{
    abstract void Bar(); // 抽象メソッド
}

C++/CLIやC#には、抽象メソッドのみのクラスに対して、インターフェイスという概念があります。

抽象クラスの継承

C++
class Baz : Foo
{
public:
    void Bar()
    {
    }
};
C++/CLI
ref class Baz : Foo
{
public:
    virtual void Bar() override
    {
    }
};
C#
class Baz : Foo
{
    public override void Bar()
    {
    }
}
Java
class Baz extends Foo
{
    void Bar()
    {
    }
}

インスタンスの構築と破棄

キーワード
C++ new
C++/CLI unmanaged new
managed gcnew
C# new

コンストラクタ

コンストラクタの呼び出し
  基本クラスの
コンストラクタ
オーバーロードされた
コンストラクタ
C++
class Foo : Bar
{
    Foo() : Bar()
    {
    }
};
class Foo : Bar
{
    Foo() : Foo( 10 )
    {
    }

    Foo( int a )
    {
    }
};
C++/CLI
ref class Foo : Bar
{
    Foo() : Bar()
    {
    }
};
 
C#
class Foo : Bar
{
    Foo() : base()
    {
    }
}
class Foo : Bar
{
    Foo() : this( 10 )
    {
    }

    Foo( int a )
    {
    }
}
Java
class Foo extends Bar
{
    Foo()
    {
        super();
    }
}
class Foo extends Bar
{
    Foo()
    {
        this( 10 );
    }

    Foo( int a )
    {
    }
}

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

  デストラクタ ファイナライザ
C++ ~クラス名 ---
C++/CLI ~クラス名 !クラス名
C# Dispose() ~クラス名 ※C#2.0より前では、この構文はデストラクタと呼称されていた。
Finalize()メソッド

C#ではC++のデストラクタの構文で、Finalize()メソッドが暗黙的に呼び出されます。≫C#の終了処理

カレントオブジェクトや基本クラスの参照

カレントオブジェクトの参照

キーワード
C++ this
C++/CLI this
C# this
Java this

基本クラスの参照

C++ [基本クラスの名前]::
C++/CLI [基本クラスの名前]::
C# base
Java super

メンバの初期化

C++
class Foo
{
    int a;
    int b;
    const int c;
    static const int d = 1; // 静的な定数の整数のみ
    static const double e;  // 整数以外は不可

    Foo() : a( 10 ), c( 10 ) // 初期化リスト (イニシャライザ)
    {
        b = 1;
//      c = 1; // NG
    }
};

const double Foo::e = 1.0;
C++/CLI  
C#
class Foo
{
    int a = 1;
    const int c = 1;
    static const int d = 1;
    static const double e = 1.0;

    // 初期化リストの機能はない
}
Java
class Foo
{
    int a = 1;
    int b;
    const int c = 1;
    static const int d = 1;
    static const double e = 1.0;

    // 複雑な初期化を行う初期化ブロックがある
    {
        b = 1;
    }
}