【C++】関数応用|引数と戻り値の使い方・便利な関数設計
この記事でわかること
- 引数と戻り値を組み合わせて便利な関数を作る方法
- 関数に値を渡す「引数」の使い方
- 関数から値を返す「戻り値」の使い方
引数と戻り値とは
- 引数:関数に値を渡すためのもの。呼び出し時に必要な情報を持たせられる
- 戻り値:関数が処理した結果を返すもの。呼び出し後に受け取って利用できる
簡単にいうと 「入力(引数) → 処理 → 出力(戻り値)」 のイメージです
関数の基本構文
戻り値の型 関数名(引数リスト) {
// 処理
return 戻り値; // 戻り値がある場合
}- 戻り値がない場合は
void - 引数がない場合は空の括弧
()
実例:引数あり・戻り値なし
名前を受け取って挨拶を表示する関数です
#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::pair や struct を使えば、複数値をまとめて返せます
#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なぜ関数を使うのか
- 再利用性:同じ処理を何度も呼べる
- 保守性:修正が一か所で済む
- 可読性:main が短くなり処理の流れが分かりやすくなる
- テストしやすさ:小さな関数は単体テストが容易
- 抽象化:処理の詳細を隠し、高レベルのロジックに集中できる
比較例
// コピペして書く場合
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;- 関数なら修正が一か所で済む
- コピペだとすべて書き換える必要があります
まとめ
- 引数は関数に「値を渡す」ためのもの
→ 複数渡せる、順番と型に注意 - 戻り値は関数が処理した結果を返す
→ 変数に受け取るか、そのまま式で使える