C++におけるクラスとオブジェクトの違いを徹底解説!具体例でわかる基礎知識
この記事では、C++プログラミングにおける「クラス」と「オブジェクト」の違いについて、具体例を交えながら詳しく解説します。オブジェクト指向プログラミングの基礎を固めたい方は、ぜひ参考にしてください。
C++におけるクラスとは
- クラスは、C++でオブジェクト指向プログラミングを実現するためのコードの基本構成要素(ビルディングブロック)です。
- クラスはユーザーが自由に定義できる「ユーザー定義型」です。
- クラスは独自のデータメンバー(変数)とメンバー関数(メソッド)を持ちます。
- これらのメンバーには、クラスのインスタンス(オブジェクト)を作成することでアクセスできます。
- データメンバーは変数を操作するために使われ、メンバー関数はクラス内のオブジェクトがどのように振る舞うべきかを定義する役割を担います。
- クラスは、オブジェクトの「設計図(ブループリント)」と考えると分かりやすいでしょう。
クラスの具体例:従業員(Employee)クラス
- 従業員クラスを例に考えてみましょう。従業員名、年齢、生年月日、役職など、多くの属性が考えられます。
- これらの属性が「データメンバー」に相当します。
- 一方、メンバー関数としては、クラスのオブジェクトに対して特定の処理を行う「draw_salary(給与の支払い)」や「get_promotion(昇進の処理)」などが挙げられます。
- これらは、すべての従業員オブジェクトに共通する性質となります。
クラスの定義方法
クラスは「class」キーワードを使用して定義します。キーワードの後にクラス名を記述し、クラス本体を波括弧({})で囲み、最後にセミコロン(;)を付けて終了します。
class class_name {
// クラスの本体
};C++におけるオブジェクトとは
- オブジェクトとは、クラスのインスタンスのことです。
- クラスを定義した時点では、メモリは割り当てられません。
- オブジェクトを生成した瞬間に、クラスのすべての属性に対してメモリが割り当てられます。
- クラスの定義によって、オブジェクトの仕様(属性や振る舞い)が決まります。
- クラスを実際に利用して何らかの操作を行うには、オブジェクトを作成する必要があります。
オブジェクトの作成方法
オブジェクトは、以下の構文を使って明示的に作成します。
class_name object_name;
ドット演算子によるメンバーへのアクセス
クラスのデータメンバーやメンバー関数には、ドット(.)演算子を使ってオブジェクト経由でアクセスできます。必要な属性とメンバー関数を持つクラスが定義済みであれば、そのクラスのオブジェクトを作成した後、メンバー関数は次のように呼び出せます。
object_name.member_function()
public(公開)として定義されたデータメンバーも、同様に「.」演算子を使ってアクセスできます。
アクセス指定子(public・private・protected)
- publicメンバー:「public」キーワードで定義されたメンバーで、オブジェクトから直接アクセスできます。
- privateメンバー:「private」キーワードで定義されたメンバーで、オブジェクトから直接アクセスすることはできません。
- 「public」「private」「protected」の3つのキーワードは、データメンバーへのアクセス制御(アクセス指定子)と呼ばれます。
インライン関数について
- クラス内で定義されたメンバー関数は、デフォルトでインライン関数として扱われます。
- インライン関数とは、関数の定義箇所で即座に展開される関数のことです。コンパイル時に関数の本体が呼び出し箇所すべてにコピーされます(マクロと似た仕組みです)。
- これにより、関数呼び出しにかかるオーバーヘッドを削減できます。
- クラス外の通常の関数も、「inline」キーワードを付けることでインライン関数にできます。
まとめ:クラスとオブジェクトの違い
| 項目 | クラス | オブジェクト |
|---|---|---|
| 正体 | オブジェクトの設計図(ユーザー定義型) | クラスの実体(インスタンス) |
| メモリ | 定義してもメモリは割り当てられない | 生成時にメモリが割り当てられる |
| 作成方法 | 「class」キーワードで定義 | 「class_name object_name;」で生成 |
| 役割 | 属性と振る舞いを定義する | 定義された属性や関数を実際に利用する |
クラスはあくまで「型」や「設計図」であり、オブジェクトはその設計図をもとに実際にメモリ上に生成された「実体」です。この2つの関係を正しく理解することが、C++のオブジェクト指向プログラミングを習得するための第一歩となります。
-
C++におけるドット演算子(.)とアロー演算子(->)の違いを徹底解説
C++では、ドット演算子(.)とアロー演算子(->)はどちらもクラスのメンバーにアクセスするために使用されますが、それぞれ使用される場面が異なります。C++において、class、struct、unionとして宣言された型はすべて「クラスタイプ」とみなされるため、以下の説明はこれら3つすべてに当てはまります。基本的な使い分けa.b は、b がオブジェクト a(またはオブジェクトへの参照[1])のメンバーである場合にのみ使用できます。つまり、a.b の形式では、a は常にクラスの実際のオブジェクト(またはその参照)でなければなりません。a->b は、本質的に (*a).b の省略記法で
-
C#におけるクラスと構造体の違いを徹底解説
C#におけるクラスと構造体の基本的な違い クラス(Class)と構造体(Struct)を正しく使い分けるためには、まず両者が「データの定義と保持」という点において、ほぼ同等の役割を果たすことを理解しておく必要があります。どちらもデータメンバーを定義し、既定値を保持することが可能です。しかしそれ以外の側面、たとえばメモリ管理や継承といった機能面で比較すると、クラスの方が構造体よりも柔軟性が高く、より多くの機能を提供しています。 以下の表に、クラスと構造体の重要な違いを6つの観点からまとめました。 番号項目クラス構造体 1データ型クラスで定義されたデータは、メモリ上に参照として格納され、ア