C++入門|C++とオブジェクト指向

C++の本格修行は、オブジェクト指向から始まる。クラスを戦士の設計図、オブジェクトを実際に動く戦士として理解しよう。

ここまで、C++の基本文法として、cin、cout、string、名前空間、bool、ポインタなどを学んできました。

これらは、C++でプログラムを書くための大切な基本技です。
そしてここからは、C++らしさが強く出てくる大事な考え方に入ります。

それが、オブジェクト指向です。

C++は、C言語の文法を受け継ぎながら、オブジェクト指向の仕組みを使えるようにした言語です。
そのため、C++を本格的に理解するには、クラスとオブジェクトの考え方がとても重要になります。

オブジェクト指向とは、プログラムの中で扱うデータや処理を、現実世界の「もの」のようにまとめて考える方法です。

ドラゴンボール風にたとえるなら、1人の戦士には、戦闘力、修行時間、流派のようなデータがあります。
さらに、修行する、移動する、攻撃する、防御する、といった動作もあります。

これらをバラバラに置くのではなく、戦士という1つのまとまりとして扱うのが、オブジェクト指向の考え方です。

オブジェクト指向の用語意味ドラゴンボール風のイメージ
オブジェクトデータと動作を持つもの実際に動く戦士
クラスオブジェクトの設計図戦士を作るための設計図
インスタンスクラスから作られた実体設計図から誕生した戦士
メンバ変数オブジェクトが持つデータ戦闘力、修行時間
メンバ関数オブジェクトが行う動作修行する、移動する
メンバメンバ変数とメンバ関数の総称戦士の能力と行動のまとまり

この考え方が分かると、class、public、メンバ変数、メンバ関数、インスタンス生成といったC++の文法が、ただの記号ではなく、プログラムを整理するための仕組みとして見えてきます。

図:オブジェクトはデータと動作を持つまとまり

この図が示していること

この図では、オブジェクトがデータと動作を持つまとまりであることを表しています。

Warriorオブジェクトには、powerやtrainingTimeのようなデータがあります。
さらに、train()やmove()のような動作もあります。

C++では、このデータをメンバ変数、動作をメンバ関数としてクラスの中に定義します。

オブジェクト指向とは何か

オブジェクト指向のオブジェクトとは、もの、物体、対象といった意味を持つ言葉です。

プログラムでは、扱いたい対象を1つの「もの」として考えます。
そして、そのものが持っているデータと、そのものができる動作をまとめます。

たとえば、戦士オブジェクトを考えてみましょう。

戦士には、次のようなデータがあります。

データ内容
戦闘力戦士の強さ
修行時間どれくらい修行したか
流派どの修行体系に属しているか

また、戦士には次のような動作があります。

動作内容
修行する戦闘力を高める
移動する別の場所へ進む
防御する攻撃を受け止める

オブジェクト指向では、こうしたデータと動作を別々に散らばらせるのではなく、1つのまとまりとして扱います。

つまり、戦闘力だけを単独の変数として置くのではなく、戦士というオブジェクトの中に持たせます。
修行する処理も、単独の関数として置くのではなく、戦士が持つ動作として定義します。

このように整理すると、プログラムの構造が現実世界の考え方に近くなり、読みやすくなります。

内部の仕組みを知らなくても使える

オブジェクト指向では、使う側が内部の仕組みをすべて知っている必要はありません。

たとえば、近未来の修行装置を使う場面を考えてみましょう。
利用者は、装置の中でどんな計算が行われているのか、どんな部品が動いているのかをすべて知る必要はありません。

必要なのは、修行時間を指定する、開始する、結果を見る、といった操作です。

オブジェクトも同じです。

Warriorオブジェクトにtrainというメンバ関数があるなら、使う側は次のように呼び出します。

warrior.train(1.5);

このように書けば、1.5時間修行する処理を実行できます。

その中で、成長ポイントをどう計算するかは、train関数の中に書いておけばよいのです。

オブジェクト指向では、使う側と作る側を分けて考えやすくなります。

メンバ変数とメンバ関数

