biowep
28-10-2014, 17:10
Salve,
Dato che sto studiando il C++ ed ogni volta che cerco delle informazioni su una particolare sintassi o risorsa delle librerie standard finisco in un vortice di innumerevoli schede (del browser) aperte con pagine di stack overflow, dove si discutono casi particolari di sintassi astruse ed ambigue che producono risultati completamente differenti da come ci si aspetterebbe. Ecco, dato che ormai sono giorni che sto studiando il linguaggio in questione e che ogni volta che devo fare una determinata cosa, semplicissima ci sono molti modi con sottili differenze per ottenerla.
Pensiamo ad un programma C++ complesso in cui sia presente:
operator overloading
cast impliciti (basati sull'overload degli operatori)
oggetti trattati come se fossero delle funzioni (functors)
chiamate implicite al costruttore predefinito (non sempre chiaramente individuabili)
chiamate implicite al copy constructor predefinito (non sempre chiaramente individuabili)
inizializzazione e assegnamenti con tante sintassi diverse (da C++11 anche la uniform syntax initialization)
varie ambiguità tra cui vexing parse ed incertezza sulla funzione da chiamare (se un oggetto può essere implicitamente convertito a più di un tipo del dato che la funzione prende in input)
method overriding
...
Data una combinazione più o meno complessa di queste cose (che alcuni considerano libertà ma per me sono problema) volevo chiedere a chi normalmente programma in C++ per lavoro (confrontandosi con codice reale scritto da altre persone) quanto spesso ci si imbatte in cose del genere? Io sto usando il linguaggio per scrivere un'applicazione multi piattaforma che ho in mente ma sto facendo tutto da solo quindi non so bene quali siano le good practices.
Se voletem gentilmente spiegatemi dettagliatamente la differenza tra le seguenti sintassi, non sono ancora riuscito a capire a fondo (anche perché in italiano non si trova quasi niente e l'inglese lo comprendo ma non al 100% e non vorrei studiare 2 cose contemporaneate :D).
#include <iostream>
using namespace std;
class Test {
public:
int v;
Test(int val) : v(val) {}
};
int main() {
int valore = 12345;
Test a(valore);
Test b{valore};
Test c = valore;
Test d = {valore};
Test e = Test(valore);
Test f = a;
cout
<< a.v << "\n"
<< b.v << "\n"
<< c.v << "\n"
<< d.v << "\n"
<< e.v << "\n"
<< f.v;
}
Dato che sto studiando il C++ ed ogni volta che cerco delle informazioni su una particolare sintassi o risorsa delle librerie standard finisco in un vortice di innumerevoli schede (del browser) aperte con pagine di stack overflow, dove si discutono casi particolari di sintassi astruse ed ambigue che producono risultati completamente differenti da come ci si aspetterebbe. Ecco, dato che ormai sono giorni che sto studiando il linguaggio in questione e che ogni volta che devo fare una determinata cosa, semplicissima ci sono molti modi con sottili differenze per ottenerla.
Pensiamo ad un programma C++ complesso in cui sia presente:
operator overloading
cast impliciti (basati sull'overload degli operatori)
oggetti trattati come se fossero delle funzioni (functors)
chiamate implicite al costruttore predefinito (non sempre chiaramente individuabili)
chiamate implicite al copy constructor predefinito (non sempre chiaramente individuabili)
inizializzazione e assegnamenti con tante sintassi diverse (da C++11 anche la uniform syntax initialization)
varie ambiguità tra cui vexing parse ed incertezza sulla funzione da chiamare (se un oggetto può essere implicitamente convertito a più di un tipo del dato che la funzione prende in input)
method overriding
...
Data una combinazione più o meno complessa di queste cose (che alcuni considerano libertà ma per me sono problema) volevo chiedere a chi normalmente programma in C++ per lavoro (confrontandosi con codice reale scritto da altre persone) quanto spesso ci si imbatte in cose del genere? Io sto usando il linguaggio per scrivere un'applicazione multi piattaforma che ho in mente ma sto facendo tutto da solo quindi non so bene quali siano le good practices.
Se voletem gentilmente spiegatemi dettagliatamente la differenza tra le seguenti sintassi, non sono ancora riuscito a capire a fondo (anche perché in italiano non si trova quasi niente e l'inglese lo comprendo ma non al 100% e non vorrei studiare 2 cose contemporaneate :D).
#include <iostream>
using namespace std;
class Test {
public:
int v;
Test(int val) : v(val) {}
};
int main() {
int valore = 12345;
Test a(valore);
Test b{valore};
Test c = valore;
Test d = {valore};
Test e = Test(valore);
Test f = a;
cout
<< a.v << "\n"
<< b.v << "\n"
<< c.v << "\n"
<< d.v << "\n"
<< e.v << "\n"
<< f.v;
}