ヘッダーファイルで関数プロトタイプを使用する
このステップでは、関数プロトタイプと、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 << "加算:" << x << " + " << y << " = " << add(x, y) << std::endl;
std::cout << "減算:" << x << " - " << y << " = " << subtract(x, y) << std::endl;
std::cout << "乗算:" << x << " * " << y << " = " << multiply(x, y) << std::endl;
std::cout << "除算:" << 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
出力例:
加算: 10 + 5 = 15
減算: 10 - 5 = 5
乗算: 10 * 5 = 50
除算: 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 << "電卓演算:" << 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
出力例:
電卓演算:
10 + 5 = 15
10 - 5 = 5
関数プロトタイプとヘッダーファイルに関する要点:
- ヘッダーファイル(.h) は関数プロトタイプ、クラス、およびその他の宣言を行います。利用可能な関数を示すインターフェイスとして機能します。
- ソースファイル(.cpp) はヘッダーファイルで宣言された関数の実際の実装を行います。関数がどのように機能するかのコードを含んでいます。
#ifndef
、#define
、および #endif
(インクルードガード)は、同じヘッダーファイルの多重インクルードを防ぎ、潜在的なコンパイルエラーを回避します。
- ヘッダーファイルを使用することで、モジューラリティとコードの再利用性が向上します。
- ヘッダーファイルを使うことで、「何をするか」(宣言)と「どのようにするか」(実装)を分離することができます。
- コードの整理を容易にし、保守と理解を促進します。
ヘッダーファイルをレストランのメニューのように考えることができます。メニュー(ヘッダー)は利用可能なものをリストし、キッチン(ソースファイル)は実際の料理を用意します。