l VisualC 以上のまとめクラスの基本 '97.00.00
l.お知らせ 内容 LINK FILE   HTML Win PC Unix MS-DOS C C++ Mfc Java 
目次.C++言語_ 1 クラス 2 派生クラス 5 演算子のオーバーロード クラス(1)
 準備 3 オブジェクト 6 テンプレート 8 etc クラス(2)
 CC++ 4 フレンド・多重継承 7 メモリ確保・例外処理 未使用
 クラスの派生  以上のまとめ  


T クラスを使ってみる
VisualC++ では、同じような処理を施すデータをクラスにまとめます。
クラスにまとめたデータは、クラス専用のメンバ関数で処理します。

sample.cpp
#include <iostream.h>

class C1 // クラス C1 (メンバ関数と、データの構造)
{
public: // 適用範囲の指定 public=全体
C1(int d1,int d2) //データを受取る関数(コンストラクタ)
 { D1=d1;           //受取った値 d1 を、D1 に代入。
   if(d1 < 0) D1=0; //負なら 0 にします。
   D2=d2;           //受取った値 d2 を、D2 に代入。
 } 
void disp() // データを処理する関数( 加算して表示します。 )
 { D3=D1+D2;
   cout << D1 << "+" << D2 << "=" << D3 << endl;
 }
~C1(){} // データの後始末を行う関数。(デストラクタ)
int D1,D2,D3; // データの構造
} ;

void main()
{ C1 OB1(-7,2); //オブジェクト OB1 の定義/初期化。
C1 OB2(3,4); //オブジェクト OB1 の定義/初期化。
OB1.disp(); //OB1を指定して関数をコール。
OB2.disp(); //OB2を指定して関数をコール。
OB1.D1=5; //OB1 のメンバ D1 に 5 を代入。
OB1.D2=6; //OB1 のメンバ D2 に 6 を代入。
OB1.disp(); //OB1を指定して関数をコール。
cout << "終了するには E と入力して下さい。"; 
char X[125];cin >> X; //キーボードから文字列を入力する。
}

動作
クラスの宣言では、使用するデータの型と数を決めているだけです。
次のように、データ名を指定してコンストラクタを呼び出すと、データが作られます。
main()
C1 OB1(-7,2); OB1.D1 OB1.D2 OB1.D3 が定義され、-7 と 1 が代入されます。
C1 OB2(3,4);  OB2.D1 OB2.D2 OB2.D3 が定義され、2 と 3 が代入されます。
実引数(-7,2)と(3,4)は、関数 C1 の仮引数(int d1,int d2)にコピーされ、処理されます。
次のようなデータが作られます。
クラスの型           オブシェクト (具体的なデータ)
(ユーザー定義型)
  
 int D1 
 int D2
 int D3
    インスタンス
-7 →
2 →
   
int OB1.D1 = 0
int OB1.D2 = 2
int OB1.D3
    インスタンス
3 →
4 →
   
int OB2.D1 = 3
int OB2.D2 = 4
int OB2.D3
 
← メンバ 
← メンバ
← メンバ
コンストラクタによって作られる具体的なデータは オブジェクト(object:物 対象)。
OB1 OB2 などの、個々のオブジェクトは インスタンス(instance:例 実例)。
D1 D2 D3 などの、オブジェクトの構成要素は メンバ(member:一員 メンバ)。

クラス名と同じ名前である関数 C1 は、このような特別の動作をし、コンストラクタと呼ばれます。
コンストラクタには返り値がないので、返り値の型は指定しません。

具体的な処理を行う関数は、コンストラクタが前処理したオブジェクトを使います。


クラスの宣言。

スコープの指定 (適用範囲の指定)
public  : クラスの外からも使用できます。
(D1 D2 などのデータメンバは、コンストラクタによってオブジェクトが作られてから。) 
private  : {クラスの中} だけで使用できます。
通常は、D1 D2 D3 などのデータメンバは private に指定します。
オブジェクトの値が外部から直接操作されると、コンストラクタを設ける意味がなくなってしまうからです。

メンバ関数
クラス内のデータを処理する関数です。
ソースファイルを見易くするために、クラス名も指定できます。
 C1::C1(int d1,int d2) 
 void C1::disp()
 C1::~C1()
コンストラクタ
処理関数
デストラクタ

コンストラクタ
クラス名と同じ名前を付けた、オブジェクトを生成する特別の関数です。
オブジェクトの生成と共に、オブジェクトの値を検査して訂正を行うために使用されます。
返り値はありませんので、返り値型は記述しません。

処理関数
コンストラクタによって前処理を受けたデータを処理します。

デストラクタ
クラス名の前に ~(チルド : tilde:発音記号のひとつ)を付けた、後始末をする特別の関数です。

宣言(プロトタイプ宣言)と定義
宣言 : 使用する関数やデータを宣言します。
  → コンピュータ : はい、わかりました。
定義 : 具体的な内容を定義します。
プロトタイプ(Prototype:複製に対する原形)宣言 : 名前と型だけを宣言します。
(プロトタイプ宣言を行うことによって、使用されるデータのサイズが決定されます。)

関数が他の関数を呼び出す場合は、すでに宣言済のものだけを使用できます。
複数の関数が互いに呼び出し合うようなプログラムの場合でも、
宣言だけを先に行っておけば、具体的な定義の記述の順番は制限を受けません。

上記の例では関数の宣言と定義を同時に行っています。
宣言だけを先に行うように書き換えると次のようになります。
宣言と定義を同時に行う場合
class C1
{
public:
C1(int d1,int d2)
{ D1=d1;
 if(d1 < 0) D1=0;
 D2=d2;

}
void disp()
{ D3=D1+D2;
 cout << D1 << "+" << D2
 << "=" \<< D3 << endl;
}
~C1(){}
int D1,D2,D3;
} ;
このように定義された関数は
インライン関数になる。
宣言だけを先に行う場合
(クラスの宣言)
class C1
{ public:
 C1(int d1,int d2);
 void disp();
 ~C1();
 int D1,D2,D3;
} ;
(メンバ関数の定義)
C1::C1(int d1,int d2)
{ D1=d1; if(d1 < 0) D1=0; D2=d2;}
void C1::disp()
{ D3=D1+D2;
 cout << D1 << "+" << D2
 << "=" << D3 << endl;
}
C1::~C1(){}

インライン関数
メンバ関数を inline を付けて宣言するか、
上記のようにクラスの中で定義すると、インライン関数になります。

下記は inline を付けて指定する方法の例です。
(クラスの宣言)
class C1
{ public:
 inline C1(int d1,int d2);
 inline void disp();
 inline ~C1();
 int D1,D2,D3;
} ;
(メンバ関数の定義)
inline C1::C1(int d1,int d2)
{ D1=d1; if(d1 < 0) D1=0; D2=d2;}
inline void C1::disp()
{ D3=D1+D2;
 cout << D1 << "+" << D2
 << "=" << D3 << endl;
}
inline C1::~C1(){}


T

  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.sannet.ne.jp/userpage/mtoga/index.html