この記事では、C++のクラスとオブジェクト指向プログラミングについて学びます。具体的には、クラスの定義とオブジェクトの生成、アクセス指定子(public, private, protected)、コンストラクタとデストラクタ、メンバ関数とメンバ変数、そして継承とポリモーフィズムについて解説します。
オブジェクト指向プログラミングは、現実世界の問題をより直感的に表現するための強力なツールです。これにより、コードの再利用性と保守性が向上します。
プログラムを実行するための環境構築がまだの方は「C++を実行するための環境構築|初心者でも簡単!(Windows)」をご覧ください。
クラスの定義とオブジェクトの生成
クラスは、オブジェクト指向プログラミングの基本的な概念であり、データとそのデータを操作するための関数(メソッド)を一緒にまとめたものです。オブジェクトは、クラスから生成され、クラスで定義されたデータとメソッドを持ちます。
クラスの定義とオブジェクトの生成
#include <iostream>
#include <string>
// クラスの定義
// 'Person'という名前のクラスを定義します。
class Person {
public: // このクラスのメンバは公開されます。
std::string name; // メンバ変数 'name'
int age; // メンバ変数 'age'
// メンバ関数 'sayHello'
void sayHello() {
std::cout << "Hello, my name is " << name << " and I am " << age << " years old.\n";
}
};
// オブジェクトの生成
int main() {
Person person1; // 'Person'クラスのオブジェクト 'person1' を生成します。
person1.name = "John"; // 'name' メンバ変数に値を設定します。
person1.age = 20; // 'age' メンバ変数に値を設定します。
person1.sayHello(); // 'sayHello' メンバ関数を呼び出します。
return 0;
}
実行結果
Hello, my name is John and I am 20 years old.
クラスは設計図のようなもので、オブジェクトはその設計図から作られた実体です。つまり、クラスは抽象的な概念で、オブジェクトは具体的な存在です。
クラスとオブジェクトの関係を理解するためには、「クラスは設計図で、オブジェクトはそれを元に作られた家」という比喩が役立つでしょう。
アクセス指定子(public, private, protected)
アクセス指定子は、クラスのメンバ(変数や関数)がどの程度外部からアクセス可能かを制御します。C++にはpublic
、private
、protected
の3つのアクセス指定子があります。
アクセス指定子の説明
class MyClass {
public:
int publicVar; // どこからでもアクセス可能
private:
int privateVar; // このクラス内からのみアクセス可能
protected:
int protectedVar; // このクラスおよび派生クラスからアクセス可能
};
アクセス指定子の使用例
#include <iostream>
class MyClass {
public:
int publicVar = 10;
private:
int privateVar = 20;
protected:
int protectedVar = 30;
};
int main() {
MyClass myObject;
std::cout << "Public var: " << myObject.publicVar << "\n"; // OK
// std::cout << "Private var: " << myObject.privateVar << "\n"; // コンパイルエラー
// std::cout << "Protected var: " << myObject.protectedVar << "\n"; // コンパイルエラー
return 0;
}
実行結果
Public var: 10
public
メンバはどこからでもアクセス可能で、private
メンバはそのクラス内からのみアクセス可能です。protected
メンバはそのクラスおよび派生クラス(子クラス)からアクセス可能です。
アクセス指定子を適切に使用することで、クラスの内部状態を保護し、不適切な操作から保護することができます。これは、オブジェクト指向プログラミングの重要な概念である「カプセル化」を実現します。
コンストラクタとデストラクタ
コンストラクタは、オブジェクトが生成されるときに自動的に呼び出される特殊なメソッドです。デストラクタは、オブジェクトが破棄されるときに自動的に呼び出される特殊なメソッドです。
コンストラクタとデストラクタの説明
class MyClass {
public:
MyClass() { // コンストラクタ
std::cout << "Object is being created\n";
}
~MyClass() { // デストラクタ
std::cout << "Object is being deleted\n";
}
};
コンストラクタとデストラクタの使用例
#include <iostream>
class MyClass {
public:
MyClass() { // コンストラクタ
std::cout << "Object is being created\n";
}
~MyClass() { // デストラクタ
std::cout << "Object is being deleted\n";
}
};
int main() {
MyClass myObject; // コンストラクタが呼び出される
// デストラクタが呼び出される
return 0;
}
実行結果
Object is being created
Object is being deleted
コンストラクタはオブジェクトが生成されるときに、デストラクタはオブジェクトが破棄されるときに自動的に呼び出されます。
コンストラクタはオブジェクトの初期化に、デストラクタはリソースの解放によく使用されます。これらを適切に使用することで、オブジェクトのライフサイクルを効果的に管理することができます。
メンバ関数とメンバ変数
メンバ関数とメンバ変数は、クラスの一部であり、オブジェクトの状態と振る舞いを定義します。
メンバ関数とメンバ変数の説明
class MyClass {
public:
int myVar; // メンバ変数
void myFunction() { // メンバ関数
std::cout << "This is a member function. myVar is: " << myVar << "\n";
}
};
もちろんです。それでは、メンバ関数とメンバ変数について続けましょう。
メンバ関数とメンバ変数の使用例
#include <iostream>
class MyClass {
public:
int myVar; // メンバ変数
void myFunction() { // メンバ関数
std::cout << "This is a member function. myVar is: " << myVar << "\n";
}
};
int main() {
MyClass myObject;
myObject.myVar = 10;
myObject.myFunction(); // メンバ関数を呼び出す
return 0;
}
実行結果
This is a member function. myVar is: 10
メンバ関数とメンバ変数はクラスの一部であり、オブジェクトが生成されるときにそれぞれのオブジェクトにコピーされます。
メンバ関数を通じてメンバ変数を操作することで、オブジェクトの状態を適切に管理することができます。これは、オブジェクト指向プログラミングの重要な概念である「カプセル化」を実現します。
継承とポリモーフィズム
継承は、あるクラス(親クラス)の属性と振る舞いを別のクラス(子クラス)が引き継ぐことを可能にします。ポリモーフィズムは、同じインターフェースを持つオブジェクトが異なる振る舞いをすることを可能にします。
継承とポリモーフィズムの説明
// 親クラスを定義します。
class ParentClass {
public:
// 親クラスの関数を定義します。
void parentFunction() {
// コンソールにメッセージを出力します。
std::cout << "This is a function in the parent class.\n";
}
};
// ParentClassを継承した子クラスを定義します。
class ChildClass : public ParentClass {
public:
// 子クラスの関数を定義します。
void childFunction() {
// コンソールにメッセージを出力します。
std::cout << "This is a function in the child class.\n";
}
};
継承とポリモーフィズムの使用例
#include <iostream>
// 親クラスを定義します。
class ParentClass {
public:
// 親クラスの関数を定義します。
void parentFunction() {
// コンソールにメッセージを出力します。
std::cout << "This is a function in the parent class.\n";
}
};
// ParentClassを継承した子クラスを定義します。
class ChildClass : public ParentClass {
public:
// 子クラスの関数を定義します。
void childFunction() {
// コンソールにメッセージを出力します。
std::cout << "This is a function in the child class.\n";
}
};
int main() {
ChildClass myObject;
myObject.parentFunction(); // 親クラスの関数を呼び出す
myObject.childFunction(); // 子クラスの関数を呼び出す
return 0;
}
実行結果
This is a function in the parent class.
This is a function in the child class.
継承は、コードの再利用性を向上させ、ポリモーフィズムは、同じインターフェースを持つオブジェクトが異なる振る舞いをすることを可能にします。
継承とポリモーフィズムは、オブジェクト指向プログラミングの重要な概念であり、コードの再利用性と柔軟性を向上させます。
まとめ
- クラスとオブジェクト:クラスは設計図で、オブジェクトはその設計図から作られた実体です。
- アクセス指定子:
public
、private
、protected
の3つのアクセス指定子を使用して、クラスのメンバへのアクセスを制御します。 - コンストラクタとデストラクタ:オブジェクトの生成と破棄時に自動的に呼び出される特殊なメソッドです。
- メンバ関数とメンバ変数:クラスの一部であり、オブジェクトの状態と振る舞いを定義します。
- 継承とポリモーフィズム:継承は、あるクラスの属性と振る舞いを別のクラスが引き継ぐことを可能にします。ポリモーフィズムは、同じインターフェースを持つオブジェクトが異なる振る舞いをすることを可能にします。
オブジェクト指向プログラミングは、現実世界の問題をより直感的に表現するための強力なツールです。
この記事では、C++のクラスとオブジェクト指向プログラミングについて学びました。具体的には、クラスの定義とオブジェクトの生成、アクセス指定子、コンストラクタとデストラクタ、メンバ関数とメンバ変数、そして継承とポリモーフィズムについて解説しました。これらの概念を理解することで、より効率的で再利用可能なコードを書くことができます。オブジェクト指向プログラミングは、現実世界の問題をより直感的に表現するための強力なツールであり、コードの再利用性と保守性を向上させます。これからも続けて学んでいきましょう!
次のページ >> STL(標準テンプレートライブラリ)を解説
【C++】をより詳しく学びたい方はこちら >>【C++】入門書おすすめ3選!超初心者~中級者まで網羅!
プログラムを実行するための環境構築がまだの方は「C++を実行するための環境構築|初心者でも簡単!(Windows)」をご覧ください。
コメント