C++でクラスの作成と呼び出しの画像
芽萌丸プログラミング部 @programming
投稿日 2021/01/25
更新日 2021/01/26 ✏

C++

C++でクラスの作成と呼び出し

C++で簡単なクラスの作成、インスタンス生成、メソッド呼び出しのサンプルコードです。

目次:

クラス本体のコード

MyClass.h

#ifndef MY_CLASS_H
#define MY_CLASS_H

#include <iostream>
#include <string>

using namespace std;

/**
 * MyClassクラス
 */
class MyClass {
private:

    //-- privateメンバ変数:
    int foo = 123;

public:

    /** 引数なしコンストラクタ */
    MyClass() {
        cout << "constructor called." << endl;
    }

    /** 引数有りコンストラクタ */
    MyClass(int foo) {
        this->setFoo(foo);
    }

    /** デストラクタ */
    ~MyClass()
    {
        cout << "destructor called." << endl;
    }

    //-- publicメソッド

    void setFoo(int foo) {
        this->foo = foo;
        cout << "set foo: " << to_string(foo) << endl;
    }

    int getFoo() {
        return this->foo;
    }
};

#endif // MY_CLASS_H

※上記のサンプルコードでは説明をシンプルにするためにヘッダファイルに実装も書いていますが、本来はヘッダファイル(.h)と実装ファイル(.cpp)を分けた方が良いでしょう。(理由はここでは省きます)

コードのポイント

インクルードガード

以下のような記述箇所をインクルードガードと言います。

#ifndef MY_CLASS_H
#define MY_CLASS_H
...
#endif

これは同じヘッダファイルが2回目以降の呼出で重複して展開されるのを防ぐための記述です。

private:public:

private:以降に書かれたコードはプライベート、public:以降に書かれたコードはパブリックです。 サンプルコードのgetFoo()setFoo()はパブリックメソッドとなります。

メンバ変数

int foo = 123;はメンバ変数です。これはプライベートなメンバ変数として定義していますが、public:以降に記述するとパブリックなメンバ変数になり、myClass->foo のようにアクセスできるようになります。

コンストラクタとデストラクタ

public:

    /** 引数なしコンストラクタ */
    MyClass() {
        cout << "constructor called." << endl;
    }

    /** 引数有りコンストラクタ */
    MyClass(int foo) {
        this->setFoo(foo);
    }

    /** デストラクタ */
    ~MyClass()
    {
        cout << "destructor called." << endl;
    }

インスタンス作成MyClass* myClass = new MyClass();するとコンストラクタが呼ばれ、インスタンスを削除delete myClass;するとデストラクタが呼ばれます。

クラスの呼び出しコード

作成したクラスを呼び出すためのテストコードは以下のようになります:

test.cpp

#include <string>
#include "MyClass.h"

using namespace std;

int main() {
    // インスタンスの生成:
    MyClass* myClass = new MyClass();
    // #getFoo()メソッドを実行:
    cout << "myClass->foo: " << to_string(myClass->getFoo()) << endl; // foo: 123
    // #setFoo(int)メソッドを実行:
    myClass->setFoo(456);
    // #getFoo()メソッドを実行:
    cout << "myClass->foo: " << to_string(myClass->getFoo()) << endl; // foo: 456
    // インスタンスを削除:
    delete myClass; // destructor called.
}

コンパイル&実行

早速コンパイルして実行してみましょう。

## コンパイル
$ g++ -o a.out MyClass.h test.cpp -std=c++11

## 実行
$ ./a.out
constructor called.
myClass->foo: 123
set foo: 456
myClass->foo: 456
destructor called.

関連


芽萌丸プログラミング部
芽萌丸プログラミング部 @programming
プログラミング関連アカウント。Web標準技術を中心に書いていきます。フロントエンドからサーバサイドまで JavaScript だけで済ませたい人たちの集いです。記事は主に @TanakaSoftwareLab が担当。