Introduzione al sovraccarico degli operatori
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 40 di 104.
L'overloading degli operatori ti permette di definire come si comportano operatori come +, - o == quando vengono usati con le tue classi personalizzate. Invece di chiamare metodi come a.add(b), puoi scrivere la forma più intuitiva a + b.
In C++, gli operatori sono essenzialmente funzioni con nomi speciali. Per sovraccaricare un operatore, definisci una funzione usando la parola chiave operator seguita dal simbolo:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// Sovraccarica l'operatore +
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};Ora puoi sommare due vettori in modo naturale:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // Chiama v1.operator+(v2)Non tutti gli operatori possono essere sovraccaricati. L'operatore di risoluzione dell'ambito ::, l'accesso ai membri ., l'operatore ternario ?: e sizeof non possono essere sovraccaricati. Inoltre, non puoi creare nuovi operatori né modificare la precedenza di un operatore: * verrà sempre valutato prima di +.
Gli operatori possono essere implementati come funzioni membro (come sopra) o come funzioni non membro. Nelle prossime lezioni imparerai quando usare ciascun approccio e come sovraccaricare categorie specifiche di operatori.
Sfida
FacileCreiamo una classe Point che rappresenta una coordinata 2D e supporta la somma di due punti usando l'operatore +. Questo è il tuo primo passo nell'overloading degli operatori, che permette alle tue classi personalizzate di funzionare con operatori familiari.
Creerai due file per organizzare il tuo codice:
Point.h: definisci una classePointche memorizza le coordinate x e y (entrambeint). La tua classe dovrebbe avere:- membri privati per le coordinate x e y
- un costruttore che accetta i valori di x e y
- getter
getX()egetY()(entrambi const) - un operatore
+sovraccaricato che somma due punti e restituisce un nuovoPointcon le coordinate combinate
L'operatore
+dovrebbe essere implementato come funzione membro che accetta un altroPointper riferimento const e restituisce un nuovoPoint. Contrassegnalo comeconstpoiché non modifica nessuno dei due operandi.main.cpp: leggi quattro numeri interi dall'input (x1, y1, x2, y2 su righe separate) che rappresentano due punti. Crea due oggettiPoint, sommali usando l'operatore+e visualizza i risultati.Formato dell'output:
Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
L'idea fondamentale è che p1 + p2 in realtà richiama p1.operator+(p2) dietro le quinte. L'operatore sovraccaricato ti permette di scrivere codice intuitivo come Point p3 = p1 + p2; invece di qualcosa come Point p3 = p1.add(p2);.
Converti le stringhe di input in numeri interi usando std::stoi(). Non dimenticare le include guard nel tuo file header.
Provalo tu
#include <iostream>
#include <string>
#include "Point.h"
using namespace std;
int main() {
// Leggi l'input
string line1, line2, line3, line4;
getline(cin, line1);
getline(cin, line2);
getline(cin, line3);
getline(cin, line4);
int x1 = stoi(line1);
int y1 = stoi(line2);
int x2 = stoi(line3);
int y2 = stoi(line4);
// TODO: Crea due oggetti Point usando i valori di input
// TODO: Somma i due punti usando l'operatore +
// TODO: Mostra i risultati nel formato richiesto:
// Punto 1: (<x1>, <y1>)
// Punto 2: (<x2>, <y2>)
// Somma: (<sum_x>, <sum_y>)
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online