オブジェクトプログラミングとは

ここの説明は非常に退屈で睡眠効果抜群ですが、C++の重要な部分ですのでしっかり読んでください。 全てわからなくても結構ですが、あとでここを読み返してみてください。 C++言語はC言語の拡張版です。C++にはCの全ての機能があります。 さらに、オブジェクト指向もサポートされています。 ここでは、C++の特徴について説明します。

C++のプログラムはCのものと似ています。 main()文から始まり、コマンド引数を含めるには、Cと同様argc,argvを使用します。 しかし、C++では独自のオブジェクト指向ライブラリが定義されています。

オブジェクト指向について
オブジェクト指向プログラミング(Object-Oriented Programming:OOP)とは、一口で言うと カプセル化(encapsulation)ポリモーフィズム(polymorphism)継承(inheritance)という特徴を備えた言語です。 C言語のような構造化プログラミングは、適度な複雑なプログラムでは、優れた効果を発揮しますが、 もちろん限界があります。そこで開発されたのがオブジェクト指向プログラミングです。 構造化プログラミングとオブジェクト指向プログラミングのどちらを使用するかは個人の自由ですが、 目的に適したように使えると良いでしょう。 まず、上で出てきたカプセル化、ポリモーフィズム、継承について説明しましょう。


カプセル化(encapsulation)

カプセル化は、プログラムコードとプログラムコードが扱うデータを一体化して、 外部の干渉や誤用から両者を保護するための仕組みです。 プログラムコードとデータの組み合わせによりオブジェクト(object)が作成されます。 オブジェクト内のデータやプログラムには非公開(private)公開(public)があり、 外部からアクセスできるか否かで決まります。


ポリモーフィズム(polymorphism)

ポリモーフィズムとは、1つの名前を複数の関連する目的に使用できるようにすることです。 この説明ではわからないと思うので、例をあげると、 C言語では整数、長整数、浮動小数点数値の絶対値を求めるためにはそれぞれabs(),labs(),fabs()といった関数を使用しなければならなかった。 しかし、C++では引数を変えてabs()のみでOKです。 このように、1つの関数名を複数の異なる目的に使用することを関数のオーバーロードといいます。 関数のオーバーロードにより、関数を使い分けるという複雑なことをしなくてすむのです。

さらに、ポリモーフィズムは演算子にも適用されます。 これを演算子のポリモーフィズムといいます。

ポリモーフィズムを使うと、関連する複数の機能に対して標準インターフェースを作成できるため、 より複雑なプログラムに対処できます。


継承(inheritance)

継承とは、1つのオブジェクトが他のオブジェクトの特色を獲得するプロセスのことです。 継承という使用すると、階層的な分類をオブジェクトがサポートできます。 例えば、アヒルは鳥のクラスに属し、そのクラスの性質を受け継いでいます。 さらに、鳥は動物のクラスにも属し、動物クラスの性質も受け継ぐことができます。

さて、以上で簡単ながら、C++特徴を述べました。 わからなくても、結構ですがカプセル化、ポリモーフィズム、継承(インヘリタンス)という言葉くらいは覚えておいてください。

2つのC++
実はC++には2種類のコンパイラが存在します。 C++の標準化される前のバージョンと標準化されたものです。 これらによって、実行される部分には違いがないのですが、 ヘッダ部分に若干の違いがあります。 使用しているコンパイラがどちらのバージョンをサポートしているかは、 ヘッダ部分を試してみると良いでしょう。 私はMicrosoftのVisual C++6.0を使用しているのですが、標準化された方で実行しています。 以下にヘッダの違いを書きましょう。

1	/*
2	 * 初期のC++スタイル
3	 */
4	#include <iostream.h>
5	
6	int main()
7	{
8		/* 実行されるコード */
9		
10		return 0;
11	}
これが、初期のC++のヘッダ部分になります。 なんだかCに似ていますね。 ちなみに、iostream.hはC++の入出力システムをサポートするヘッダファイルです。 Cでは、標準入出力のstdio.hにあたります。
次は、標準化されたC++のスタイルです。

1	/*
2	 * 標準化されたC++スタイル
3	 */
4	#include <iostream>
5	using namespace std;
6	
7	int main()
8	{
9		/* 実行されるコード */
10		
11		return 0;
12	}
これを見ると、ヘッダ部分が違いますね。 しかも、なんだかnamespaceなんてわけのわからない名前空間を使うなんていってるみたいだし。 さて、それでは、名前空間ってなんでしょう。
名前空間(namespace)

『新しいスタイルのヘッダをプログラムにインクルードすると、そのヘッダの内容がstd名前空間に含まれます。 名前空間とは、単に宣言された領域のことです。 名前空間の目的は、名前の競合を防ぐために、識別子の名前を局所化することです。 これまでは、ライブラリ関数の名前及びこの種の項目は、単純にグローバルな名前空間に置かれていました(Cもおんなじ)。 新しいスタイルのヘッダの内容はstd名前空間に置かれます。』 なんて、「独習C++」には書いてありますが、よくわかりません。 とにかく、変数名などが名前空間に格納されるイメージなんでしょうか。 名前空間については、「独習C++」で後の方に詳しく出ているようなので、あとで扱います。

using namespace std;
この文がコンパイルされた後は、古いヘッダファイルと新しいヘッダファイルの相違はなくなります。 結局、namespaceの宣言をしておくのがいいのかもね。 ただし、古いコンパイラでは、実行されないと思うので、初期のC++のスタイルでプログラムするのが良いでしょう。

C++のコンソール出力

さて、main()文の雛型が出来上がったので、何か出力してみましょう。 まずはお約束のHello Worldです。


1	#include <iostream>
2	using namespace std;
3	
4	int main()
5	{
6		int i;
7		double d;
8		char s[128];
9
10		cout << "Hello World\n";
11		cout << "何か2つの数値を入力して下さい。";
12		cin >> i >> d;
13		cout << i << "と" << d << "ですね。\n";
14		cout << "文字列を入力して下さい。\n";
15		cin >> s;
16		cout << s << "ですね\n";
17
18		return 0;
19	}
ここでは、coutにより、Hello Worldを出力しています。 さらに、cinにより、数値などの入力をしています。 Cではprintf()やputs()などで表示をしていたと思いますが、 C++では、coutでコンソール出力をします。 入力に関しても、Cでは、scanf()などで入力を受け付けていましたが、 C++では、cinにより、入力します。 よく見ると、>>や<<なんて文字も見えませんか? はてこれは何でしょう? Cをやっていた人なら、これらはシフト演算子として知っていたと思います。 C++では、入出力関数の代わりに入出力演算子を使用します。 <<は出力演算子、>>は入力演算子と呼ばれます。 C++ではシフト演算子の機能だけではなく、入出力演算子として活躍します。 同じ記号でも、別の働きをするんですね。つまり、これってC++の特徴の1つのポリモーフィズムの一例なんです。 うーん、なんだか難しいそうですね。

拡張された<<演算子と>>演算子は、演算子のオーバーロードの例です。 C++の入出力演算子を使うには,プログラムにヘッダにインクルードする必要があります。