クラスの中に定義する変数を、メンバ変数と呼びます。
クラスの中に定義する関数を、メンバ関数と呼びます。

そして、メンバ変数とメンバ関数をまとめて、メンバと呼びます。

用語意味Warriorクラスの例
メンバ変数クラスが持つデータpower
メンバ関数クラスが持つ動作train(double hour)
メンバメンバ変数とメンバ関数の総称powerとtrain

ドラゴンボール風にたとえるなら、メンバ変数は戦士の能力値です。
メンバ関数は、戦士が実行できる技や行動です。

たとえば、戦士の戦闘力を表すpowerはメンバ変数です。
指定した時間だけ修行するtrainはメンバ関数です。

クラスはオブジェクトの設計図

クラスとは、オブジェクトを作るための設計図です。

設計図には、そのオブジェクトがどのようなデータを持ち、どのような動作ができるのかを書きます。

ドラゴンボール風にたとえるなら、クラスは戦士を作るための設計図です。

Warriorクラスには、戦士が持つ戦闘力や、修行する動作が書かれています。

クラスに書かれる内容
メンバ変数power
メンバ関数train(double hour)

このWarriorクラスをもとにして、実際に使える戦士オブジェクトを作ります。

インスタンスとは何か

クラスから作られた実体を、インスタンスと呼びます。

クラスは設計図です。
設計図だけでは、まだ実際に動く戦士はいません。

Warriorクラスという設計図を使って、実際の変数としてwarriorを作ると、そこで初めて戦士オブジェクトを使えるようになります。

Warrior warrior;

このwarriorが、Warriorクラスから作られたインスタンスです。

用語意味
クラス設計図Warrior
オブジェクト実際に扱うものwarrior
インスタンスクラスから作られた実体Warrior warrior;で作られたwarrior

クラスがなければ、インスタンスは作れません。
インスタンスを作ることで、メンバ変数に値を入れたり、メンバ関数を呼び出したりできます。

図:クラスは設計図、インスタンスは実際の戦士

この図が示していること

この図では、クラスとインスタンスの関係を表しています。

Warriorクラスは、戦士を作るための設計図です。
その設計図から、warrior1、warrior2、warrior3のように複数のインスタンスを作れます。

C++では、クラスを定義し、そのクラスからインスタンスを生成することで、オブジェクトを使えるようになります。

C++でオブジェクト指向のプログラムを書く

ここからは、C++で簡単なクラスを作り、オブジェクトを使うプログラムを見ていきます。

このサンプルでは、Warriorクラスを作ります。
Warriorクラスには、戦闘力を表すpowerというメンバ変数と、修行する動作を表すtrainというメンバ関数を用意します。

プロジェクトは、次の3つのファイルで構成します。

ファイル役割
warrior.hクラスの宣言を書く
warrior.cppメンバ関数の定義を書く
main.cppインスタンスを作って利用する

C++では、クラスの宣言をヘッダーファイルに書き、メンバ関数の具体的な処理をcppファイルに書くことがあります。

このように分けることで、設計図、具体的な処理、実際に使う場所を整理できます。

ヘッダーファイルの追加

プロジェクトを作成したら、Visual Studio 2026のソリューションエクスプローラーの「ヘッダーファイル」を右クリックし、「追加」→「新しい項目」を選択します。

①「ヘッダーファイル」を右クリック
②「追加」→「新しい項目」をクリック

すると「新しい項目の追加」ダイアログが現れるので、ヘッダーファイルを選択し「名前」の欄に「warrior.h」と入力します。

③「名前」に「car.h」と入力
④「追加」をクリック

すると、ソリューションエクスプローラーの「ヘッダーファイル」の中に「warrior.h」が追加されます。

クラスの宣言を書く

まず、クラスの宣言を書きます。

クラスの宣言では、このクラスにはどのようなメンバ変数やメンバ関数があるのかを示します。

プロジェクト/ファイル名: Chap3_01/warrior.h

#ifndef _WARRIOR_H_
#define _WARRIOR_H_

class Warrior {
public:
    // 戦闘力
    double power;

