C++におけるプログラムの構造
これまでにC++のプログラムがどのように構成されているのか疑問に思ったことはありますか。本ガイドでは、この言語におけるあらゆるプログラムの基本構造を形作る技術的基盤を解説し、各要素の「何」であるかだけでなく「なぜ」であるかも理解できるようにします。
学習目標:
この授業を終える時、学生は次のことができるようになります
- 理解する
#includeによるプリプロセッサディレクティブの目的と使用法、およびコードの整理における役割。 - 理解する C++におけるプログラムの基本構造、特にエントリーポイントとしての
main()関数。 - 使用する
iostreamライブラリを用いてデータの入出力を管理する。 - 記述する コメントを通してコードの機能を説明する。
目次:
プリプロセッサディレクティブ #include
プログラム本体: main()関数
コードにコメントを付けることを忘れない
ここまでで最初の「Hello World」を書きました。ここでは、このコードを用いてそれぞれの部分を分析していきます。
/*これはプリプロセッサディレクティブであり、
iostreamヘッダを含めています*/
#include <iostream>
// main関数はコードの主要ブロックに対応します
int main() {
// 画面に "Hola, mundo!" という文字列を表示
std::cout << "Hola, mundo!" << std::endl;
// オペレーティングシステムに0を返す
return 0;
}
プリプロセッサディレクティブ #include
プリプロセッサディレクティブとは、コンパイラがコードをコンパイルする前に処理する命令です。これらのディレクティブによって、プログラマは外部リソースを取り込んだり、事前設定を定義したりすることができます。最もよく使用されるディレクティブの一つが#includeであり、これはプログラムに必要なライブラリを含めるために用いられます。
#includeの使用方法
標準ライブラリを含める基本的な構文は次の通りです。
#include <nombre_biblioteca>
山括弧(< と >)の使用は、プリプロセッサに対してコンパイラの標準ディレクトリ内でライブラリを探すよう指示します。例えば、データの入出力を扱うiostreamライブラリを含めるには次のように記述します。
#include <iostream>
iostreamの特徴
iostreamライブラリには、データフローを操作するためのクラスやオブジェクトが含まれています。代表的な要素には以下が挙げられます。
std::cin: キーボードからのデータ入力に使用されます。std::cout: コンソールへのデータ出力を可能にします。std::cerr: エラーメッセージの表示に用いられます。std::clog: ログメッセージの出力用フローを提供します。
std::cinとstd::coutを用いた基本的な例:
#include <iostream>
int main() {
std::string nombre;
std::cout << "Ingrese su nombre: ";
std::cin >> nombre;
std::cout << "Hola, " << nombre << "!" << std::endl;
return 0;
}
独自ライブラリのインクルード
プログラマが設計したライブラリを含める場合も、同じ#includeディレクティブを使用しますが、構文が異なります。
#include "nombre_biblioteca.h"
二重引用符を使用することで、プリプロセッサはまず現在のプロジェクトディレクトリ内でライブラリを検索します。見つからない場合は、標準ディレクトリで検索されます。
カスタムライブラリの例:
// ファイル "mi_biblioteca.h"
void saludar() {
std::cout << "Hola desde una biblioteca personalizada!" << std::endl;
}
// ファイル principal.cpp
#include <iostream>
#include "mi_biblioteca.h"
int main() {
saludar();
return 0;
}
プログラム本体: main() 関数
main()関数は、C++におけるすべてのプログラムのエントリーポイントです。ここからコードの実行が開始され、この関数の定義は本言語で機能するプログラムにとって不可欠です。
main()の基本的な定義
main()を定義する最も簡単な形は次の通りです。
int main() {
// ここにプログラムを書く
return 0;
}
この定義において:
int: 関数main()が返すデータ型を指定します。この場合、intは整数値を返す必要があることを意味します。return 0;: オペレーティングシステムに対して、プログラムが正常に終了したことを示します。この値は終了コード(exit code)と呼ばれ、0は通常成功を表し、その他の値はエラーを示すことがあります。
なぜ戻り値の型はintなのか
C++の標準では、main()関数は戻り値の型としてint(整数)を持たなければならないと定められています。これは、プログラム終了時にその状態を判断するためにオペレーティングシステムが戻り値を必要とするからです。例えば:
0はプログラムが正常に終了したことを示します。0以外の値は特定のエラーを示すために用いられます。
voidなど異なる戻り値の型でmain()を定義することは一部のコンパイラでは可能ですが、C++標準には準拠せず、互換性の問題を引き起こす可能性があります。
コードにコメントを付けることを忘れない
コメントはコードを文書化し、その理解を容易にするために不可欠です。コメントはプログラムの実行には影響しませんが、特定の部分の目的や背後にあるロジックを説明するのに役立ちます。コードが複雑なロジックを持っている場合や、精緻な設計作業を要した場合には特に重要です。自分のコードを記述または読んでいる時に明確に理解できているという感覚に惑わされてはいけません。その明確さは翌日には完全に失われているかもしれません。コードはできる限り明快かつ整然としているべきであり、コメントはこの明確さを維持するための指針として必要です。
C++には主に2種類のコメントがあります。
- 1行コメント:
// これは1行だけのコメントです
- 複数行コメント:
/* これはコメントであり、 複数行にわたって 記述することができます */
行うべきこと
- 複雑なアルゴリズムやプログラムの難解な部分についてコメントで説明すること: これにより、将来の読者(自分自身を含む)が実装されたロジックを迅速に理解できるようになります。
- 仲間にとって理解しやすい形でコメントを書くこと: チームや共同プロジェクトで作業する際には特に重要です。
避けるべきこと
- 明白なことを説明したり繰り返したりするためにコメントを使うこと: 例えば、
int suma = a + b;の直前に// この行は2つの数を加算すると書くのは有益ではありません。 - 読みづらいコードをコメントで正当化すること: コメントは重要ですが、コードの明快さが常に優先されるべきです。読みやすく整理されたコードは理解に必要なコメントが少なくて済みます。
- コメントを更新しないこと: コードを編集する際には、コメントが変更を反映していることを確認してください。古いコメントは混乱を招く可能性があります。
