本文へスキップ
BecomeCoder

C++コース · 第10章 クラスの基礎 ― 自分だけの型を作る · レッスン38

メンバ関数 ― データに振る舞いを持たせる

ブラウザで完結

導入

クラスは、データ(メンバ変数)だけでなく、それを扱う関数(メンバ関数)もまとめられます。これによって「データ+そのデータの操作」を1つの部品にできます。

説明

クラスの中に書いた関数がメンバ関数です。同じクラスのメンバ変数に、obj. を書かずに直接アクセスできます。

flowchart TB
  subgraph R["class Rectangle"]
    d["メンバ変数:width, height"]
    m["メンバ関数:area(), scale()"]
  end
  m -->|"自分の width/height を使う"| d
#include <iostream>
using namespace std;

class Rectangle {
public:
    int width;
    int height;

    int area() {                 // 面積を計算するメンバ関数
        return width * height;   // 自分の width/height を使える
    }
    void scale(int k) {          // 縦横を k 倍する
        width *= k;
        height *= k;
    }
};

int main() {
    Rectangle r;
    r.width = 3;
    r.height = 4;
    cout << r.area() << endl;    // 12
    r.scale(2);
    cout << r.area() << endl;    // 48(6 × 8)
    return 0;
}

メンバ関数は「宣言だけクラス内に書き、定義は外に書く」こともできます。大きなクラスではこの分け方が普通です。クラス名::関数名 と書きます。

#include <iostream>
using namespace std;

class Rectangle {
public:
    int width, height;
    int area();          // 宣言だけ
};

int Rectangle::area() {  // クラスの外で定義(:: でどのクラスか示す)
    return width * height;
}

int main() {
    Rectangle r{3, 4};
    cout << r.area() << endl;  // 12
    return 0;
}

まとめ

メンバ関数を使うと「データとその操作」を1つの型にまとめられます。定義をクラス外に出すときは 戻り値 クラス名::関数名(...) と書きます。次は「作るときの初期化」を担うコンストラクタです。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。