    // 修行する
    void train(double hour);
};

#endif // _WARRIOR_H_

このファイルでは、Warriorクラスを宣言しています。

Warriorクラスには、次の2つのメンバがあります。

種類名前内容
メンバ変数power戦士の戦闘力
メンバ関数train指定した時間だけ修行する

ここでは、publicというアクセス指定子も使っています。

publicの中に書かれたメンバは、クラスの外から利用できます。
つまり、main.cppからwarrior.powerのように値を設定したり、warrior.train(1.5)のようにメンバ関数を呼び出したりできます。

クラス宣言の基本形

C++のクラス宣言は、次のような形で書きます。

class クラス名 {
アクセス指定子:
    メンバ変数の宣言;
    メンバ関数の宣言;
};

Warriorクラスでは、次のようになっています。

class Warrior {
public:
    double power;
    void train(double hour);
};

ここで注意したいのは、クラス宣言の最後にセミコロンが必要なことです。

};

C++では、クラス宣言の最後に必ずセミコロンを書きます。
これを忘れると、コンパイルエラーになります。

部分意味
class WarriorWarriorというクラスを宣言する
public:外部から使えるメンバを指定する
double power;戦闘力を表すメンバ変数
void train(double hour);修行するメンバ関数の宣言
};クラス宣言の終わり

クラス名は、大文字から始める書き方がよく使われます。
ここではWarriorという名前にしています。

アクセス指定子public

クラスの中にあるpublicは、アクセス指定子です。

アクセス指定子は、メンバをどの範囲から使えるようにするかを決めるものです。

ここではpublicを使っているため、powerやtrainはクラスの外から使えます。

public:
    double power;
    void train(double hour);

たとえば、main.cppでは次のように使えます。

warrior.power = 80;
warrior.train(1.5);

ドラゴンボール風にたとえるなら、publicは外部から操作できる修行メニューの受付口です。

受付口が開いているので、戦闘力を設定したり、修行を指示したりできます。

アクセス指定子にはほかの種類もありますが、ここではまず、publicに書いたメンバはクラスの外から利用できると覚えておきましょう。

メンバ変数の宣言

Warriorクラスには、powerというメンバ変数があります。

double power;

powerは、戦士の戦闘力を表すデータです。

型はdoubleなので、小数を含む値も扱えます。

変数名内容
doublepower戦士の戦闘力

メンバ変数は、オブジェクトが持つデータです。

Warriorインスタンスを作ると、そのインスタンスはpowerというデータを持つことになります。

メンバ関数の宣言

Warriorクラスには、trainというメンバ関数があります。

void train(double hour);

trainは、指定した時間だけ修行する動作を表しています。

戻り値の型関数名引数内容
voidtraindouble hour指定した時間だけ修行する

voidは、戻り値がないことを表します。

つまり、train関数は何かの値をreturnで返すのではなく、修行内容を表示する処理を行う関数です。

ここでは、クラスの中に「trainというメンバ関数があります」と宣言しているだけです。
実際にtrainがどのように動くのかは、次のwarrior.cppに書きます。

メンバ関数の定義を書く

warrior.hでは、trainというメンバ関数があることを宣言しました。
次に、trainが実際に何をするのかをwarrior.cppに書きます。

プロジェクト/ファイル名: Chap3_01/warrior.cpp

#include "warrior.h"
#include <iostream>

using namespace std;

// 修行する
void Warrior::train(double hour) {
    cout << "戦闘力" << power << "の戦士が" << hour << "時間修行" << endl;
    cout << power * hour << "ポイント成長しました。" << endl;
}

このファイルでは、Warriorクラスのtrainメンバ関数を定義しています。

注目したいのは、次の部分です。

void Warrior::train(double hour)

これは、Warriorクラスのtrain関数を定義するという意味です。

部分意味
void戻り値がない
Warrior::trainWarriorクラスのtrainメンバ関数
double hour修行時間を受け取る引数

::は、スコープ解決演算子です。
ここでは、trainがWarriorクラスに属するメンバ関数であることを示しています。

