blog.dopana

Back

C++入門シリーズの第4回です。関数を使うと、コードの塊に名前を付け、入力を受け取り、どこからでも呼び出せます。あらゆるプログラムを構造化するための核となる道具です。

なぜ関数か#

関数はコードを再利用可能にし、テストしやすく、読みやすくします。同じロジックをコピーする代わりに、一度書いて何度も呼び出します。

最初の関数#

#include <iostream>

int add(int a, int b) {
    return a + b;
}

int main() {
    int result = add(3, 4);
    std::cout << result << '\n';  // 7を出力
}
cpp

addは2つのintパラメータを取り、intを返します。34は実引数です。

戻り値の型とvoid#

値を返さない関数の戻り値の型はvoidです:

void greet(std::string name) {
    std::cout << "Hello, " << name << "!\n";
}
cpp

前方宣言#

定義より前に呼び出す場合 — 例えば複数ファイルに分割するとき — 先に宣言します:

int multiply(int x, int y);   // 宣言

int main() {
    std::cout << multiply(6, 7) << '\n';
}

int multiply(int x, int y) {  // 定義
    return x * y;
}
cpp

宣言は定義と完全に一致している必要があります。

値渡しのパラメータ#

デフォルトでは、C++は実引数をパラメータにコピーします。関数内の変更は呼び出し元に影響しません:

void increment(int x) {
    ++x;
}

int main() {
    int a = 5;
    increment(a);
    std::cout << a << '\n';  // 依然として5
}
cpp

呼び出し元の変数を変更するには参照を渡します — 次回の記事で解説します。

デフォルト引数#

パラメータにデフォルトを設定できます:

void print(std::string msg, int times = 1) {
    for (int i = 0; i < times; ++i) {
        std::cout << msg << '\n';
    }
}

print("hi");        // 1回出力
print("hi", 3);     // 3回出力
cpp

オーバーロード#

パラメータリストが異なれば、同じ名前の関数を複数定義できます:

int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
cpp

コンパイラが実引数の型から適切なものを選びます。

結論#

関数はC++プログラムの構成要素です: 宣言、定義、呼び出し、再利用。シリーズ次回はポインタと参照です。

参考文献#