Operatori in C++
Questo articolo illustrerà più metodi su come utilizzare gli operatori in C++.
Operatori comuni forniti in linguaggio C++
Gli operatori sono la parte essenziale delle espressioni nella programmazione C++. Forniscono diverse operazioni condotte sugli operandi forniti e i risultati valutati vengono solitamente utilizzati dal programmatore secondo necessità. Possiamo dividere liberamente gli operandi in due tipi: operatori comuni e speciali. Gli operatori comuni sono operazioni implementate quasi universalmente nella maggior parte dei linguaggi di programmazione e questi includono operatori aritmetici, logici, di confronto, di assegnazione, di accesso ai membri e molti altri.
Simile alle regole in algebra, ci sono caratteristiche di precedenza e associatività quando più operatori formano l’espressione. Riassumeremo alcune di queste regole in questo articolo, ma la descrizione completa dovrebbe essere riferita alla documentazione della lingua e all’operatore tabella di precedenza. Si noti che le regole di precedenza e associatività per le operazioni aritmetiche di base sono simili alle regole matematiche comuni. Pertanto, le espressioni nell’esempio seguente restituiscono gli interi 20
e 10
invece di 60
e 30
.
#include <iostream>
using std::cout;
using std::endl;
int main() {
cout << 10 + 2 * 5 << endl;
cout << 40 - 20 - 10 << endl;
return EXIT_SUCCESS;
}
Produzione:
20 10
Il programmatore può utilizzare le parentesi per ignorare le regole generali di precedenza e associatività, in modo simile a quanto avviene in algebra. Ciascuna espressione composta tra parentesi verrà trattata come un’unità valutata separatamente. Uno degli errori più comuni quando si utilizza l’aritmetica del puntatore è perdere le parentesi.
Se accediamo all’elemento nell’array usando l’aritmetica del puntatore più l’operazione di dereferenziazione, dobbiamo mettere quella aritmetica tra parentesi. Altrimenti, il valore puntato dal puntatore dato verrebbe incrementato dall’operando numerico e non dal puntatore stesso perché l’operatore di dereferenziazione ha una precedenza maggiore dell’addizione.
#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;
}
Produzione:
12 63
Operazioni sovraccaricate in C++
Una delle caratteristiche più potenti che si possono incontrare nel linguaggio C++ è che consente al programmatore di definire come dovrebbero comportarsi gli operatori quando vengono chiamati su oggetti definiti dall’utente come le classi. Poiché questa funzionalità fornisce operazioni alternative all’operatore specificato, viene chiamata operatori di overload. Tuttavia, tieni presente che il numero di operandi e la precedenza non possono essere modificati implementando un operatore di overload.
Il seguente frammento di codice dichiara una classe Person
che contiene due membri di dati stringa e sovraccarica l’operatore +
per questo tipo. Gli operatori sovraccarichi sono implementati in modo simile ad altre funzioni di classe con nomi speciali, a partire dalla parola chiave operator
seguita dal simbolo dell’operatore stesso. Queste funzioni possono avere un tipo restituito e un elenco di parametri. Tieni presente che una delle restrizioni del sovraccarico degli operatori è che il programmatore non può creare nuovi operatori come $>
o !!
.
#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);
}
Produzione:
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