Warrior::train の意味

メンバ関数をクラスの外側で定義するときは、どのクラスのメンバ関数なのかを明示する必要があります。

そのため、次のように書きます。

void Warrior::train(double hour)

もし単にtrainと書くだけでは、どのクラスのtrainなのか分かりません。

Warrior::trainと書くことで、Warriorクラスのtrainであることをはっきり示しています。

ドラゴンボール風にたとえるなら、trainという修行技が、どの戦士設計図に属する技なのかを示しているようなものです。

メンバ関数の中ではメンバ変数を使える

train関数の中では、メンバ変数powerを使っています。

cout << "戦闘力" << power << "の戦士が" << hour << "時間修行" << endl;
cout << power * hour << "ポイント成長しました。" << endl;

powerはWarriorクラスのメンバ変数です。
trainはWarriorクラスのメンバ関数です。

同じクラスの中にあるため、train関数の中からpowerを使えます。

ここでは、powerとhourを使って、成長ポイントを計算しています。

変数内容
power戦士の戦闘力
hour修行時間
power * hour成長ポイント

このように、メンバ関数は、同じクラスのメンバ変数を利用して処理を行えます。

インスタンスを生成して使う

最後に、main.cppを見ていきます。

main.cppでは、Warriorクラスのインスタンスを作り、メンバ変数に値を入れ、メンバ関数を呼び出します。

プロジェクト/ファイル名: Chap3_01/main.cpp

#include <iostream>
#include "warrior.h"

using namespace std;

int main(int argc, char** argv) {
    // インスタンスを生成する
    Warrior warrior;

    // 戦闘力を設定する
    warrior.power = 80;

    // 指定した時間だけ修行する
    warrior.train(1.5);

    // プログラムが正常に終わったことを示す
    return 0;
}

ソリューションをビルドする

メニューの「ビルド」から「ソリューションのビルド」をクリックします。

メニューの「デバック」から「デバックなしで開始」をクリックします。

すると、次のように表示されます。

戦闘力80の戦士が1.5時間修行
120ポイント成長しました。

このプログラムでは、Warriorクラスからwarriorというインスタンスを作っています。

Warrior warrior;

この時点で、warriorは実際に使える戦士オブジェクトになります。

インスタンスの生成

次の行が、インスタンスの生成です。

Warrior warrior;

これは、Warriorクラスからwarriorという名前のインスタンスを作るという意味です。

部分意味
Warriorクラス名
warriorインスタンス名
Warrior warrior;Warriorクラスからwarriorを作る

クラスは設計図です。
この行によって、その設計図から実際の戦士が作られます。

ドラゴンボール風にいえば、Warriorという戦士設計図から、warriorという実戦用の戦士が誕生するイメージです。

図:main.cppでインスタンスを作ってメンバを使う

この図が示していること

この図では、main.cppでWarriorクラスのインスタンスを生成し、メンバ変数とメンバ関数を利用する流れを表しています。

Warrior warrior;でインスタンスを作ります。
warrior.power = 80;でメンバ変数に値を入れます。
warrior.train(1.5);でメンバ関数を呼び出します。

クラスは設計図であり、インスタンスを作ることで初めて、メンバ変数やメンバ関数を利用できるようになります。

ドット演算子でメンバにアクセスする

インスタンスを作ったら、その中のメンバ変数やメンバ関数を使えます。

C++では、インスタンスのメンバにアクセスするときにドット演算子を使います。

warrior.power = 80;
warrior.train(1.5);
書き方意味
warrior.powerwarriorのpowerメンバ変数
warrior.train(1.5)warriorのtrainメンバ関数を呼び出す

ドット演算子は、オブジェクトの中にあるメンバを指定するために使います。

ドラゴンボール風にいえば、warriorという戦士に対して、戦闘力を設定したり、修行を命令したりしているイメージです。

3つのファイルの役割を整理する

今回のサンプルは、3つのファイルで構成されています。

ファイル役割内容
warrior.hクラスの宣言Warriorクラスの設計を書く
warrior.cppメンバ関数の定義trainの具体的な処理を書く
main.cpp実行の入口インスタンスを生成して使う

