#20 C ++で学ぶ関数の応用(デフォルト引数・可変長引数)の基本

はじめに

C++で関数を書いていると、「引数の数を省略できたらいいのに」「引数の個数が決まっていない関数を作りたい」と思う場面が出てきます。たとえば、ログ出力用の関数で「毎回同じ設定値を渡すのは面倒」「渡す値の数がそのときどきで変わる」といったケースです。C++にはこうした要望に応える仕組みとして、デフォルト引数と可変長引数という2つの機能が用意されています。この記事では、それぞれの書き方と注意点を、初心者の方にもわかりやすく解説していきます。

デフォルト引数とは

デフォルト引数とは、関数を呼び出すときに引数を省略した場合に使われる「あらかじめ決めておいた値」のことです。関数の宣言時に引数へ初期値を設定しておくことで、呼び出し側は必要なときだけ値を指定し、それ以外は省略できるようになります。

#include <iostream>

void greet(std::string name, std::string honorific = "さん") {
    std::cout << name << honorific << "、こんにちは" << std::endl;
}

int main() {
    greet("田中");          // 田中さん、こんにちは
    greet("鈴木", "先生");  // 鈴木先生、こんにちは
}

上の例では、honorificに「さん」というデフォルト値を設定しているため、2つ目の引数を省略しても関数を呼び出せます。

デフォルト引数の制約

デフォルト引数には守るべきルールがあります。それは「デフォルト引数は必ず引数リストの後ろ側から設定する」という制約です。たとえばvoid func(int a = 1, int b)のように、デフォルト値のある引数の後ろにデフォルト値のない引数を置くことはできません。呼び出し時にどの引数を省略したのかコンパイラが判断できなくなるためです。C言語にはデフォルト引数という機能自体が存在しないため、これはC++で新しく学ぶポイントになります。またPythonのようにキーワード引数(引数名を指定して途中の引数だけ省略する)はC++では使えない点にも注意してください。

可変長引数とは

可変長引数とは、呼び出すたびに渡す引数の数を変えられる仕組みです。C言語由来の古い方法(va_listを使う方法)もありますが、型安全でない(渡した値の型チェックが甘く、間違った型を渡してもコンパイル時に気づけない)という弱点があるため、現在のC++では可変引数テンプレートという仕組みを使うのが主流です。

#include <iostream>

// 引数が0個になるまで再帰的に呼び出される「終端」の関数
void printAll() {
    std::cout << std::endl;
}

template <typename T, typename... Args>
void printAll(T first, Args... rest) {
    std::cout << first << " ";
    printAll(rest...);  // 残りの引数で再帰呼び出し
}

int main() {
    printAll(1, "two", 3.0, "four");
}

ここで登場するArgs...という書き方が「テンプレートパラメータパック」と呼ばれるもので、任意の個数・任意の型の引数をまとめて受け取れます。関数を呼び出すたびに、渡した引数の型と個数に応じてコンパイラが専用のコードを自動生成してくれるため、実行時の型チェックに頼らずに安全に扱えるのが利点です。

初心者がつまずきやすいポイント

可変引数テンプレートは便利な反面、再帰呼び出しの終端条件(引数が0個になったときの処理)を書き忘れるとコンパイルエラーになりやすい機能です。慣れないうちはエラーメッセージが長く読みにくいと感じることも多いです。まずは今回のように「引数を1つずつ処理して残りを再帰で渡す」というシンプルな形から書き始めるのがおすすめです。また、C++17以降では「畳み込み式(fold expression)」という書き方を使うと、再帰関数を書かずにもっと短く可変長引数を処理できます。余裕が出てきたら調べてみてください。

まとめ

デフォルト引数は「よく使う値を省略可能にする」ための仕組み、可変長引数は「引数の個数が決まっていない関数を作る」ための仕組みです。どちらも関数の呼び出し方を柔軟にし、コードの見通しをよくしてくれます。特に可変引数テンプレートはC++らしい強力な機能なので、最初は難しく感じても、少しずつ慣れていきましょう。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

C++をもっと学びたい方には「新・明解C++入門編」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本