come fa il programma C++ a "ACCA"?
La prima lettera mostrata è 'A'. Questo output è correlato a questa riga:
Base obj;
... in cui si sta creando una nuova istanza di Base.
La riga successiva è un po 'complicato:
obj = obj+obj;
Normalmente, questo è tradotto in obj.operator+(obj)
, ma non hanno operator + sovraccaricato in classe Base
, quindi questo la traduzione non è valido. La restante possibilità è che l'operatore + sia in realtà l'operatore di aggiunta numerica.
E sì, questo è possibile, dal momento che è stato fornito un cast a int
. Quindi è possibile convertire ogni termine dell'equazione in un int
... e pertanto operator int
viene chiamato due volte. Il numero effettivo di volte che viene chiamato operator int
dipende dalle ottimizzazioni attivate. Ad esempio, il compilatore potrebbe rendersi conto che entrambi i termini sono gli stessi e quindi creare un nuovo temporaneo una volta che il operator int
è stato chiamato la prima volta. In tal caso, vedresti CA invece di CC.
Infine, viene eseguita l'espressione di assegnazione obj.operator=(temp)
. E qui la parola chiave è temp. Affinché lo defaultoperator=
funzioni, poiché non è sovraccarico, è necessario un oggetto Base
alla destra. In realtà è possibile averlo, dal momento che Base
utilizza uno int
per creare nuove istanze. Okay, allora il risultato di obj + obj
era un int
(diciamo che è chiamato 'x') il numero e il compilatore crea un oggetto temporaneo di classe Base
che è costruito con il numero x, come è stato eseguito il seguente riga:
Base temp(x);
Questo è il modo in cui la lettera finale vista è una "A". Ancora una volta, molti compilatori possono evitare la creazione di temporaries in alcuni casi, quindi è possibile non vedere una "A" alla fine.
noti che questa linea:
obj = obj + obj
è così scomponibile in:
int x = ((int) obj) + ((int) obj);
Base temp(x);
obj = temp;
L'istruzione finale ha il risultato come se la memoria in cui obj
siede sarà occupato con il contenuto delle temp
(questo è il ruolo del costruttore di copie predefinito, che esegue operator=
per ogni membro della classe, rivedere la "regola dei tre").
L'overloading dell'operatore comporta un sacco di problemi che potrebbero non essere previsti se non si dispone di una conoscenza più o meno approfondita della lingua, come si può vedere. Prendi in considerazione anche che linguaggi come Java impediscono completamente il suo utilizzo, mentre C# lo consente da una prospettiva controllata.
FYI; Questo è un costrutto creato per creare ACCA, come esercizio per il lettore. –