Operatoren in C++
In diesem Artikel werden mehrere Methoden zur Verwendung von Operatoren in C++ demonstriert.
Allgemeine Operatoren in der Sprache C++
Operatoren sind der wesentliche Bestandteil von Ausdrücken in der C++-Programmierung. Sie stellen verschiedene Operationen bereit, die auf gelieferten Operanden ausgeführt werden, und die ausgewerteten Ergebnisse werden normalerweise vom Programmierer nach Bedarf verwendet. Wir können Operanden grob in zwei Typen unterteilen: allgemeine und spezielle Operatoren. Allgemeine Operatoren sind in den meisten Programmiersprachen fast universell implementierte Operationen, und dazu gehören arithmetische, logische, Vergleichs-, Zuweisungs-, Memberzugriffsoperatoren und einige andere.
Ähnlich wie bei den Regeln in der Algebra gibt es Vorrang- und Assoziativitätsmerkmale, wenn mehrere Operatoren den Ausdruck bilden. Wir werden einige dieser Regeln in diesem Artikel zusammenfassen, aber die vollständige Beschreibung sollte auf die Sprachdokumentation und den Operator Vorrangtabelle verwiesen werden. Beachten Sie, dass Vorrang- und Assoziativitätsregeln für grundlegende arithmetische Operationen den allgemeinen mathematischen Regeln ähneln. So geben die Ausdrücke im folgenden Beispiel die ganzen Zahlen 20
und 10
statt 60
und 30
aus.
#include <iostream>
using std::cout;
using std::endl;
int main() {
cout << 10 + 2 * 5 << endl;
cout << 40 - 20 - 10 << endl;
return EXIT_SUCCESS;
}
Ausgabe:
20
10
Der Programmierer kann Klammern verwenden, um allgemeine Vorrang- und Assoziativitätsregeln außer Kraft zu setzen, ähnlich wie dies in der Algebra der Fall ist. Jeder zusammengesetzte Ausdruck in Klammern wird als eine Einheit behandelt, die separat ausgewertet wird. Einer der häufigsten Fehler bei der Verwendung der Zeigerarithmetik besteht darin, die Klammern zu übersehen.
Wenn wir mit der Zeigerarithmetik plus der Dereferenzierungsoperation auf das Element im Array zugreifen, müssen wir die arithmetische in Klammern setzen. Andernfalls würde der Wert, auf den der angegebene Zeiger zeigt, um den Zahlenoperanden erhöht und nicht um den Zeiger selbst, da der Dereferenzierungsoperator eine höhere Priorität hat als die Addition.
#include <iostream>
using std::cout;
using std::endl;
int main() {
int vec[] = {10, 22, 63, 14};
cout << *vec + 2 << endl;
cout << *(vec + 2) << endl;
return EXIT_SUCCESS;
}
Ausgabe:
12
63
Überladene Operationen in C++
Eine der mächtigsten Funktionen, die man in der Sprache C++ finden kann, besteht darin, dass der Programmierer definieren kann, wie sich Operatoren verhalten sollen, wenn sie von benutzerdefinierten Objekten wie Klassen aufgerufen werden. Da diese Funktion dem angegebenen Operator alternative Operationen bietet, wird sie als überladene Operatoren bezeichnet. Beachten Sie jedoch, dass die Anzahl der Operanden und die Rangfolge nicht durch die Implementierung eines überladenen Operators geändert werden können.
Der folgende Codeausschnitt deklariert eine Klasse Person
, die zwei String-Datenmember enthält und den Operator +
für diesen Typ überlädt. Überladene Operatoren werden ähnlich wie andere Klassenfunktionen mit speziellen Namen implementiert, beginnend mit dem Schlüsselwort operator
gefolgt vom Operatorsymbol selbst. Diese Funktionen können einen Rückgabetyp und eine Parameterliste haben. Beachten Sie, dass eine der Einschränkungen beim Überladen von Operatoren darin besteht, dass der Programmierer keine neuen Operatoren wie $>
oder !!
erstellen kann.
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
class Person {
public:
Person(string s1, string s2) : name(std::move(s1)), surname(std::move(s2)) {}
Person operator+(const Person &p) {
Person ret(name + p.name, surname + p.surname);
return ret;
}
void printPerson() { cout << name << " " << surname << endl; }
private:
string name;
string surname;
};
int main() {
Person P1("Buddy", "Rich");
Person P2("Lady", "Bee");
P1 = P1 + P2;
P1.printPerson();
exit(EXIT_SUCCESS);
}
Ausgabe:
BuddyLady RichBee
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook