C++関数の戻り値とvoid型を徹底解説!初心者向けプログラミング入門
生徒
「C++でプログラムを作っていると『戻り値』とか『void』っていう言葉が出てくるんですけど、これってどういう意味なんですか?」
先生
「良い視点ですね。関数というのは『何かを頼んで、結果を返してもらう』仕組みのことです。その『返ってくる結果』が戻り値で、『何も返さない』ときに使うのがvoid型なんですよ。」
生徒
「料理を注文して、料理が出てくるのが戻り値、みたいな感じでしょうか?」
先生
「まさにその通りです!それでは、具体的な使い方や書き方を詳しく見ていきましょう!」
1. C++の関数と戻り値の基本を知ろう
プログラミングにおける関数(かんすう)とは、特定の処理をひとまとめにした「部品」のようなものです。パソコンを触ったことがない方でも、「自動販売機」を想像すると分かりやすいでしょう。お金を入れてボタンを押すと、飲み物が出てきますよね。この「飲み物」がプログラミングで言うところの戻り値(もどりち)です。
戻り値とは、関数が実行された後に、その関数を呼び出した側に返されるデータのことを指します。C++では、関数を作る際に「この関数はどんな種類のデータを返すのか」をあらかじめ決めておく必要があります。これを型(かた)と呼びます。例えば、整数を返すならint、小数を返すならdoubleといった具合です。戻り値を活用することで、計算結果を次の処理に利用したり、プログラムの動きを柔軟に変えたりすることができるようになります。
2. void型とは?「返さない」という選択肢
一方で、すべての関数が結果を返すわけではありません。例えば、画面に文字を表示するだけの処理や、スピーカーから音を鳴らすだけの処理などは、特に呼び出し元に報告する「結果」が必要ない場合があります。このように「戻り値がない」状態を表すために使われるのがvoid(ボイド)型です。
voidという英単語には「空っぽ」や「無効」という意味があります。プログラミングにおいてvoidと書かれた関数は、「この処理は実行するだけで、何も値は返しませんよ」という宣言になります。初心者のうちは、何か計算をさせたいときは戻り値ありの型を使い、単にメッセージを出したいときなどはvoid型を使う、と覚えておくとスムーズです。
3. 戻り値がある関数の書き方とreturn命令
戻り値がある関数を作るには、関数の名前の前に「返すデータの型」を書き、関数の中身の最後にreturn(リターン)という命令を書きます。returnは「この値を返して、ここで関数を終了します」という合図になります。
まずは、2つの数字を足し算して、その合計を返す簡単なプログラムを見てみましょう。ここでは整数を扱うので、型にはint(イント)を使います。intは「Integer(インテジャー)」の略で、整数という意味の専門用語です。
#include <iostream>
// 2つの整数を受け取って、足し算の結果を「戻り値」として返す関数
int addNumbers(int a, int b) {
int sum = a + b;
return sum; // ここで結果を返している
}
int main() {
int result = addNumbers(5, 3); // 関数を呼び出して戻り値を受け取る
std::cout << "合計は: " << result << std::endl;
return 0;
}
合計は: 8
このコードでは、addNumbersという関数が「8」という結果を戻り値として返し、それを変数resultに保存して画面に表示しています。
4. void型関数の具体的な使い方とメリット
次に、戻り値を返さないvoid型関数の書き方を確認しましょう。void関数の場合は、returnを書く必要はありません(途中で終了させるために書くこともありますが、基本的には省略します)。
例えば、挨拶を画面に表示するだけの関数を考えてみましょう。画面に文字を出すという動作そのものが目的なので、計算結果を返す必要はありません。このような場合にvoidは非常に便利です。プログラムが整理され、どこで何が行われているのかが分かりやすくなるというメリットがあります。
#include <iostream>
// 挨拶を表示するだけの関数(戻り値がないのでvoid型)
void showHello() {
std::cout << "こんにちは!C++の世界へようこそ。" << std::endl;
std::cout << "この関数は値を返さず、表示だけを行います。" << std::endl;
}
int main() {
showHello(); // 関数を呼び出すだけ
return 0;
}
こんにちは!C++の世界へようこそ。
この関数は値を返さず、表示だけを行います。
この例では、関数を呼び出すだけで画面にメッセージが表示されます。受け取るべき戻り値がないため、int result = ...のように変数に代入する書き方はしません。
5. 引数と戻り値の組み合わせで表現を広げる
関数をより強力にするのが、引数(ひきすう)との組み合わせです。引数とは、関数に渡す「材料」のことです。材料(引数)を渡して、加工してもらい、結果(戻り値)を受け取る。これがプログラミングの基本サイクルです。
例えば、入力された年齢に応じて「お酒が飲めるかどうか」を判定するプログラムを考えてみましょう。判定結果として、文字(std::string型)を返すようにします。ここで使うstd::stringは、文字の並びを扱うための型です。パソコンに詳しくない方は「文章を入れる箱」だと考えてください。
#include <iostream>
#include <string>
// 年齢を受け取って、判定メッセージを戻り値として返す関数
std::string checkAge(int age) {
if (age >= 20) {
return "お酒が購入可能です。";
} else {
return "未成年はお酒を購入できません。";
}
}
int main() {
int myAge = 18;
// 関数の戻り値をそのまま出力に使うこともできます
std::cout << "判定結果: " << checkAge(myAge) << std::endl;
return 0;
}
判定結果: 未成年はお酒を購入できません。
このように、戻り値を使うことで、関数の中で決まった判断をさせて、その結果をメッセージとして受け取ることが可能になります。
6. 実践例:消費税計算を関数で行う
より実用的な例として、商品の価格を受け取って、10%の消費税を加えた金額を計算する関数を作ってみましょう。金額には小数が出る可能性があるので、今回はdouble(ダブル)型を使います。doubleは、小数点以下の細かい数字を扱える型のことです。
プログラミングでは、計算式を直接書くよりも、このように関数としてまとめておくことで、後から「税率が8%に変わった」というときでも、一箇所を直すだけで済むようになります。これを再利用性や保守性の向上と呼びます。
#include <iostream>
// 税込み価格を計算して戻り値として返す関数
double calculateTax(int price) {
double taxRate = 1.1; // 10%の税率
return price * taxRate;
}
int main() {
int itemPrice = 1000;
double finalPrice = calculateTax(itemPrice);
std::cout << "商品の価格: " << itemPrice << "円" << std::endl;
std::cout << "税込み価格: " << finalPrice << "円" << std::endl;
return 0;
}
商品の価格: 1000円
税込み価格: 1100円
戻り値をdoubleにすることで、正確な計算結果を受け取ることができています。もしここをvoidにしてしまうと、計算した結果を呼び出し元(main関数)に伝えることができず、不便になってしまいます。
7. 戻り値とvoidを使い分けるポイント
初心者が迷いやすいのが「いつ戻り値ありにして、いつvoidにするべきか」という点です。基準はシンプルに考えましょう。「その関数が終わった後に、その結果を使って別のことをしたいか?」と自分に問いかけてみてください。
- 戻り値あり: 計算した数値を使ってさらに別の計算をしたい、判定した結果によって次の動きを変えたい、名前を取得して別の場所に表示したい。
- void型: とにかく画面に文字を出して終わりたい、設定を一つ変更して終わりたい、スピーカーから警告音を鳴らしたい。
このように、「やりっぱなし」でいいのか「報告が必要」なのかで区別すると、関数の設計がとても楽になります。C++の関数の仕組みは、最初こそ難しく感じるかもしれませんが、一度マスターすれば魔法の道具のように便利なプログラムを次々と生み出せるようになりますよ。