C++入門:関数オーバーロードと戻り値の型のルールを解説
C++では、同じスコープ内に同名の関数を複数定義することができます。これを「関数オーバーロード」と呼びます。ただし、各定義は引数リストにおける引数の型や数が互いに異なっている必要があります。戻り値の型だけが異なる関数宣言は、オーバーロードとして扱うことができません。
関数オーバーロードは、コンパイル時に行われる静的ポリモーフィズムの一種です。コンパイラは関数のシグネチャ(関数名と引数リストの組み合わせ)を確認し、シグネチャが異なっていればそれらを別個の関数として区別します。一方、関数の戻り値の型はオーバーロードの判定にまったく影響しません。シグネチャが同一で戻り値の型のみが異なる場合、呼び出し側からどちらの関数を呼べばよいか判断できないため、コンパイルエラーになります。
次の例では、同じ print() 関数を使って、int型・double型・文字列型という異なるデータ型を出力しています。
サンプルコード
#include <iostream>
using namespace std;
class printData {
public:
void print(int i) {
cout << "Printing int: " << i << endl;
}
void print(double f) {
cout << "Printing float: " << f << endl;
}
void print(char* c) {
cout << "Printing character: " << c << endl;
}
};
int main(void) {
printData pd;
pd.print(5); // 整数を出力するprintを呼び出し
pd.print(500.263); // 浮動小数点数を出力するprintを呼び出し
pd.print("Hello C++"); // 文字列を出力するprintを呼び出し
return 0;
}
実行結果
Printing int: 5 Printing float: 500.263 Printing character: Hello C++
ポイントまとめ
- 関数オーバーロードが成立するのは、引数の型または引数の数が異なる場合です。
- 戻り値の型だけが異なる宣言はオーバーロードできず、コンパイルエラーとなります。
- オーバーロードの解決はコンパイル時に行われるため、実行時のオーバーヘッドはありません。
- デフォルト引数を持つ関数と組み合わせると、呼び出しが曖昧になる場合があるため注意が必要です。
-
C++のデフォルト引数と仮想関数の仕組みを解説
C++では、仮想関数とデフォルト引数を組み合わせた場合、一見すると直感に反する挙動が発生することがあります。本記事では、具体的なサンプルプログラムをもとに、その仕組みと理由をわかりやすく解説します。 サンプルコード #include<iostream> using namespace std; class B { public: virtual void s(int a = 0) { cout<<" In Base \n&qu
-
C++のフレンド関数とフレンドクラスの基本を解説
C++におけるフレンド関数(friend function)とは、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。フレンド関数のプロトタイプ(宣言)はクラス定義の中に記述しますが、あくまで「友達」として扱われるだけであり、クラスのメンバー関数にはなりません。この点は重要なポイントです。フレンドとして指定できるものフレンドとして宣言できるのは、以下のようなものです。通常の関数関数テンプレート他のクラスのメンバー関数クラス全体(この場合、そのクラスのすべてのメンバーがフレンドになります