ヘッダーファイルで関数プロトタイプを使用する
このステップでは、関数プロトタイプと、C++ でヘッダーファイルを使用して関数を整理および宣言する方法について学びます。関数プロトタイプは、実装(関数の本体)を提供せずに、関数の名前、戻り値の型、およびパラメータを宣言します。ヘッダーファイルを使用することで、関数のインターフェース(その宣言)を実装から分離します。この分離は、コードの整理を改善し、プログラムの複数の部分や複数のプログラムで関数を保守および再利用しやすくします。
WebIDE を開き、~/project ディレクトリに 3 つのファイルを作成します。
まず、math_functions.h を作成します。
touch ~/project/math_functions.h
math_functions.h に次のコードを追加します。
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H
// 数学演算のための関数プロトタイプ
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
double divide(double a, double b);
#endif // MATH_FUNCTIONS_H
.h ファイルは宣言に使用され、関数プロトタイプやその他の宣言を含みますが、実装は含みません。このように、実装せずに関数を宣言できます。#ifndef、#define、および#endif ディレクティブはインクルードガードと呼ばれ、ヘッダーファイルの複数回インクルードを防ぎ、エラーの原因となる可能性があります。
次に、math_functions.cpp を作成します。
touch ~/project/math_functions.cpp
math_functions.cpp に次のコードを追加します。
#include "math_functions.h"
// 関数実装
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
double divide(double a, double b) {
// ゼロ除算のチェック
if (b == 0) {
return 0;
}
return a / b;
}
この .cpp ファイルには、ヘッダーファイルで宣言された関数の実際の С++ 実装が含まれています。
最後に、main.cpp を作成します。
touch ~/project/main.cpp
main.cpp に次のコードを追加します。
#include <iostream>
#include "math_functions.h"
int main() {
// ヘッダーファイルからの関数呼び出しを実証する
int x = 10, y = 5;
std::cout << "Addition: " << x << " + " << y << " = " << add(x, y) << std::endl;
std::cout << "Subtraction: " << x << " - " << y << " = " << subtract(x, y) << std::endl;
std::cout << "Multiplication: " << x << " * " << y << " = " << multiply(x, y) << std::endl;
std::cout << "Division: " << x << " / " << y << " = " << divide(x, y) << std::endl;
return 0;
}
この main.cpp ファイルは math_functions.h ヘッダーファイルをインクルードしており、これにより関数プロトタイプが利用可能になります。その後、math_functions.cpp の実装済み関数を使用できます。
複数のソースファイルを使用してプログラムをコンパイルします。
g++ math_functions.cpp main.cpp -o math_operations
./math_operations
出力例:
Addition: 10 + 5 = 15
Subtraction: 10 - 5 = 5
Multiplication: 10 * 5 = 50
Division: 10 / 5 = 2
より複雑なヘッダーファイルを持つ別の例を作成しましょう。
calculator.h を作成します。
touch ~/project/calculator.h
calculator.h に次のコードを追加します。
#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator {
public:
// 電卓演算のための関数プロトタイプ
int add(int a, int b);
int subtract(int a, int b);
int calculate(int a, int b, char operation);
};
#endif // CALCULATOR_H
このヘッダーファイルは Calculator という名前のクラスとそのパブリックメソッドを宣言します。
calculator.cpp を作成します。
touch ~/project/calculator.cpp
calculator.cpp に次のコードを追加します。
#include "calculator.h"
int Calculator::add(int a, int b) {
return a + b;
}
int Calculator::subtract(int a, int b) {
return a - b;
}
int Calculator::calculate(int a, int b, char operation) {
switch (operation) {
case '+': return add(a, b);
case '-': return subtract(a, b);
default: return 0;
}
}
この calculator.cpp は、calculator.h ヘッダーファイルで宣言されたメソッドの実装を提供します。
calculator_main.cpp を作成します。
touch ~/project/calculator_main.cpp
calculator_main.cpp に次のコードを追加します。
#include <iostream>
#include "calculator.h"
int main() {
Calculator calc;
std::cout << "Calculator Operations:" << std::endl;
std::cout << "10 + 5 = " << calc.calculate(10, 5, '+') << std::endl;
std::cout << "10 - 5 = " << calc.calculate(10, 5, '-') << std::endl;
return 0;
}
このメインファイルは Calculator クラスを使用し、演算を実行します。
電卓プログラムをコンパイルします。
g++ calculator.cpp calculator_main.cpp -o calculator
./calculator
出力例:
Calculator Operations:
10 + 5 = 15
10 - 5 = 5
関数プロトタイプとヘッダーファイルに関する重要なポイント:
- **ヘッダーファイル(.h)**は、関数プロトタイプ、クラス、およびその他の宣言を宣言します。これらはインターフェースとして機能し、利用可能な関数を概説します。
- **ソースファイル(.cpp)**は、ヘッダーファイルで宣言された実際の関数を実装します。これらは、関数がどのように機能するかについてのコードを含みます。
#ifndef、#define、および#endif(インクルードガード)は、同じヘッダーファイルの複数回インクルードを防ぎ、潜在的なコンパイルエラーを回避します。
- ヘッダーファイルの使用は、モジュール性(modularity)とコードの再利用性(reusability)を促進します。
- ヘッダーファイルにより、「何を」(宣言)「どのように」(実装)を分離できます。
- コードの整理を容易にし、保守と理解を容易にします。
ヘッダーファイルはレストランのメニューのようなものだと考えることができます。メニュー(ヘッダー)は利用可能なものをリストし、キッチン(ソースファイル)は実際の料理を準備します。