インクルードガードの必要性

 なぜ重複インクルードされると困るのかといいますと、コンパイルエラーになるからです(笑)。理由を以下に説明します

 #includeが行う処理は(わかりやすく言えば)テキストファイル(この場合は.cpp)の中に別のテキストファイル(この場合はhoge.h)を単純にコピー&ペーストするだけなのです。これにより、以下のような3つのヘッダファイルを作ったときに問題が発生します。

classA.h

 class classA{
 	...
 };

classB.h

 #include "classA.h"
 class classB{
 	...
 };

classC.h

 #include "classA.h"
 #include "classB.h"
 class classC{
 	...
 };

この時、classC.hは、実際には以下のように展開されてしまいます

 class classA{
 	...
 };
 class classA{ //classB.hでインクルードされた//classC.hでインクルードされた
 	...
 };
 class classB{                               //classC.hでインクルードされた
 	...
 };
 class classC{
 	...
 };

 みてわかるとおり、classAが2回宣言されてしまいます。これは「すでに定義されているクラスが再定義されました」という旨のコンパイルエラーを吐き出します。