Comcept
オブジェクト指向とプログラム言語を同時に学ぼうという、ちょっと欲張りな本です。基本は、C++ を学んで簡単なアプリケーションを作ってみよう、という路線なのですが、C++ を使いこなすための必要な知識(オブジェクト指向や、簡単なクラス図の書き方)までを含めて解説していきます。この方法をとっているのは、プログラム言語の初心者にとって、単にプログラム言語の文法や使い方を覚えても、次のステップである「自分でプログラムを組もう」という段階に移ることが難しいためです。
普通の入門書とは異なり、少し C++ の詳細を省きながら、本を読み終えた頃には C++ でオブジェクト指向的なプログラミングができる、ところまで引っ張っていきます。
目次
第1章 はじめに(C++とは)
最初に、C++がオブジェクト指向言語であるを明言します。
ただし、本書ではオブジェクト指向の流れに囚われず、C++言
語を学んでいくというストーリーを解説します。クラスを使う→ク
ラスを作るという流れを説明します。簡単な図を書いて「オブジェ
クト」とは何か、を説明します。専門用語は使いません。
最終章では、オブジェクト指向が理解できるところまでいきつき
ます、と明言します。
第2章 コンパイル環境を整える
C++を学ぶにあたって学習環境を整えます。VC++, BCB5.5(ボ
ーランド社)、g++(cygwin) を対象にします。
第3章 Hello C++ World.
一番最初のプログラミングです。
よくわけはわからないけれども、サンプルコードをそのままタイ
ピングすると、実行される、プログラミングが動く、という流れだ
けを書きます。
第4章 変数、宣言
数値には int、文字列には string を使います(ここで既にクラ
スを使います)。
変数を宣言する場所、どんな感じで使うか、を図入りで説明しま
す。
第5章 クラス
実は string はクラスである、ことを説明します。
ここではクラスを使うこなす、ことを目的とします。
クラスは色々なメソッドを持っている、ことを解説していきます。
第6章 制御文
if や for などの制御文を解説します。
第7章 関数、メソッド
関数やメソッドを作る、ことを説明します。
関数の仮引数や、スコープ、クラスのメソッドの追加を実際に行
います。
初歩的なクラスを作る、ことができるようになります。
第8章 cin, cout
標準入出力クラスである cin, cout を使います。
第9章 string, vector
文字列クラス string 、配列クラス vector を使いこなします。
第10章 配列、ポインタ
単純な一次元配列の説明、ポインタを解説します。
ポインタは、クラスのポインタの説明も含めます。
第11章 例外処理
try-catch を使った例外処理を説明します。
第12章 オブジェクト指向
いままで知識を集めて、オブジェクト指向に照らし合わせていき
ます。小難しい議論はさけて、C++でオブジェクト指向に沿った
クラスを作成して、サンプルアプリケーションを作ります。
第5章や第7章で学んだ部分、第9章で使われる string や vec
tor を使っていきます。
本文例
まずは、1頭の馬をクラスにします。名前はいつでも参照できるように公開(public)属性にしておきます。体重は、読み取り用にしたいので非公開(private)にしておいて、getWeightメソッドで体重を取得できるようにします。走るメソッドと食べるメソッドはweight属性を変更する公開メソッドです。
なあんだ、簡単なことじゃないの、と読者のみなさんは思うかもしれません。なにを当たり前のことを書いているのだろう、と疑問に思ってくだされば筆者の意図がばっちり伝わっている証拠です。
では、ペガサスクラスを考えてみましょう。ペガサスには馬に羽が生えています。羽があるので空を飛べます。
馬クラスとペガサスクラス
この馬クラスとペガサスクラスの関係を実際にプログラムコードで示してみましょう。
class Pegasus : public Horse
{
public:
void fly() { // 飛ぶ
weight -= 100;
}
};
ペガサスクラス(Pegasus)は馬クラス(Horse)を継承します。異なる点は飛ぶメソッド(flyメソッド)だけなので、これを追加します。
あっけないですね。ほとんど頭を使わずにペガサスクラスを作ってしまいました。本書の読者のみなさんは、馬クラスとペガサスクラスがほとんど変わらないという点から、
「継承」という言葉が思い浮かぶでしょう。馬クラスと同じようにペガサスクラスを一から作らずとも、継承を使えば飛ぶメソッドを追加しておしまいです。
もうひとつ問題を考えてみます。馬クラスに子馬を産むメソッドを付け加えてみましょう。birthメソッドを追加して新しい馬オブジェクトを作成してください。
class Horse {
...
Horse *birth() {
Horse *baby = new Horse();
baby->name = name + " Jr.";
baby->weight = 10;
return baby;
}
};
馬クラスを例にとってクラス継承や隠蔽化、拡張を具体的に示していきましたがどうでしょうか。実に素直にプログラムが書けることが体験できましたか。
オブジェクト指向言語ではC++に限らず、同じような形でクラスの継承や拡張が可能になっています。読者はこれからJavaやC#などの他のプログラム言語に触れる機会があると思いますが、どのプログラム言語であっても「オブジェクト指向」という横軸をみたときには、同じようにプログラミングを行うことが可能です。それぞれのプログラム言語の利点を活かしつつオブジェクト指向に努めることが大切になります。
本書では、オブジェクト指向言語としてのC++の解説書になりますが、オブジェクト指向のむずかしい用語や概念は出てきませんでした。ですが、ここまで本書を読み進めた読者のみなさんには、既にC++のクラスを作ることによって、オブジェクト指向のスタイルが身についています。機会があれば、オブジェクト指向の概念を詳しく説明した解説書を手にとってみてください。読者のみなさんならば、以前よりもずっとわかりやすく身近に感じるはずです。
馬クラス