はじめに
C++プログラミングの中心となるのが「関数」です。関数は、関連する一連の処理を一つの単位としてまとめたものであり、プログラムを構造化し、コードの再利用性を高めるために不可欠です。
この記事では、C++の関数の基本を、以下のトピックに沿って網羅的に解説します。
- 関数の宣言と定義
- デフォルト引数
- 戻り値の型の推論
- 前方宣言
main
関数
1. 関数の宣言と定義
- 宣言 (Declaration): 関数がどのようなものか(名前、引数、戻り値の型)をコンパイラに知らせます。「プロトタイプ宣言」とも呼ばれます。
- 定義 (Definition): 関数の具体的な処理内容を記述します。
サンプルコード
#include <iostream>
// 1. 関数の宣言
// int型の引数を2つ取り、int型の値を返す"add"という名前の関数
int add(int a, int b);
int main() {
int result = add(10, 20); // 宣言があるので、mainより後で定義されていても呼び出せる
std::cout << "結果: " << result << std::endl;
return 0;
}
// 2. 関数の定義(実装)
int add(int a, int b) {
return a + b;
}
2. デフォルト引数
関数の引数には、呼び出し時に値が渡されなかった場合に自動的に使われるデフォルト値を設定できます。
サンプルコード
#include <iostream>
// 第2引数(power)にデフォルト値2を設定
int calculate_power(int base, int power = 2) {
int result = 1;
for (int i = 0; i < power; ++i) {
result *= base;
}
return result;
}
int main() {
// 引数を1つだけ渡す -> 第2引数にはデフォルト値(2)が使われる
std::cout << "10の2乗: " << calculate_power(10) << std::endl;
// 引数を2つ渡す -> デフォルト値は使われない
std::cout << "3の3乗: " << calculate_power(3, 3) << std::endl;
return 0;
}
注意: デフォルト引数は、引数リストの右側から連続して設定する必要があります。void func(int a = 1, int b);
のような宣言はできません。
3. 戻り値の型の推論 (C++14以降)
auto
キーワードを使うと、関数の戻り値の型をreturn
文からコンパイラに自動で推論させることができます。
サンプルコード
#include <iostream>
// return文から、戻り値の型がintであると推論される
auto get_one() {
return 1;
}
// return文から、戻り値の型がdoubleであると推論される
auto get_pi() {
return 3.14;
}
int main() {
std::cout << get_one() + get_pi() << std::endl;
return 0;
}
4. 前方宣言
ある関数が、それより後で定義される別の関数を呼び出す場合、コンパイラはその関数の存在を知らないため、エラーになります。これを避けるために、ファイルの先頭で関数のプロトタイプ宣言を行っておく必要があります。これを前方宣言と呼びます。最初のサンプルコードの int add(int a, int b);
がこれにあたります。
5. main
関数
main
関数は、C++プログラムを実行した際に、最初に呼び出される特別な関数です。全てのC++プログラムには、必ず一つのmain
関数が存在しなければなりません。
int main()
: 引数なし。int main(int argc, char* argv[])
: コマンドライン引数を受け取る。
補足: inline
指定
関数の宣言の先頭に inline
キーワードを付けると、コンパイラに対して、その関数をインライン展開(関数呼び出しを、関数の本体コードに置き換えること)するよう促します。これにより、関数呼び出しのオーバーヘッドがなくなり、パフォーマンスが向上する可能性があります。
まとめ
今回は、C++の関数の基本について網羅的に解説しました。関数は、処理を部品化し、プログラムを構造化するための最も基本的な単位です。これらの機能を正しく理解し、使いこなすことが、大規模でメンテナンス性の高いプログラムを作成するための第一歩となります。