コンテンツにスキップ

クラス (Class)#

クラスとは#

クラスとは、オブジェクトを作成するための設計図のようなものです。

クラスを使うことで、同じようなオブジェクトを複数作成することができます。

クラスの定義#

クラスは、classキーワードを使って定義します。

#include <cstdio>

class MyClass
{
public:
    int data_a;
    double data_b;
};

int main()
{
    MyClass my_class;
    my_class.data_a = 0;
    my_class.data_b = 1.0;
    printf("data_a = %d\n", my_class.data_a);
    printf("data_b = %f\n", my_class.data_b);
    return 0;
}

class MyClass でクラスを定義しています。

  • MyClass はクラスの名前です。
  • data_adata_b はクラスのメンバ変数です。 - public はアクセス修飾子です。 クラスの外部からアクセスできることを示しています。
  • data_adata_b はそれぞれ、int 型と double 型の変数です。

複製#

クラスを使うと、同じようなオブジェクトを複製することができます。

#include <cstdio>

class MyClass
{
public:
    int data_a;
    double data_b;
};

int main()
{
    MyClass my_class_a;
    my_class_a.data_a = 0;
    my_class_a.data_b = 1.0;
    printf("data_a = %d\n", my_class_a.data_a);
    printf("data_b = %f\n", my_class_a.data_b);

    MyClass my_class_b;
    my_class_b.data_a = 2;
    my_class_b.data_b = 3.0;
    printf("data_a = %d\n", my_class_b.data_a);
    printf("data_b = %f\n", my_class_b.data_b);

    return 0;
}

my_class_amy_class_b は、MyClass というクラスから作成されたオブジェクトで、形は全く同じです。

MyClass自体はクッキーの型のようなもので、my_class_amy_class_b はクッキーの型から作られたクッキーのようなものです。


メンバ関数#

クラスには、メンバ変数だけでなく、メンバ関数も定義できます。

メソッドとも呼ばれます。

#include <cstdio>

class MyClass
{
public:
    void init(int a, double b)
    {
        data_a = a;
        data_b = b;
    }

    void print()
    {
        printf("data_a = %d\n", data_a);
        printf("data_b = %f\n", data_b);
    }
private:
    int data_a;
    double data_b;
};

int main()
{
    MyClass my_class;
    my_class.init(0, 1.0);
    my_class.print();
    return 0;
}

MyClassの中に、initprint というメンバ関数を定義しています。

  • init は、data_adata_b に値を代入するメンバ関数です。
  • print は、data_adata_b の値を表示するメンバ関数です。

initprint は、MyClass のメンバ関数なので、my_class から呼び出すことができます。


また、ここでは、data_adata_bprivate にしています。

これにより、data_adata_bMyClass の外部からアクセスできなくなります。

試しに、main の中で my_class.data_a = 0; というコードを追加してみてください。

コンパイルエラーが発生するはずです。

...
    my_class.init(0, 1.0);
    my_class.print();
    my_class.data_a = 0; // コンパイルエラー
    return 0;
}

Classはライブラリとして外部からインクルード可能にするため、メンバ変数は基本的に private にして関数を使ってアクセスすると、可読性が高くなります。

後に出てくるprotected は、private と同じようにアクセスできないのですが、継承したクラスからはアクセスできるようになります。

そのため、継承したクラスのみがアクセスできるようにしたい場合は、protected を使います。


コンストラクタのオーバーロード#

コンストラクタは、オーバーロードの定義が可能です。