C++ Elementary – Operatorüberladung

Vorwort: Funktionsüberladung wurde bereits eingeführt . Um die Lesbarkeit des Codes zu verbessern, führt C++ das Konzept der Operatorüberladung ein. Bei der Operatorüberladung handelt es sich um eine Funktion mit einem speziellen Funktionsnamen und ihrem Rückgabewerttyp.
Die folgenden Blogger werden die Operatorüberladung durch den Vergleich benutzerdefinierter Datumsklassen einführen, um die Operatorüberladung hervorzuhebenVorteile einer verbesserten Codelesbarkeit

Benutzerdefinierter Typvergleich

Nehmen Sie als Beispiel die Ganzzahl- und Datumsklassen: Wir definieren zwei Ganzzahlvariablen i, j und können <ihre Größen vergleichen, aber wir instanziieren zwei Datumsklassenobjekte d1, d2. Wenn wir ihre Größen vergleichen möchten, erfahren Sie, wie es geht ?
Antwort: Sie können eine Memberfunktion schreiben, die Date vergleicht!

class Date {
    
    
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
    
    
		cout << "Date()" << endl;
		_year = year;
		_month = month;
		_day = day;
	}
//private:
	int _year;
	int _month;
	int _day;
};
bool Dateless(const Date& d1, const Date& d2)
{
    
    
	if (d1._year < d2._year) {
    
    
		return true;
	}
	else if (d1._year == d2._year && d1._month < d2._month) {
    
    
		return true;
	}
	else if (d1._year == d2._year && d1._month == d2._month && d1._day < d2._day) {
    
    
		return true;
	}
	else {
    
    
		return false;
	}
}
int main()
{
    
    
	int i = 10, j = 20;
	Date d1(2023, 8, 12);
	Date d2(2022, 8, 12);
	cout << Dateless(d1,d2) << endl;
	//i < j; // 语言自带的类型
	//d1 < d2; //自定义类型
	return 0;
}

Allerdings kann Dateless den Benutzern nicht intuitiv mitteilen, ob das Programm größer als das erstere oder das letztere ist. Können wir Operatoren verwenden, um benutzerdefinierte Typen zu vergleichen? Geschrieben in der Form d1<d2?

Überlastung des Bedieners

Wir haben Datumsklassen definiert und der Compiler kann ihre Größen nicht vergleichen, aber wir können die Rolle des Operators durch Operatorüberladung neu definieren, sodass der Operator auch für benutzerdefinierte Typen gültig ist.
Format: Operator(Operator)

class Date {
    
    
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
    
    
		cout << "Date()" << endl;
		_year = year;
		_month = month;
		_day = day;
	}
//private:
	int _year;
	int _month;
	int _day;
};
//<运算符重载
//d1<d2
//operator(d1<d2)
bool operator<(const Date& d1, const Date& d2)
{
    
    
	if (d1._year < d2._year) {
    
    
		return true;
	}
	else if (d1._year == d2._year && d1._month < d2._month) {
    
    
		return true;
	}
	else if (d1._year == d2._year && d1._month == d2._month && d1._day < d2._day) {
    
    
		return true;
	}
	else {
    
    
		return false;
	}
}
int main()
{
    
    
	Date d1(2023, 8, 12);
	Date d2(2022, 8, 12);
	cout << (d1 < d2) << endl; // 直接通过<调用operator<函数
	cout << operator<(d1, d2) << endl; //是上一行的显示调用

Durch Überladen von Operatoren können wir direkt in der Form d1 <d2 schreiben, genau wie beim Vergleich integrierter Typen, sodass Benutzer es auf einen Blick verstehen können.

1. Vorsichtsmaßnahmen für den Gebrauch

1. Neue Operatoren können nicht durch Verbinden von Symbolen erstellt werden, die keine Operatoren sind, wie zum Beispiel: Operator¥
2. Überladene Operatoren müssen einen Klassentypparameter haben
3. Operatoren, die für integrierte Typen verwendet werden, können ihre Bedeutung nicht ändern.
4. Bei Überladung als Klassenmitgliedsfunktion scheinen ihre formalen Parameter um 1 kleiner zu sein als die Anzahl der Operanden, da der erste Parameter der Mitgliedsfunktion um 5 ausgeblendet ist. Die folgenden 5 Operatoren können nicht überladen werden
:. ?: sizeof :: .*

2. Überladung als Mitgliedsfunktion einer Klasse

Bei Überladung als Klassenmitgliedsfunktion scheinen ihre formalen Parameter um 1 kleiner zu sein als die Anzahl der Operanden, da der erste Parameter der Mitgliedsfunktion dadurch ausgeblendet ist (entsprechend dem vierten Punkt der Anmerkung).

Die obige Beispielcodefunktion operator<ist eine globale Funktion. Wenn wir mehrere <-Operatorüberladungen für verschiedene benutzerdefinierte Typen definieren müssen, müssen wir operator<die Funktion in die Datumsklasse einfügen.

Der Operator verfügt über mehrere Operanden und die Operatorüberladungsfunktion verfügt über mehrere ParameterNehmen wir als Beispiel <, es hat zwei Operanden, also zwei Parameter, aber wenn wir es in eine Klasse einfügen, müssen wir nur einen Parameter schreiben, da die Mitgliedsfunktionen alle einen Zeigerparameter verbergen .

class Date {
    
    
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
    
    
		cout << "Date()" << endl;
		_year = year;
		_month = month;
		_day = day;
	}
   //作为类的成员函数重载
   //d1<d2
   //d1.operator<(d2)
	bool operator<(const Date& d)  //(Date* const this,const Date& d)
	{
    
    
		if (_year < d._year) {
    
    
			return true;
		}
		else if (_year == d._year && _month < d._month) {
    
    
			return true;
		}
		else if (_year == d._year && _month == d._month && _day < d._day) {
    
    
			return true;
		}
		else {
    
    
			return false;
		}
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
    
    
	int i = 10, j = 20;
	Date d1(2023, 8, 12);
	Date d2(2022, 8, 12);
	cout << (d1 < d2) << endl; 
	cout << d1.operator<(d2) << endl;  // 显示调用方式与全局中的不同

Zusammenfassung: Die Operatorüberladung kann auch durch gewöhnliche Funktionen ersetzt werden (wie im Beispiel gezeigt, haben wir gerade den Namen der Funktion geändert), aber die Verwendung der Operatorüberladung kann die Lesbarkeit unseres Programms erheblich verbessern.

Je suppose que tu aimes

Origine blog.csdn.net/qq_73390155/article/details/132249714
conseillé
Classement