【C++】Funktionsüberladung② (Analyse überladener Funktionsaufrufe | Merkmale der Funktionsüberladung | Funktionsüberladung und Standardparameter)


Blog-Zusammenfassung:

  • Überladene Funktionen: Verwenden Sie denselben Funktionsnamen, um verschiedene Funktionsparameterlisten zu definieren.
  • Beurteilungskriterien: Nur der Unterschied in der Anzahl/Typ/Reihenfolge der Funktionsparameter ist das Kriterium für „Funktionsüberladung“, und der Rückgabewert der Funktion ist nicht das Kriterium für „Funktionsüberladung“;
  • Mehrdeutigkeit: Wenn Funktionsüberladung in Kombination mit Standardparametern verwendet wird, entsteht Mehrdeutigkeit und die Kompilierung schlägt direkt fehl.




1. Funktionsüberlastung




1. Analyse überlasteter Funktionsaufrufe


Abfrageanalyse für überladene Funktionsaufrufe: Rufen Sie eine überladene Funktion auf. So finden Sie heraus, welche Funktion Sie aus mehreren überladenen Funktionen aufrufen möchten. Der Prozess ist wie folgt:

Wählen Sie zunächst die Funktion mit demselben Namen aus und wählen Sie die Funktion, die dem Funktionsnamen der aufrufenden Funktion entspricht, entsprechend dem Funktionsnamen als Kandidatenfunktion aus.

Versuchen Sie dann, aus den Kandidatenfunktionen die Zielfunktion zu finden, die genau mit der Parameterliste der übergebenen tatsächlichen Beteiligung an der überladenen Funktion übereinstimmt.

  • Der erste Schritt besteht darin , zu prüfen, ob die formalen Parameter der tatsächlichen Teilnahme mithilfe der Standardparameter genau abgeglichen werden können . Wenn der Abgleich fehlschlägt, fahren Sie mit dem zweiten Schritt fort.
  • Der zweite Schritt besteht darin , den Standardparametertyp zu konvertieren, um zu sehen, ob die Übereinstimmung erfolgreich ist.
  • Wenn die beiden oben genannten Schritte nicht übereinstimmen oder mehrere übereinstimmende Funktionen gefunden werden, schlägt die Kompilierung fehl.

2. Merkmale der Funktionsüberladung


Funktionen zur Funktionsüberladung:

  • Unabhängig voneinander: Überladene Funktionen sind im Wesentlichen unterschiedliche Funktionen, und überladene Funktionen sind unabhängig voneinander und haben keine Verbindung.
  • Verschiedene Typen: Die Funktionstypen der überladenen Funktionen sind unterschiedlich;
  • Eindeutige Identifizierung: Überladene Funktionen können nur anhand des Funktionsnamens und der Parameterliste eindeutig identifiziert werden.
  • Beurteilen Sie nicht den Rückgabewert: Nur der Unterschied in der Anzahl/Typ/Reihenfolge der Funktionsparameter ist der Beurteilungsstandard für „Funktionsüberladung“, und der Rückgabewert der Funktion ist nicht der Beurteilungsstandard für „Funktionsüberladung“.




2. Funktionsüberladung und Standardparameter




1. Mehrdeutigkeitsanalyse von Funktionsüberladung und Standardparametern


Definieren Sie zwei Funktionen, von denen eine Standardparameter verwendet und die andere keine Standardparameter verwendet. Diese beiden Funktionen haben denselben Funktionsnamen und sind überladene Funktionen.

Definieren Sie die erste Funktion, empfangen Sie 3 ganzzahlige Parameter und der letzte Parameter ist der Standardparameter.

Hinweis: Wenn die Funktion 1 aufgerufen wird, kann sie mit fun(1, 2) oder fun(1, 2, 3) aufgerufen werden;

// 函数 1 : 接收 3 个整数参数 , 最后一个参数是默认参数
void fun(int i, int j, int k = 10) {
    
    
	cout << "i = " << i << "j = " << j << "k = " << k << endl;
}

Definieren Sie die zweite Funktion, die 2 ganzzahlige Parameter empfängt und nur in der Form fun(1, 2) aufgerufen werden kann;

// 函数 2 : 接收 2 个整数参数
void fun(int i, int j) {
    
    
	cout << "i = " << i << "j = " << j << endl;
}

2. Codebeispiel – Definieren Sie die beiden oben genannten Funktionen


Wenn Sie nur überladene Funktionen und Standardparameterfunktionen definieren, ohne sie aufzurufen, wird bei der Kompilierung kein Fehler gemeldet.


Codebeispiel:

// 包含 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;
}

Ausführungsergebnis: Wenn Sie nur Funktionen definieren, ohne sie aufzurufen, wird bei der Kompilierung kein Fehler gemeldet;

Fügen Sie hier eine Bildbeschreibung ein


3. Codebeispiel – Funktionsaufruf ohne Mehrdeutigkeit


Wenn Sie einfach fun (1, 2, 3) aufrufen, kann es auch erfolgreich ausgeführt werden.

Da Funktion 1 eindeutig lokalisiert werden kann void fun(int i, int j, int k = 10), besteht keine Mehrdeutigkeit.

// 函数 1 : 接收 3 个整数参数 , 最后一个参数是默认参数
void fun(int i, int j, int k = 10) {
    
    
	cout << "i = " << i << " , j = " << j << " , k = " << k << endl;
}

Codebeispiel:

// 包含 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;
}

Ergebnisse der:

i = 1 , j = 2 , k = 3
Press any key to continue . . .

Fügen Sie hier eine Bildbeschreibung ein


4. Codebeispiel – mehrdeutiger Kompilierungsfehler


Wenn fun (1, 2) ausgeführt wird, werden gleichzeitig Funktion 1 und Funktion 2 abgeglichen. Zu diesem Zeitpunkt besteht Unklarheit und beim Kompilieren wird ein Fehler gemeldet.


Codebeispiel:

// 包含 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;
}

Ergebnisse der:

已启动生成…
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==========

Fügen Sie hier eine Bildbeschreibung ein

Supongo que te gusta

Origin blog.csdn.net/han1202012/article/details/132698912
Recomendado
Clasificación