記事ディレクトリ
ブログの概要:
- オーバーロードされた関数: 同じ関数名を使用して、異なる関数パラメーター リストを定義します。
- 判定基準: 関数の引数の数・型・順序の違いのみが「関数オーバーロード」の基準となり、関数の戻り値は「関数オーバーロード」の基準にはなりません。
- あいまいさ: 関数のオーバーロードをデフォルトのパラメーターと組み合わせて使用すると、あいまいさが生じ、コンパイルは直接失敗します。
1. 関数のオーバーロード
1. オーバーロードされた関数呼び出しの分析
オーバーロードされた関数呼び出しのクエリ分析: オーバーロードされた関数を呼び出し、複数のオーバーロードされた関数から呼び出したい関数を見つける方法。プロセスは次のとおりです。
まず、 同じ名前の関数を選択し、関数名に基づいて呼び出し関数の関数名と一致する関数を候補関数として選択します。
次に、候補関数の中から、 オーバーロードされた関数に実際に渡された関数のパラメーター リストと正確に一致するターゲット関数を見つけてみます。
- 最初のステップでは、 実際の参加形式パラメータがデフォルト パラメータを使用して正確に照合できるかどうかを確認します。照合が失敗した場合は、2 番目のステップに進みます。
- 2 番目のステップでは、 デフォルトのパラメータ タイプを変換して、一致が成功したかどうかを確認します。
- 上記の 2 つの手順が一致しない場合、または一致する関数が複数見つかった場合、コンパイルは失敗します。
2. 関数オーバーロードの特徴
関数のオーバーロード機能:
- 互いに独立している: オーバーロードされた関数は本質的に異なる関数であり、オーバーロードされた関数は接続がなく互いに独立しています。
- 異なる型: オーバーロードされた関数の関数型は異なります。
- 一意の識別: オーバーロードされた関数は、関数名とパラメーター リストを通じてのみ一意に識別できます。
- 戻り値を判定しない。関数の引数 の数・型・順序の違いのみが「関数オーバーロード」の判定基準となり、関数の戻り値は「関数オーバーロード」の判定基準にはなりません。
2. 関数のオーバーロードとデフォルトパラメータ
1. 関数のオーバーロードとデフォルトパラメータの曖昧さの分析
2 つの関数を定義します。1 つはデフォルト パラメーターを使用し、もう 1 つはデフォルト パラメーターを使用しません。これら 2 つの関数は同じ関数名を持ち、オーバーロードされた関数です。
最初の関数を定義し、3 つの整数パラメータを受け取り、最後のパラメータがデフォルトのパラメータです。
注:関数 1 を呼び出すときは、fun(1, 2) または fun(1, 2, 3) を使用して呼び出すことができます。
// 函数 1 : 接收 3 个整数参数 , 最后一个参数是默认参数
void fun(int i, int j, int k = 10) {
cout << "i = " << i << "j = " << j << "k = " << k << endl;
}
2 番目の関数を定義します。この関数は 2 つの整数パラメータを受け取り、fun(1, 2) の形式でのみ呼び出すことができます。
// 函数 2 : 接收 2 个整数参数
void fun(int i, int j) {
cout << "i = " << i << "j = " << j << endl;
}
2. コード例 - 上記 2 つの関数を定義します
オーバーロードされた関数とデフォルト パラメーター関数を呼び出さずに定義しただけの場合、コンパイルではエラーは報告されません。
コード例:
// 包含 C++ 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 函数重载 + 默认参数
// 函数 1 : 接收 3 个整数参数 , 最后一个参数是默认参数
void fun(int i, int j, int k = 10) {
cout << "i = " << i << "j = " << j << "k = " << k << endl;
}
// 函数 2 : 接收 2 个整数参数
void fun(int i, int j) {
cout << "i = " << i << "j = " << j << endl;
}
int main()
{
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
実行結果:関数を呼び出さずに定義しただけの場合、コンパイルではエラーは報告されません。
3. コード例 - 曖昧さのない関数呼び出し
fun(1, 2, 3) を呼び出すだけでも、正常に実行できます。
関数 1 は一意に特定できるためvoid fun(int i, int j, int k = 10)
、あいまいさはありません。
// 函数 1 : 接收 3 个整数参数 , 最后一个参数是默认参数
void fun(int i, int j, int k = 10) {
cout << "i = " << i << " , j = " << j << " , k = " << k << endl;
}
コード例:
// 包含 C++ 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 函数重载 + 默认参数
// 函数 1 : 接收 3 个整数参数 , 最后一个参数是默认参数
void fun(int i, int j, int k = 10) {
cout << "i = " << i << " , j = " << j << " , k = " << k << endl;
}
// 函数 2 : 接收 2 个整数参数
void fun(int i, int j) {
cout << "i = " << i << "j = " << j << endl;
}
int main()
{
fun(1, 2, 3);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
の結果:
i = 1 , j = 2 , k = 3
Press any key to continue . . .
4. コード例 - あいまいなコンパイルの失敗
fun(1, 2) を実行すると、関数 1 と関数 2 が同時に一致しますが、この時点ではあいまいさがあり、コンパイル時にエラーが報告されます。
コード例:
// 包含 C++ 头文件
#include "iostream"
// 使用 std 标准命名空间
// 该命名空间中 , 定义了很多标准定义
using namespace std;
// 函数重载 + 默认参数
// 函数 1 : 接收 3 个整数参数 , 最后一个参数是默认参数
void fun(int i, int j, int k = 10) {
cout << "i = " << i << " , j = " << j << " , k = " << k << endl;
}
// 函数 2 : 接收 2 个整数参数
void fun(int i, int j) {
cout << "i = " << i << "j = " << j << endl;
}
int main()
{
fun(1, 2);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
の結果:
已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>hello_world.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(22,10): error C2668: “fun”: 对重载函数的调用不明确
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(16,6): message : 可能是“void fun(int,int)”
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(11,6): message : 或 “void fun(int,int,int)”
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(22,10): message : 尝试匹配参数列表“(int, int)”时
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========