プログラムは, いくつもの変数や関数から構成されています.
クラスとは, 同じ種類の変数や関数などを, 1つにまとめたものです.
例として, 以下のコードを見てください.
#include <iostream> #include <string> using namespace std; class Company { public: Company(){ cout << "クラスが生成されました" << endl; } ~Company(){ cout << "クラスが解放されました" << endl; } void SetName(string strName){ m_strName = strName; } string m_strName; };
5行目に, "class Company"と記述されています. ここで, Companyという名前のクラスが宣言されています. クラスを構成する変数や関数は, 中括弧の間に記述します. 最後に, セミコロンがあることに注意してください.
public:
コードの7行目に, "public:"と記述されています. これを, アクセス修飾子と言います. 種類は, public・protected・privateの3つあります.
修飾子 | |||
アクセス制限 | |||
同じクラス | 継承クラス | 他のクラス | |
public | ○ | ○ | ○ |
protected | ○ | ○ | × |
private | ○ | × | × |
アクセス修飾子は, クラスの変数や関数へのアクセスを制限します.
例えば, publicで宣言した変数や関数は, main関数や他のクラスからアクセスできます.
一方, privateで宣言した変数や関数は, 同じクラスでしかアクセスできません.
(protectedと継承クラスについては, 後で解説します.)
なぜ, アクセス修飾子が必要なのでしょうか?
変数や関数にどこからでもアクセスできるのは, 一見便利であるように思えます.
しかし, 内容を間違えて書き換えてしまう可能性があるため, データを保護する点においては不都合です.
特に, 複数の開発者がプログラムを作成する際, バグの発生を防ぐためには, アクセス修飾子が不可欠です.
Company(){ cout << "クラスが生成されました" << endl; }
コードの8行目に, "Company()"という関数があります. このクラスと同じ名前の関数を, コンストラクタと言います. コンストラクタは, クラスを生成する際に, 記述された処理を実行します.
~Company(){ cout << "クラスが解放されました" << endl; }
また, コードの9行目に, "~Company()"という関数があります. このクラスの名前に"~"がついた関数を, デストラクタと言います. デストラクタは, クラスを解放する際に, 記述された処理を実行します.
なぜ, コンストラクタとデストラクタが必要なのでしょうか?
プログラムを作成する際, 「変数が初期化されていない」「ポインタのメモリ領域が確保・解放されていない」などが, バグの原因になります.
コンストラクタで変数の初期化やメモリ領域の確保を行い, デストラクタでメモリ領域の解放を行うことで, バグの発生を防ぐことができます.
string m_strName;
コードの11行目に, 変数が宣言されています. この変数を, メンバ変数と言います. 接頭語の"m_"は"member_"の省略形で, クラスに属する変数であることを表します.
void SetName(string strName){ m_strName = strName; }
また, コードの12行目に, 関数が宣言されています.
この関数を, メンバ関数と言います.
ここでは, クラスの中で, 関数の宣言と実装を記述しました.
一般に, クラスの中では関数の宣言だけを記述して, クラスの外で実装を記述すると, プログラムを編集しやすくなります.
最後に, クラスの使い方について説明します. 例として, 以下のコードを見てください.
#include <iostream> #include <string> using namespace std; class Company { public: Company(){ cout << "クラスが生成されました" << endl; } ~Company(){ cout << "クラスが解放されました" << endl; } void SetName(string strName){ m_strName = strName; } string m_strName; }; int main () { Company ABC; ABC.SetName("ABC株式会社"); cout << "会社の名前は " << ABC.m_strName << " です" << endl; return 0; }
17行目で, クラスのオブジェクトが生成されます.
すると, コンストラクタが呼ばれて, 文字列が出力されます.
次に, 18行目で, ドット演算子を用いて, メンバ関数にアクセスしています.
さらに, 19行目で, メンバ変数にアクセスして, 文字列を出力しています.
最後に, 22行目でmain関数を抜ける際, クラスのオブジェクトが解放されます.
すると, デストラクタが呼ばれて, 文字列が出力されます.
出力結果は, 以下の通りです.
クラスが生成されました 会社の名前は ABC株式会社 です クラスが解放されました
ここでは, クラスの簡単な例について説明しました.
クラスの特徴の1つとして, 同じ種類の変数や関数をまとめることで, プログラムを構成する要素の役割が明らかになることが挙げられます.
一方, プログラムの規模が大きくなると, クラスの数も膨大になるため, プログラムの設計についても注意を払わなければなりません.