【C++】関数のオーバーロード① (関数のオーバーロードの概念 | 関数のオーバーロードの判断基準 - 引数の数・型・順序 | 戻り値は関数のオーバーロードの判断基準ではない)


ブログの概要:

  • オーバーロードされた関数: 同じ関数名を使用して、異なる関数パラメーター リストを定義します。
  • 判定基準: 関数の引数の数・型・順序の違いのみが「関数オーバーロード」の基準となり、関数の戻り値は「関数オーバーロード」の基準にはなりません。




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
打印两个整数: 23
打印浮点数: 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==========

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/han1202012/article/details/132698434