記事ディレクトリ
ブログの概要:
- オーバーロードされた関数: 同じ関数名を使用して、異なる関数パラメーター リストを定義します。
- 判定基準: 関数の引数の数・型・順序の違いのみが「関数オーバーロード」の基準となり、関数の戻り値は「関数オーバーロード」の基準にはなりません。
1. 関数のオーバーロード
1. 関数のオーバーロードの概念
C++ における「関数のオーバーロード」の概念:
- 同じ関数名を使用して、異なる関数を定義します。
- 関数名は同じですが、パラメータリストのパラメータ順序またはパラメータタイプが異なります。
注: 「関数のオーバーロード」の判断基準となるのは関数の引数のみであり、関数の戻り値は「関数のオーバーロード」の判断基準にはなりません。
2. 関数の多重定義の判断基準
「関数のオーバーロード」は以下の条件(判定基準)を満たします。
- パラメータ「数値」が異なります
- パラメータ「type」が異なります
- パラメータ「順序」が異なります
「関数のオーバーロード」の判定基準となるのは関数の引数のみであり、関数の戻り値は「関数のオーバーロード」の判定基準にはなりません。
2. コード例
1. コード例 - 関数のオーバーロード
次のコードでは、3 つの楽しい関数が定義されています。これらはすべてオーバーロードされた関数です。
最初の fun 関数は int 整数パラメータを受け取ります。
// 函数1 : 接收一个整数参数
void fun(int i) {
cout << "打印整数: " << i << endl;
}
2 番目の fun 関数は 2 つの int 型パラメータを受け取ります。このオーバーロードされた関数には最初の関数とは異なる数のパラメータがあります。
// 函数2 : 接收两个整数参数
void fun(int i, int j) {
cout << "打印两个整数: " << i << " 和 " << j << endl;
}
3 番目の fun 関数は float 浮動小数点型パラメータを受け取ります。このオーバーロードされた関数は、パラメータの型が最初の関数と異なり、パラメータの型と数が 2 番目の関数と異なります。
// 函数3 : 接收一个浮点数参数
void fun(float f) {
cout << "打印浮点数: " << f <<endl;
}
関数を呼び出すときは、渡されたパラメーターに従って、どのオーバーロードされた関数を呼び出すかを決定します。
実際のパラメータ 4 を渡します。パラメータの型は int 型で、最初のオーバーロードされた関数が呼び出されます。
fun(4); // 调用第一个 fun 函数
実際のパラメータ 2、3 を渡し、パラメータの型は 2 int 型で、2 番目のオーバーロードされた関数が呼び出されます。
fun(2, 3); // 调用第二个 fun 函数
実際のパラメータ 1.5f を渡します。パラメータの型は float 型で、3 番目のオーバーロードされた関数が呼び出されます。
fun(1.5f); // 调用第三个 fun 函数
コード例:
// 包含 C++ 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 函数重载示例
// 函数1 : 接收一个整数参数
void fun(int i) {
cout << "打印整数: " << i << endl;
}
// 函数2 : 接收两个整数参数
void fun(int i, int j) {
cout << "打印两个整数: " << i << " 和 " << j << endl;
}
// 函数3 : 接收一个浮点数参数
void fun(float f) {
cout << "打印浮点数: " << f <<endl;
}
int main()
{
fun(4); // 调用第一个 fun 函数
fun(2, 3); // 调用第二个 fun 函数
fun(1.5f); // 调用第三个 fun 函数
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
の結果:
打印整数: 4
打印两个整数: 2 和 3
打印浮点数: 1.5
Press any key to continue . . .
2. コード例 - 戻り値は関数のオーバーロードの判断基準ではない
「関数のオーバーロード」の判定基準となるのは関数の引数のみであり、関数の戻り値は「関数のオーバーロード」の判定基準にはなりません。
したがって、2 つの関数のパラメーター リストは同じでも戻り値が異なる場合、コンパイル時にエラーが報告され、プログラムは実行できません。
関数 1 は void fun(int i) として定義されており、整数 int 型パラメータを受け取り、void 戻り値を返します。
// 函数1 : 接收一个整数参数 , 返回 void 空
void fun(int i) {
cout << "打印整数: " << i << endl;
}
その後、整数パラメータを受け取り、int 型の戻り値を返す関数 2 int fun(int i) を定義します。関数 2 は関数 1 と直接競合するため、コンパイル時にエラーが報告されます。
// 函数2 : 接收一个整数参数 , 返回 int 类型返回值
int fun(int i) {
cout << "打印整数: " << i << endl;
return 0;
}
Visual Studio 2019 などの IDE ツールを使用する場合、コードの作成後にエラーが報告されます。
エラーコードの例:
// 包含 C++ 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 函数重载示例
// 函数1 : 接收一个整数参数 , 返回 void 空
void fun(int i) {
cout << "打印整数: " << i << endl;
}
// 函数2 : 接收一个整数参数 , 返回 int 类型返回值
int fun(int i) {
cout << "打印整数: " << i << endl;
return 0;
}
int main()
{
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
の結果:
已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>hello_world.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(16,16): error C2556: “int fun(int)”: 重载函数与“void fun(int)”只是在返回类型上不同
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(11): message : 参见“fun”的声明
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(16,5): error C2371: “fun”: 重定义;不同的基类型
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(11): message : 参见“fun”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========