topazの遊び場

いろいろやってみる

そろそろC++やるぞパート4 クラス入門

そろそろC++やります

そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。

という感じでやっています。

※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。

内容

MicrosoftのドキュメントはC++のクラスや構造体の機能ごとに解説ページが作られ全体像が見えにくかったため、今回は他の方のブログなどを参考にしつつ概要を掴みたいと思います。

クラスと構造体

これら二つのコンストラクトは、規定で、構造体がpublic、クラスがprivateである点を除けば同じです。
クラスと構造体はデータメンバー(data members)メンバー関数(member functions)を含めることができます。

最小限のクラス

参考記事

classキーワードに、クラスの識別子、{ }でくくって、最後に;セミコロンが必須です。

class MyClass
{
};

;セミコロンが必須で、他の言語ではあまりないものなので、注意が日強ようです。

メンバ変数

クラスの中括弧{ } の中で、変数宣言を行うとそれが、クラスのメンバ変数となります。

class Myclass
{
private:
    int m_a;
};

publicprivateのアクセス修飾子、コロン:、型名、変数名を書きます。

{アクセス修飾子}:
    {型}  {変数名};

public変数の場合は、クラス型の変数名.メンバ変数名で値にアクセスすることができます。
後で触れますが、MyClass aでMyClass型の変数 a を宣言しています。

class MyClass
{
public:
    int m_a;
};
int main()
{
    MyClass a;
    a.m_a = 123;
    std::cout << a.m_a << "\n";
    return 0;
}

コンストラク

クラスの初期化時にコンストラクタを通して初期化することができます。

class Vector2
{
public:
    // メンバ変数
    int x;
    int y;
    // コンストラクタ
    Vector2(int _x, int _y)
    {
        x = _x;
        y = _y;
    }
};

int main()
{
    Vector2 v2 = Vector2(12, 22);
    cout << v2.x << endl;
    // Output: 12
    cout << v2.y << endl;
    // Output: 22
    return 0;
}

コンストラクタの引数とメンバ変数を同じにすることはできないので、_をつけているのが調べていて多かったです。
ただ、別の書き方もあって、Vector2(int x, int y)の後にメンバ変数名( コンストラクタ引数名 )と書くことでメンバ引数を初期化することができます。

Vector2(int x, int y) : x(x), y(y)
{
}

また、自身のオブジェクトへのポインターthisを用いて初期化することもできます。ポインターに関しては、いずれ行います。

Vector2(int x, int y)
{
    this->x = x;
    this->y = y;
}

コンストラクタで引数がないものをデフォルトコンストラクと呼びます。C++は、メンバ変数が 0 や "" (空文字) で初期化されないため、コンストラクタで初期化しておく必要があります。バグの原因にもなりやすいです。

class Vector2
{
public:
    int x;
    int y;
};

int main()
{
    Vector2 v2;
    cout << v2.x << endl;
    // Output: 1
    cout << v2.y << endl;
    // Output: 35249280
    return 0;
}

デストラク

デストラクはオブジェクトが破棄される時に呼ばれる関数のようなものです。チルダ~をつけて~クラス名と書きます。

class MyClass {
public:
    MyClass();     // コンストラクタ
    ~MyClass();  //  デストラクタ
};

C++{ }で変数のスコープが区切られます。つまり、{ }の中で定義した変数は、{ }を抜けると消えてなくなります。
これを利用してデストラクタが機能していることを確認できます。

class MyClass
{
public:
    ~MyClass()
    {
        std::cout << "destructor\n";
    }
};
int main()
{
    {
        MyClass a;
    }
    return 0;
}
// Output: destructor

デストラクタは確保したメモリの確保等に使います。C#では、Dispose()で行っていた処理もここで行います。

メンバ関数

メンバ関数はクラスインスタンス固有の処理を行う関数のことです。メソッドとも呼ばれます。
{返り値の型} 関数名 (引数リスト) { ステートメント }で構成されています。

class Vector2
{
public:
    int x;
    int y;
    Vector2(int x, int y) : x(x), y(y)
    {
    }
    void SetX(int _x)
    {
        x = _x;
    }
};

また、public:スペースは複数に分けることが可能です。

class Vector2
{
public:
    int x;
    int y;
    Vector2(int x, int y) : x(x), y(y)
    {
    }
    void SetX(int _x)
    {
        x = _x;
    }
public:
    void SetY(int _y)
    {
        y = _y;
    }
};

また、ヘッダーファイル(.h)に関数の宣言を行う場合もありますが、ヘッダーファイルに関する記事の際に詳しく触れたいと思います。

参考記事

感想

今回は、C++のクラスはこのような感じだ、というのを軽く触れてみました。関数一つ一つにアクセス修飾子がつくのではなく、ブロック単位(public:private:)でアクセス範囲を決めていて面白いなと感じました。
また、デストラクタでメモリの解放を行う、ヘッダーファイルに分けて記述するのは、最近の言語ではあまりみない書き方なので、早く学んでみたいなと思っています。

次回はクラスについてのMicrosoftのドキュメントを見ていこうと思います。