C++における「クラス(Classes)」と「構造体(Structures)」は、データを管理し、プログラムの複雑さを管理するための基本的な要素です。これらのデータ構造は、データとそのデータを操作する関数を組み合わせて使用することができ、効率的なプログラムの作成を可能にします。C++はオブジェクト指向プログラミング(OOP)をサポートしており、クラスはその中心的な概念です。一方で、構造体もC++における重要なデータ型であり、特にシンプルなデータのグループ化に使用されます。この記事では、クラスと構造体の違い、使い方、特徴について詳細に解説します。
1. クラス(Classes)とは?
クラスは、C++におけるオブジェクト指向プログラミング(OOP)の基本的な構成要素です。クラスは、データメンバー(変数)とメンバ関数(関数)を持つデータ型で、インスタンス化によって具体的なオブジェクトを生成することができます。クラスの主な特徴は、カプセル化(Encapsulation)と継承(Inheritance)、ポリモーフィズム(Polymorphism)です。
クラスの構造
C++でクラスを定義する際は、classキーワードを使用します。基本的なクラスの構造は以下のようになります。
cppclass ClassName {
private:
int privateVar; // プライベートメンバー変数
public:
// コンストラクタ
ClassName(int value) {
privateVar = value;
}
// メンバ関数
void display() {
std::cout << "Value: " << privateVar << std::endl;
}
// セッター
void setPrivateVar(int value) {
privateVar = value;
}
// ゲッター
int getPrivateVar() {
return privateVar;
}
};
このクラスには、プライベートメンバー変数privateVarと、その変数を操作するためのメンバ関数display、setPrivateVar、getPrivateVarが含まれています。クラスの外部からアクセスできない変数には、privateアクセス修飾子を付けて隠蔽します。外部からは、パブリックメソッドを通じてデータにアクセスします。
コンストラクタとデストラクタ
クラスには、オブジェクトが生成される際に呼ばれる特殊な関数、コンストラクタが存在します。また、オブジェクトが破棄される際にはデストラクタが呼ばれます。
cppclass MyClass {
public:
MyClass() { // コンストラクタ
std::cout << "Constructor called!" << std::endl;
}
~MyClass() { // デストラクタ
std::cout << "Destructor called!" << std::endl;
}
};
コンストラクタはオブジェクトの初期化に使用され、デストラクタはオブジェクトの終了処理に使われます。
継承
C++では、クラスを他のクラスから派生させることができます。これを継承と呼びます。継承により、親クラスの属性とメソッドを子クラスで使用できるようになります。
cppclass Animal {
public:
void speak() {
std::cout << "Animal makes a sound" << std::endl;
}
};
class Dog : public Animal {
public:
void speak() {
std::cout << "Dog barks" << std::endl;
}
};
この例では、DogクラスがAnimalクラスを継承しており、speakメソッドをオーバーライド(上書き)しています。
2. 構造体(Structures)とは?
構造体は、C++におけるデータをまとめて保持するための基本的なデータ型です。構造体は、主に関連するデータを一つの単位としてまとめるために使用されます。C++における構造体は、C言語の構造体を基にしていますが、クラスと同様にメンバ関数を持つことができます。
構造体の基本的な使い方
構造体を定義する際には、structキーワードを使用します。以下は、構造体の基本的な定義方法です。
cppstruct Person {
std::string name;
int age;
void display() {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
構造体Personは、nameとageというメンバー変数を持っており、displayメンバ関数を使ってその情報を表示できます。
構造体とクラスの違い
構造体とクラスの主な違いは、デフォルトのアクセス修飾子です。構造体ではメンバーはデフォルトでpublicであり、クラスではデフォルトでprivateです。それ以外の点では、構造体もクラスもほぼ同じように動作します。
cppstruct Example {
int x; // public by default
};
class ExampleClass {
int x; // private by default
};
3. クラスと構造体の使い分け
クラスと構造体の使い分けは、基本的には次のように考えられます。
-
構造体は、単純にデータをまとめる場合に使用します。例えば、複数の変数をまとめて扱いたいときなどです。
-
クラスは、データをまとめるだけでなく、そのデータを操作するメンバ関数を持たせたり、カプセル化、継承、ポリモーフィズムなどの高度な機能が必要な場合に使用します。
4. クラスと構造体の具体的な使用例
クラスを使った例
以下は、クラスを使用して銀行口座を表現した例です。
cppclass BankAccount {
private:
double balance;
public:
BankAccount(double initialBalance) {
balance = initialBalance;
}
void deposit(double amount) {
balance += amount;
}
void withdraw(double amount) {
if (balance >= amount) {
balance -= amount;
} else {
std::cout << "Insufficient funds!" << std::endl;
}
}
double getBalance() {
return balance;
}
};
構造体を使った例
次に、構造体を使って日付を表現する例を示します。
cppstruct Date {
int day;
int month;
int year;
void display() {
std::cout << "Date: " << day << "/" << month << "/" << year << std::endl;
}
};
結論
C++におけるクラスと構造体は、データの管理と操作において非常に重要な役割を果たします。クラスはオブジェクト指向プログラミングの基本であり、データとその操作を密接に結びつけることができます。構造体はシンプルなデータのグループ化に最適であり、C++ではクラスと構造体の違いを理解し、用途に応じて使い分けることが重要です。
