月ノ書

【C++】関数応用|引数と戻り値の使い方・便利な関数設計

この記事でわかること
  • 引数と戻り値を組み合わせて便利な関数を作る方法
  • 関数に値を渡す「引数」の使い方
  • 関数から値を返す「戻り値」の使い方

引数と戻り値とは

簡単にいうと 「入力(引数) → 処理 → 出力(戻り値)」 のイメージです

関数の基本構文

戻り値の型 関数名(引数リスト) {
    // 処理
    return 戻り値; // 戻り値がある場合
}

実例:引数あり・戻り値なし

名前を受け取って挨拶を表示する関数です

#include <iostream>
#include <string>
using namespace std;

void greet(string name) {
    cout << "こんにちは、" << name << "さん!" << endl;
}

int main() {
    greet("○○");
    greet("××");
    return 0;
}
こんにちは、○○さん!
こんにちは、××さん!

※ string を値渡しするとコピーされるため、大きなデータでは参照渡しで最適化できます(後述)

実例:引数なし・戻り値あり

関数で処理結果を返す例です

#include <iostream>
using namespace std;

int getAnswer() {
    return 42;
}

int main() {
    int x = getAnswer();
    cout << "答えは " << x << " です" << endl;
    return 0;
}
答えは 42 です

実例:引数あり・戻り値あり(一般的)

2つの値を受け取り合計を返す関数です

#include <iostream>
using namespace std;

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

int main() {
    cout << "5 + 7 = " << add(5, 7) << endl;
    return 0;
}
5 + 7 = 12

複数の引数

例:3教科の平均値を計算する関数

#include <iostream>
using namespace std;

double average(int a, int b, int c) {
    return (a + b + c) / 3.0;
}

int main() {
    cout << "平均点: " << average(70, 85, 90) << endl;
    return 0;
}
平均点: 81.6667

関数の応用

早期 return

無駄なネストを減らすテクニックです

#include <iostream>
using namespace std;

int safeDivide(int a, int b) {
    if (b == 0) return 0; // エラー時は 0 を返す
    return a / b;
}

int main() {
    cout << safeDivide(10, 2) << endl;
    cout << safeDivide(10, 0) << endl;
    return 0;
}
5
0

可変長引数

std::vector を使うと可変長データを渡せます

#include <iostream>
#include <vector>
using namespace std;

double avgVec(const vector<int>& v) {
    if (v.empty()) return 0.0;
    int sum = 0;
    for (int x : v) sum += x;
    return (double)sum / v.size();
}

int main() {
    vector<int> v = {1,2,3,4};
    cout << avgVec(v) << endl;
    return 0;
}
2.5

複数の戻り値

std::pairstruct を使えば、複数値をまとめて返せます

#include <iostream>
#include <vector>
#include <utility>
using namespace std;

pair<int,int> minMax(const vector<int>& v) {
    if (v.empty()) return {0,0};
    int mn = v[0], mx = v[0];
    for (int x : v) {
        if (x < mn) mn = x;
        if (x > mx) mx = x;
    }
    return {mn, mx};
}

int main() {
    vector<int> a = {4,9,1,7};
    auto res = minMax(a);
    cout << "min=" << res.first << ", max=" << res.second << endl;
    return 0;
}
min=1, max=9

配列を関数に渡す

組み込み配列は長さ情報が消えやすいため注意。std::vector の利用が安全です

#include <iostream>
using namespace std;

void printArr(int arr[], int len) {
    for (int i = 0; i < len; ++i) cout << arr[i] << " ";
    cout << endl;
}

int main() {
    int a[] = {1,2,3};
    printArr(a, 3);
    return 0;
}
1 2 3

なぜ関数を使うのか

比較例
// コピペして書く場合
cout << "合計: " << (a + b + c) << endl;
cout << "合計: " << (x + y + z) << endl;

// 関数でまとめる場合
int sum3(int p, int q, int r) { return p + q + r; }
cout << "合計: " << sum3(a,b,c) << endl;
cout << "合計: " << sum3(x,y,z) << endl;

まとめ

学習進捗

0
Would love your thoughts, please comment.x