C++では、クラスや構造体に所属する関数を「メンバ関数」と呼びます。
他の言語でいう「メソッド」に相当する概念で、クラスのオブジェクトに関連した処理を定義するために使います。
メソッドは、同じクラスのメンバ変数にアクセスできることが特徴です。
メソッドと通常の関数の違い
通常の関数はクラスに属さず、単独で呼び出せます。
一方、メソッドはオブジェクトに紐づくため、オブジェクトを通して呼び出します。
メソッドを使うことで、データと処理を一体化させ、オブジェクト指向の設計が可能になります。
アクセス制御
C++では、メンバ変数やメソッドに対してアクセス権を指定できます。
- public: クラスの外からアクセス可能
- private: クラスの外からアクセス不可
- protected: 継承先のクラスからのみアクセス可能
この仕組みにより、データの安全性を保ちつつ、必要な操作のみを公開できます。
getter と setter
外部から private なメンバ変数にアクセスしたい場合は、getter と setter を利用します。
getter は値を取得するため、setter は値を設定するためのメソッドです。
setter 内で入力チェックを行うことで、不正な値が入るのを防げます。
クラス内定義とクラス外定義
メソッドはクラス内で定義することも、クラス外で定義することもできます。
クラス外で定義する場合は、スコープ解決演算子 (::) を用いて、どのクラスのメソッドかを明示する必要があります。
const メソッド
メソッドに const を付けると、そのメソッド内でメンバ変数を変更できないことを意味します。
読み取り専用の getter など、オブジェクトの状態を変更しない処理には const を付けるのが一般的です。
const メソッドは、const 参照やポインタ経由でオブジェクトを扱う場合にも呼び出せます。
static メソッド
static メソッドは、オブジェクトを生成せずにクラス名から直接呼び出せるメソッドです。
ただし、通常のメンバ変数にはアクセスできず、static メンバ変数のみ利用できます。
また、this ポインタは存在しません。
コンストラクタとデストラクタ
- コンストラクタ: オブジェクト生成時に自動で呼ばれる特別なメンバ関数です。戻り値の型は書かず、クラス名と同じ名前にします。
- デストラクタ: オブジェクト破棄時に呼ばれる特別なメンバ関数です。リソースの解放や後片付けに利用されます。
デストラクタは、特にポリモーフィックな基底クラスでは virtual にすることで、派生クラスのリソースも正しく解放されます。
C++の特徴である RAII(Resource Acquisition Is Initialization)の設計と組み合わせることで、安全にリソース管理が可能です。
メソッドとオブジェクト指向の基本
メソッドはオブジェクトが「できること」を表現します。
クラス内のデータを直接公開するのではなく、メソッドを通じて操作することで、データの安全性や一貫性を保つことができます。
メソッドのオーバーロード
同じ名前のメソッドを複数定義し、引数の型や数で使い分けることができます。
これにより、同じ概念の処理を統一した名前で扱いやすくなります。
仮想メソッドとポリモーフィズム
virtual キーワードを付けると、派生クラスでメソッドを上書きできます。
基底クラスのポインタや参照を通して呼び出しても、実際のオブジェクトの型に応じたメソッドが実行されます。
これをポリモーフィズムと呼び、C++のオブジェクト指向設計で重要な機能です。
override と純粋仮想メソッド
- override: 派生クラスで基底クラスの仮想メソッドを上書きするとき、誤りがあればコンパイル時に検出されます。
- 純粋仮想メソッド:
= 0を付けることで、派生クラスで必ず実装することを要求できます。このようなクラスは抽象クラスとなり、直接インスタンス化できません。
メソッド設計のポイント
- オブジェクトの振る舞いを表現する
メソッドは「オブジェクトができること」を実装します。 - データを安全に管理する
重要なメンバ変数はprivateにして、getter/setter を通じて操作します。 - 変更しないメソッドには
constを付ける
値を取得するだけの処理には必ずconstを付けることで、安全性と可読性が向上します。 - 参照や入力チェックを活用する
大きなオブジェクトはコピーを避けるためにconst参照で受け取り、setter では不正値のチェックを行います。
まとめ
C++のメソッド(メンバ関数)は、オブジェクト指向設計の核となる概念です。
安全で効率的なメソッド設計には、次の点を押さえるとよいでしょう。
- クラス内でのデータ操作はメソッド経由で行う
- 読み取り専用の処理には
constを付ける - オブジェクトを生成せずに呼ぶ処理には
staticを使う - 派生クラスでの振る舞い変更には
virtualとoverrideを活用する - リソース管理にはコンストラクタとデストラクタを正しく設計する
これらのポイントを理解すると、C++でのクラス設計やオブジェクト指向プログラミングがより安全かつ効率的に行えます。
以上、C++のメソッドについてでした。
最後までお読みいただき、ありがとうございました。
