next up previous contents index
Next: プログラム開発の手順 Up: オブジェクト指向プログラミング Previous: クラスの設計   Contents   Index

main 関数の作成

main 関数の定義を改めて記載します。

\begin{figure*}\begin{small}
\begin{screen}
\begin{verbatim}/* main 関数の定...
...瑤猟蟲舛僚了\end{verbatim}
\end{screen}\end{small}\vspace{-1.5em}
\end{figure*}

第 12 行についてはあとから説明します。第 13 - 22 行の main 関数内の処理 も、メンバ関数と同様に関数の形で記述します。電卓の利用手続きにしたがっ て電卓オブジェクトに対するメッセージを順に書いていけばよいのです。

このプログラムでは、被加数や加数をプログラムの実行時に入れられるようにし ました。また、計算結果の出力もディスプレイに「1 + 2 = 3」のような形式で 表示してもらうことにします。クラス側ではレジスタの内容しか覚えていないの で、被加数や加数は関数 main 側で記憶しておき、出力の際利用できるように します。このため、関数 main の中で整数型の変数 x、y を宣言します。



オブジェクトの生成と変数宣言

CCalc クラスは電卓の性質を表すクラスであって、仕事を依頼する「電卓さん」 のようなオブジェクトではありません。このままでは、main 関数から使用する ことができないのです。使用するためにはこのクラスを型とした電卓型の実体で あるオブジェクトを生成しなくてはなりません。

あるクラスのオブジェクトを生成 するには、以下のような形式の宣言をします。

\begin{figure*}\begin{small}
\begin{screen}
\begin{verbatim}クラス名 オブジェクト名;\end{verbatim}
\end{screen}\end{small}\vspace{-1.5em}
\end{figure*}

具体的には、CCalc calc; のようになります。これは実は、変数宣言になってい ます。つまり、CCalc という型名をもつ変数 calc を宣言したことになります。 この宣言によって、CCalc の定義で示したような変数とメンバ関数をもつオブジェ クトが生成され、宣言で指定した calc という名前で利用可能になるのです。

宣言文 int x, y; は、main 関数中で読み込む二つの値のために用意する変数名 の宣言です。CCalc による演算で扱うデータ型は int 型に限られるので、これ らは int と宣言されています。この宣言で int 型の変数 x と y が用意されま す。これは以下のように分けて書いたのと同じことです。

    int x;
    int y;



入出力

次に第 16 行で、被加数をキーボードから受け取り x に代入します。一般にプロ グラミング言語においては、外部から計算機にデータを取り込むことを入力、外 部へ計算機からデータを送り出すことを出力といいます。また、入力と出力に使 用される装置を入出力装置とよびます。計算機の標準の入力装置はキーボードで、 これに対応して cin という オブジェクトと入力を行う演算子 » が用意さ れています。出力装置はディスプレイで、この装置に対応 する cout というオブジェクトとこれに対応した 出力を行う演算子 « が用意されています。

被加数の入力には、まずユーザに入力を促す文字列を cout « "被加数? "; でもって出力します。つまり、cout さんに "被加数? " という文字列を出力 してくださいとメッセージを送るのです。このように文字列の場合は、文字列を「"」 で囲みます。続いて cin » x; によって、cin さんにユーザの入力した数 を変数 x へ代入するようメッセージを送ります。このように変数へ入力するに は » の直後に変数を書きます。そして、17 行の calc.Set(x); によっ て x の内容をレジスタに設定しますが、その詳細については次の項を見てくだ さい。第 18 行の加数を y へ設定する方法も同様です。

入力を促す出力をプロンプトといいます。本書では、プロンプトには必ず最後 に ? をつけるようにしていますので、実行例を見る場合 ? の直後は入力である と理解してください。

なお変数の内容を出力するには cout « x; のように « の直後に 変数を直接書きます。



メッセージの送信

第 17、19、20 行ではオブジェクト calc にメッセージを送っています。 第 14 行で生成したオブジェクトは、その内部に そのオブジェクト固有のレジスタをもっ ていますし、そのレジスタの操作を行うメンバ関数も利用可能です。ですから、 手順書きにある「レジスタに数を設定する」以降の処理が可能になります。これ らを行うにはオブジェクトにメッセージを送って各メンバ関数を機能させればよ いのです。

メッセージ の送信は一般には次のように、対象とするオブジェクトの名に「.」 をつけ、さらに実行してもらいたいメンバ関数名をつけた形で行われます。

\begin{figure*}\begin{small}
\begin{screen}
\begin{verbatim}オブジェクト名 ....
...数名(実引数);\end{verbatim}
\end{screen}\end{small}\vspace{-1.5em}
\end{figure*}

オブジェクトに対してメンバ関数の呼出しがされると、プログラムの実行順が、 呼び出されたメンバ関数内の最初の文に移り実行されます。

main 関数の 17 行では、calc.Set(x) の形で関数を呼び出しています。このよ うに、関数が引数をとるように定義されている場合は、その具体的な値を指定し て関数を呼び出します。この具体的な値のことを実引数とよびます。x は変数で すが、この行までに値が決まっているので実引数として使えます。この値は関数 定義側の仮引数に渡され、関数内で利用されます。具体的には、実引数の値が仮 引数にコピーされ、制御が関数側、この場合にはクラス CCalc の Set に移動し ます。関数が所定の仕事、つまりレジスタに x を代入する作業をし終わると、 制御が関数の呼出し位置、つまり main 関数の 17 行に戻ってきます。このと き関数に戻値がある場合は、この値が呼出し位置にコピーされますが、この 場合には void と戻値がないので何も起きません。

第 18 行で y が決定されると、次に第 19 行 calc.Add(y); により、calc にメ ンバ関数 Add(y) の実行を依頼します。まず、y の値が Add 関数側の引数 x に コピーされ、かつ制御が Add 関数に渡されます。そして関数内の一文 r += x; によって、レジスタに x を加えます。

第 20 行の長い文は、r に記憶されている値を cout すなわちディスプレイに 出力するものです。まず、文中の calc.Show() について説明しましょう。calc にメッセージ Show() を送ると、関数 Show は引数を一つももたないので、制御 は直ちに関数 Show に渡されます。Show 関数では、return r; によりレジス タの内容を返すことになっているので、calc.Show() はレジスタの内容に置き換 わります。

このことを前提にして出力文を読んでみましょう。第 20 行を見てもらうと、標 準出力オブジェクト cout に、« により次々と変数 x、文字列 " + "、 変数 y、文字列 " = "、calc.Show() の結果、文字 '\n' が送られてい きます。ディスプレイにはこれらが順次表示されることになります。文字は一般 に 'A' などのようにシングルクォートで囲みますが、'\n' は特殊な 文字で、ディスプレイには何の文字も表示しませんが、代わりに印字位置を改行 させる働きをもちます。

最後に、以上の文を包含する main 関数の構造について説明しましょう。main 関数の定義もメンバ関数と同様で、以下のような構造をしています。

\begin{figure*}\begin{small}
\begin{screen}
\begin{verbatim}戻値の型 main(仮...
...亡悗垢覽述 }\end{verbatim}
\end{screen}\end{small}\vspace{-1.5em}
\end{figure*}

特別な関数とはいえ main も関数ですから戻値や引数をもつことができます。一 般の関数と異なり main 関数は他の関数から呼び出されることはありません。でも、 main 関数も戻値や引数をもつことができます。

では、戻値はどこに返されるのでしょうか。引数はどこから具体的な値を与え られるのでしょうか。それは、このプログラムを実行したプログラムすなわち、 オペレーティングシステムとユーザとのインターフェースをとるシェルとかコマ ンドラインインタープリタとかよばれるプログラムで指定したデータによって値 が与えられます。なお、コマンドライン引数についての詳細は[*]章 で説明します。

main 関数は整数 0 を返していますが、それも上位のプログラムに返されます。 一般にプログラムが無事に終了したときには 0 を返す約束になっています。し たがって main 関数の戻値の型は int とします。また、このプログラムではコ マンドラインから main にデータを与える必要もないので、引数は取らないこと とし( )の中は空にしました。



プリプロセッサ

第 12 行に現れた #include ... のように、# で始まる記述はプリ プロセッサ指令とよばれ、プログ ラムを計算機のわかる機械語に翻訳する際に必要な様々な前処理を指令します。 機械語にどのように翻訳していくかについては次節で述べますが、#include ... は、C や C++ にあらかじめ備えられているいくつかのライブラリ関数と よばれる関数を使う際に必要だとだけ覚えてください。例えば、ここで使って いる cout « ... や cin » ... という機能は、あとの章で説明するように、組 込み関数の一種です。しかし、黙っていても使えません。関数の使い方や定義 などの書かれたヘッダファイル とよばれるものを我々のプログラムへ組み込む必要があります。

それには、上記プログラムにあるように #include <iostream.h> と書くこと で達成されます。#include によって、後ろの < > 内で指定したファイルが、そ の位置に挿入されます。iostream.h ファイルは C++ が標準で保持して いるヘッダファイルの一つで、入出力などに関係した基本的な情報が記述されて います。以降のプログラミングにおいては、ほとんどすべてのプログラムで入 出力をしますので、必ずファイルの先頭に #include <iostream.h> を挿入し ます。


問題2   ある大学の学籍番号は、上位 2 桁が入学年 度の下 2 桁、下 2 桁が学生の一連番号を表しています。問題1で追加した CCalc のメソッドを用いて、学籍番号を表す 4 桁の整数を読み込み、入学年度と一連番号を画面に出力するプログラムを書いて ください。


next up previous contents index
Next: プログラム開発の手順 Up: オブジェクト指向プログラミング Previous: クラスの設計   Contents   Index
Yoichi OKABE 2006-05-20