09:クラスの定義と使い方

はじめに

この章では、C++でオブジェクト指向プログラミングの基本となる「クラス」について学びます。


クラスとは何か

クラスは「設計図」です。


最低限のクラス定義と実行例(09_hello_class.cpp)

C++で最もシンプルなクラスの例として、次のような形からスタートできます。 まずは読めるようになることを目指してください。

#include <iostream>
using namespace std;

// クラスの定義
class Greeting {
public:
    void sayHello() {
        cout << "Hello, World!" << endl;
    }
};

int main() {
    Greeting g;  // クラスからオブジェクトを作成
    g.sayHello();  // メンバ関数を呼び出し

    return 0;
}

解説

このように、クラスは型を作り、オブジェクトはその型の実体 という関係になります。


クラスの定義と使い方(09_student_example.cpp)

#include <iostream>
using namespace std;

// クラスの定義
class Student {
public:
    string name;
    int score;

    void show() {
        cout << name << " の点数は " << score << " 点です。" << endl;
    }
};

int main() {
    // クラスからオブジェクトを作成
    Student s;
    s.name = "Tanaka";
    s.score = 80;

    s.show();  // メンバ関数を呼び出し

    return 0;
}

解説

public: で公開メンバ(外からアクセス可能)を宣言と説明しましたが、これはアクセス修飾子と呼ばれ、どこからアクセス可能か を指定するものです。


アクセス修飾子とは(public / private / protected)

C++のクラスでは、メンバのアクセス範囲を指定できます。

修飾子 アクセスできる範囲 用途
public どこからでも可 外部から使わせたい関数や変数
private クラス内部からのみ可 外部に見せたくないデータや内部処理
protected クラスとその派生クラスから可 継承先には公開したいが、外部からは隠したい場合

例:privateな変数とpublicな関数の使い方(09_account_example.cpp)

class Account {
private:
    int balance;

public:
    Account() {
        balance = 0;
    }

    void deposit(int amount) {
        balance += amount;
    }

    void show() {
        cout << "残高: " << balance << "円" << endl;
    }
};

このように、データを隠して操作だけを公開するのが基本的なクラス設計です。

理解度チェック

問題1(09_class_basic.cpp)

次のコードを実行すると何が表示されますか?

#include <iostream>
using namespace std;

class Book {
public:
    string title;

    void print() {
        cout << "タイトル: " << title << endl;
    }
};

int main() {
    Book b;
    b.title = "C++入門";
    b.print();
    return 0;
}
正解・解説を見る
タイトル: C++入門

演習問題

問題2(09_class_practice.cpp)

「商品」を表す Product クラスを作成し、

解答例を見る
// 09_class_practice.cpp
#include <iostream>
using namespace std;

class Product {
public:
    string name;
    int price;

    void display() {
        cout << name << " は " << price << " 円です。" << endl;
    }
};

int main() {
    Product p;
    p.name = "りんご";
    p.price = 150;
    p.display();

    return 0;
}

↓は枝情報です

メソッド?メンバ関数?

オブジェクト指向の話をしていると、「メソッド」という言葉を耳にすることがあります。 ところが、C++ではあまり「メソッド」という言葉は使われません。 代わりに「メンバ関数(member function)」と呼ぶのが一般的です。

■メソッドとメンバ関数の違い

実は機能的な違いはありません。 どちらも「クラスの中で定義され、オブジェクトから呼び出される関数」のことです。

■なぜ呼び方が違うの?

言語の設計思想と歴史の違いによります。

用語 主な使用言語 背景
メンバ関数 C++, C++系教材 C言語の流れをくんだ関数中心の設計
メソッド Java, Python, C# 純粋なオブジェクト指向を前提とした設計

C++は C 言語の拡張として生まれたため、「関数」という言葉をそのまま使い、「クラスの中にある関数=メンバ関数」と呼ぶようになりました。

■メソッドと呼んではいけない?

いいえ、呼んでも間違いではない ただし、C++の文脈では「メンバ関数」という言葉が定着しているため、ドキュメントや講義ではそれに合わせて使った方が自然です。

■まとめ

メソッドもメンバ関数も意味は同じ。 ただし、C++では「メンバ関数」と呼ぶのが一般的。 なぜなら、C++は「関数」中心のC言語から進化したからです。


まとめ