クラスの基礎

クラスって分かりますよね? ここではクラスの概念は分かっている事としてC++でのクラスの使い方を説明します。



■クラスの書式
class クラス名
{
private:(省略可能) ・・・私的部
 変数または関数
  ・
  ・
protected:(省略可能)・・・保護部
 変数または関数
  ・
  ・
public:(省略可能)  ・・・公開部
 コンストラクタ(省略可能)--->クラスが生成される際にはじめに実行される関数(注1)
 デストラクタ(省略可能) --->クラスが破棄される際に実行される関数(注2)
 変数または関数
  ・
  ・
}

※Propertyが存在しないのを除けばDelphiのクラスとほとんど変わりがありません。また、VBのへなちょこクラスとはかなり違いますので注意して下さい。

(注1)コンストラクタの規則
   (1)クラスの名前と同じ名前にしなければならない。
   (2)引数を付加することができるが戻り値を付加してはいけない。
   (3)publicメンバに記述しなければいけない。
(注2)デストラクタの規則
   (1)クラスの名前と同じ名前にして「~」をつけなければいけない。
   (2)引数がなし戻り値もなしにしなければならない。
   (3)publicメンバに記述しなければいけない。


■クラスメンバのアクセレベル
クラス X 外部からのアクセス クラスXを継承したクラスY
私的メンバ(private) アクセス不可 アクセス不可
保護メンバ(protected) アクセス不可 アクセス可能
公開メンバ(public) アクセス可能 アクセス可能

■メンバの参照書式
クラスが実体の場合 クラスがポインタの場合
「.」で参照 「->」で参照

■メンバ関数の記述書式
(戻り値) クラス名:メンバ関数
{
 何らかの処理
   ・
   ・
}


■以下はクラスのメンバに名前(登録名)を保持してその名前を変更できるクラスサンプルです。

#include <iostream.h>
#include <string.h>

class Test
{
private:
 char *Name;
protected:
 void ChangeName(const char *buf);
public:
 Test(char *buf); //コンストラクタ(構築子)
 ~Test();     //デストラクタ(消滅子)
 void ShowName() ;
 void ChangeNameEx(const char *buf);
};

//コンストラクタ
Test::Test(char *buf)
{
 //バッファ確保
 Name=new char[100];
 strcpy(Name,buf);
}

//デストラクタ
Test::~Test()
{
 //バッファ解放
 delete(Name);
}

void Test::ShowName()
{
 cout<<"現在の登録名は"<<"\""<<Name<<"\"です。"<<endl;
}

void Test::ChangeName(const char *buf)
{
 strcpy(Name,buf);
}

void Test::ChangeNameEx(const char *buf)
{
 //クラス自身はprivate/protectedメンバを自由に使える
 ChangeName(buf);
}

void main(void)
{
 Test MyClass("デニス・リッチー");
 char str[100] ;

 MyClass.ShowName();

 cout<<"名前を変更します。あなたの名前を入力してください。"<<endl;
 cin>>&str[0];

 //外部アクセスの場合はクラスのprivateメンバは呼び出せません。
 //strcpy(MyClass.Name,str);
 //外部アクセスの場合はクラスのprotectedメンバは呼び出せません。
 //MyClass.ChangeName(str);
 

 cout<<"名前を変更しましたので表示します。"<<endl;
 MyClass.ChangeNameEx(&str[0]);
 MyClass.ShowName();

 //画面表示を保つ為使用
 char buf;
 cout<<"何か入力してください"<<endl;
 cin>>buf;
}

※名前を「ABCDEF」に変更した場合は「ABCDEF」と表示される。

C++のクラスはクラス変数の宣言をするだけで自動的にクラスの実体を生成/破棄(スコープの終了部分で自動的に破棄)します。しかし、毎回勝手に生成するようにするとメモリの無駄使いなので下記のように実体を動的に作ることもできます。動的で作成する場合はnew演算子を使用してdeleteで破棄しなければいけません。また、ポインタになるのでメンバの参照は「.」ではなく「->」を使用する事になります。

void main(void)
{
 char str[100] ;
 Test *MyClass; //実体ではなくポインタ宣言

 //オブジェクトの実体作成
 MyClass =new Test("デニス・リッチー");

 //適当な処理
 MyClass->ShowName();
 cout<<"名前を変更します。あなたの名前を入力してください。"<<endl;
 cin>>&str[0];
 cout<<"名前を変更しましたので表示します。"<<endl;
 MyClass->ChangeNameEx(&str[0]);
 MyClass->ShowName();

 //画面表示を保つ為使用
 char buf;
 cout<<"何か入力してください"<<endl;
 cin>>buf;

 //オブジェクトの実体破棄
 delete(MyClass);
}





C++の基礎のページへ



ホーム PV ランキング