このようにファイルを分けると、設計、実装、利用を整理できます。

warrior.h

warrior.hには、Warriorクラスの宣言を書いています。

ここには、どのようなメンバ変数やメンバ関数があるのかを書きます。

warrior.cpp

warrior.cppには、Warriorクラスのメンバ関数の中身を書いています。

trainが実際に何を表示し、どのような計算をするのかは、ここに書きます。

main.cpp

main.cppには、プログラムの実行開始点であるmain関数があります。

ここでWarriorインスタンスを作り、powerを設定し、trainを呼び出しています。

ヘッダーファイルとは何か

ヘッダーファイルは、クラスや関数の宣言を書くためのファイルです。

今回のwarrior.hでは、Warriorクラスの設計を書いています。

class Warrior {
public:
    double power;
    void train(double hour);
};

この宣言をmain.cppやwarrior.cppから読み込むことで、Warriorクラスを使えるようになります。

読み込むときは、次のように書きます。

#include "warrior.h"

自分で作ったヘッダーファイルを読み込む場合は、ダブルクォーテーションで囲む形がよく使われます。

ヘッダーガードの役割

warrior.hには、次のような記述があります。

#ifndef _WARRIOR_H_
#define _WARRIOR_H_

// クラス宣言

#endif // _WARRIOR_H_

これは、同じヘッダーファイルが重複して読み込まれるのを防ぐための仕組みです。

同じクラス宣言が何度も読み込まれると、コンパイル時に問題が起こることがあります。
そのため、ヘッダーガードを使って、1回だけ有効になるようにしています。

記述役割
#ifndef WARRIOR_H_WARRIOR_H_がまだ定義されていなければ
#define WARRIOR_H_WARRIOR_H_を定義する
#endif条件の終わり

最初は少し難しく見えるかもしれませんが、ヘッダーファイルを書くときの定番の形として覚えておくと安心です。

クラスを利用するにはインスタンスが必要

クラスは設計図です。
設計図があるだけでは、まだ実際のデータはありません。

Warriorクラスを使うには、次のようにインスタンスを生成します。

Warrior warrior;

このようにして初めて、warrior.powerやwarrior.train(1.5)が使えるようになります。

状態できること
クラス宣言だけどんなメンバを持つかを示す
インスタンス生成後実際にメンバ変数やメンバ関数を使える

ドラゴンボール風にいうなら、戦士の設計図だけでは修行できません。
設計図から実際の戦士を作って、はじめて戦闘力を設定したり、修行を実行したりできます。

C++とオブジェクト指向で押さえておきたいポイント

C++のオブジェクト指向では、まず次の関係をしっかり理解することが大切です。

用語意味
クラスオブジェクトの設計図Warrior
インスタンスクラスから作られた実体warrior
メンバ変数クラスが持つデータpower
メンバ関数クラスが持つ動作train
public外部から使えることを示すwarrior.power、warrior.train
::クラスに属する関数を定義するときに使うWarrior::train
.インスタンスのメンバにアクセスするwarrior.power

ドラゴンボール風に言えば、クラスは戦士の設計図、インスタンスは実際に動く戦士です。
メンバ変数は戦士の能力値、メンバ関数は戦士の行動です。

C++では、このようにデータと処理をひとまとまりにして扱うことで、プログラムを整理しやすくなります。

最初は、class、public、Warrior::train、warrior.powerのような書き方に少し戸惑うかもしれません。
でも、それぞれの意味を分けて考えると、かなり分かりやすくなります。

  • classは設計図を作る
  • publicは外から使えるメンバを示す
  • メンバ変数はデータを持つ
  • メンバ関数は動作を表す
  • インスタンスを作ると実際に使える
  • ドット演算子でメンバにアクセスする

この流れを理解すると、C++のオブジェクト指向の入口がしっかり見えてきます。
クラスという設計図からインスタンスを作り、そのインスタンスがメンバ変数とメンバ関数を持って動く、という感覚を大切にしていきましょう。