【C++】クラスの定義とメンバ関数の実装方法を解説

目次

はじめに

C++のオブジェクト指向プログラミングの核となるのが「クラス (class)」です。クラスは、関連するデータ(メンバ変数)と、それらを操作するための一連の関数(メンバ関数)を一つにまとめた、独自のデータ型の「設計図」です。

この記事では、C++におけるクラスの基本的な定義方法と、クラスに属するメンバ関数の処理内容を記述(実装)する2つの主要な方法について、分かりやすく解説します。


クラスの基本的な定義

クラスを定義するには、class キーワードに続けて、任意のクラス名を指定し、ブロック {} の中にメンバを記述します。

// 「商品」クラスの定義
class Product {
public: // 外部からアクセス可能にする
    // メンバ変数
    int id;
    std::string name;
    
    // メンバ関数のプロトタイプ宣言
    void display();
};

解説:

  • class Product { ... };: Product という名前の新しいクラス型を定義しています。構造体と同様に、最後のセミコロン ; を忘れないようにしましょう。
  • public:: アクセス指定子と呼びます。public: と書くことで、これ以降に宣言されたメンバが、クラスの外部からアクセス可能になります。
  • void display();: これはメンバ関数の「プロトタイプ宣言」です。ここでは「display という名前で、引数を取らず、何も値を返さない関数がありますよ」という宣言だけを行い、具体的な処理内容は後で記述します。

メンバ関数の実装方法

方法1: クラスの外で実装する(一般的)

メンバ関数の具体的な処理内容は、クラス定義のブロックの外側に記述するのが一般的です。その際、どのクラスに所属する関数なのかを明示するために、スコープ解決演算子 :: を使います。

サンプルコード

#include <iostream>
#include <string>

using namespace std;

// --- クラスの定義 ---
class Product {
public:
    int id;
    string name;
    
    // メンバ関数のプロトタイプ宣言
    void display();
};

// --- メンバ関数の実装 ---
// Productクラスに所属するdisplay関数であることを :: で示す
void Product::display() {
    cout << "商品ID: " << id << endl;
    cout << "商品名: " << name << endl;
}

int main() {
    Product item1;
    item1.id = 101;
    item1.name = "高機能マウス";
    
    // メンバ関数を呼び出す
    item1.display();
    
    return 0;
}

解説:

  • void Product::display(): 関数名 (display) の前に クラス名:: (Product::) を付けることで、「これは Product クラスの display 関数です」とコンパイラに伝えています。
  • ヘッダーファイルとソースファイル: 実際の開発では、クラスの定義(プロトタイプ宣言まで)をヘッダーファイル.h.hpp)に、メンバ関数の実装をソースファイル.cpp)に分割して記述するのが一般的です。これにより、コードの管理がしやすくなります。

方法2: クラスの中で実装する(インライン関数)

処理内容が非常に短いメンバ関数に限り、クラス定義のブロックの中で直接、処理を実装することもできます。このように実装された関数は「インライン関数」として扱われます。

サンプルコード

#include <iostream>
#include <string>

using namespace std;

// クラス定義の中でメンバ関数を実装
class Product {
public:
    int id;
    string name;
    
    // display関数をインラインで実装
    void display() {
        cout << "商品ID: " << id << endl;
        cout << "商品名: " << name << endl;
    }
};

int main() {
    Product item1;
    item1.id = 101;
    item1.name = "高機能マウス";
    item1.display();
    return 0;
}

解説: インライン関数は、呼び出しのオーバーヘッドが少なくなるため、パフォーマンスがわずかに向上する可能性があります。しかし、クラス定義が長くなり可読性が落ちるため、ごく短いゲッター/セッターのような関数に限定して使うのが良いでしょう。


まとめ

今回は、C++のクラス定義と、メンバ関数の2つの実装方法について解説しました。

  • クラス (class) は、メンバ変数メンバ関数を一つにまとめた設計図。
  • メンバ関数は、プロトタイプ宣言をクラス定義内で行い、実装をクラスの外 (クラス名::関数名) に記述するのが一般的。
  • 短い関数であれば、クラス定義内で直接実装するインライン関数も利用できる。

クラスの定義と実装を分離するスタイルは、オブジェクト指向プログラミングにおけるコードの構造化の基本です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次