C++クラスとオブジェクト:コード例付き実践ガイド
クラスとは
C++クラスは、データとそのデータを操作する関数を1つのエンティティにまとめたユーザー定義データ型です。これを設計図と考えるとわかりやすいでしょう:そこから作成されるオブジェクトの形と振る舞いを定義します。
家の設計図がドア、窓、部屋の配置を指定するのと同様に、クラスはデータメンバの配置とそれらを操作する操作を記述します。同じ設計図から複数の家(オブジェクト)を建てられます。
上図では、単一のプロトタイプから異なる特徴を持つ2つの家が生成されています。
このチュートリアルで学ぶ内容:
- クラスとは何か、C++での重要性
- 具体的なクラス例
privateとpublicアクセス修飾子の役割- オブジェクトの作成(インスタンス化)
- データメンバへの安全なアクセス
- クラス内部/外部でのメンバ関数定義
- コンストラクタとデストラクタの動作
クラス宣言
クラス宣言は簡単です:classキーワードに続けてクラス名を書き、中括弧で本体を囲みます。
構文
class className {
// data members
// member functions
};
- className – クラスの識別子
- データメンバは通常変数として宣言
- メンバ関数が振る舞いを提供
アクセス修飾子:private vs public
アクセス修飾子はクラスメンバの可視性を制御します。
- private – メンバはクラス内部またはフレンドからのみアクセス可能
- public – オブジェクトが可視な場所からどこでもアクセス可能
オブジェクトの作成(インスタンス化)
オブジェクトはクラスのインスタンスです。オブジェクト宣言は変数宣言と同じパターンに従います:className objectName;
構文
className objectName;
- className – オブジェクトを作成するクラス
- objectName – 新しいオブジェクトの識別子
インスタンス化によりオブジェクトのメモリが割り当てられ、コンストラクタが呼ばれることがあります。
データメンバへのアクセス
publicデータメンバはドット(.)演算子でアクセスします。
例
#include <iostream>
using namespace std;
class Phone {
public:
double cost;
int slots;
};
int main() {
Phone Y6;
Phone Y7;
Y6.cost = 100.0;
Y6.slots = 2;
Y7.cost = 200.0;
Y7.slots = 2;
cout << "Cost of Huawei Y6 : " << Y6.cost << endl;
cout << "Cost of Huawei Y7 : " << Y7.cost << endl;
cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl;
cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl;
return 0;
}
出力:
ゲッター/セッターを使う理由
データへの直接アクセスや変更はカプセル化を破る可能性があります。ゲッターとセッターメンバ関数を使うと制御されたアクセスが可能になります。
カプセル化の例
#include <iostream>
using namespace std;
class ClassA {
public:
void setA(int val);
int getA() const;
private:
int a;
};
int ClassA::getA() const {
return a;
}
void ClassA::setA(int val) {
a = val;
}
int main() {
ClassA obj;
obj.setA(20);
cout << "Value of a is: " << obj.getA();
return 0;
}
出力:
protectedメンバと継承
protectedメンバはクラス内部と派生クラスからアクセス可能で、制御された継承を可能にします。
例
#include <iostream>
using namespace std;
class ParentClass {
protected:
int value;
};
class ChildClass : public ParentClass {
public:
void setId(int x) {
value = x;
}
void displayValue() {
cout << "Value is: " << value << endl;
}
};
int main() {
ChildClass c;
c.setId(21);
c.displayValue();
return 0;
}
出力:
クラス内部 vs 外部でのメンバ関数定義
メンバ関数はクラス内部でインライン定義するか、クラス内で宣言して後からスコープ解決演算子::で定義できます。
例
#include <iostream>
#include <string>
using namespace std;
class Guru99 {
public:
string tutorial_name;
int id;
void printName();
void printId() {
cout << "Tutorial id is: " << id;
}
};
void Guru99::printName() {
cout << "Tutorial name is: " << tutorial_name;
}
int main() {
Guru99 guru;
guru.tutorial_name = 'C++';
guru.id = 1001;
guru.printName();
cout << endl;
guru.printId();
return 0;
}
出力:
コンストラクタとデストラクタ
コンストラクタはオブジェクト作成時に初期化し、デストラクタはオブジェクト破棄直前にクリーンアップを行います。
例
#include <iostream>
using namespace std;
class ClassA {
public:
ClassA() {
cout << "Class constructor called" << endl;
}
~ClassA() {
cout << "Class destructor called" << endl;
}
};
int main() {
ClassA a; // コンストラクタ呼ばれる
int p = 1;
if (p) {
ClassA b; // コンストラクタ呼ばれ、ブロック終了でデストラクタ呼ばれる
} // 'a'のデストラクタはここで呼ばれる
return 0;
}
出力:
重要なポイント
- C++は根本的にオブジェクト指向;クラスが構成要素
- クラスはデータと関連関数をグループ化し、再利用可能な設計図を作る
public、private、protectedでカプセル化を強制- クラス名に続けてオブジェクト名でインスタンス化
- publicメンバはドット演算子でアクセス;privateデータにはゲッター/セッターを使用
- メンバ関数はインライン定義かクラス外部で
::で定義可能 - コンストラクタで初期化、デストラクタでクリーンアップ
C言語
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
- C++演算子を徹底解説:種類、例、サンプルプログラム付き
- C++ switch文をマスター:構文、使い方、実践例
- C++動的配列の確保をマスター:コード例付き実践ガイド
- C++構造体を実例で徹底解説
- C++のstd::listをマスターする:構文、関数、実践例
- C++ structとclassの違い:構文、特徴、使い分けのベストプラクティス
- C#抽象クラス実践チュートリアル:コード例で理解する設計パターン