C++:Elenchi di inizializzazione/Convenzioni di denominazione

C++:Elenchi di inizializzazione/Convenzioni di denominazione


Il codice seguente funziona sulla mia macchina, ma è una buona pratica/garantito per funzionare?


struct MyStruct {
MyStruct(int x, int y, int z) :
x(x),
y(y),
z(z) {
}
int x;
int y;
int z;
};

In particolare, x(x) è garantito per fare ciò che voglio? (ovvero, la variabile in un elenco di inizializzazione guarda sempre a quel membro della struttura/classe?)


Non voglio usare caratteri di sottolineatura iniziali o finali poiché x è un membro pubblico della struttura.


Grazie!


Risposte:


Sì, è garantito che faccia ciò che ti aspetti.


L'unica cosa che può esistere "al di fuori" delle parentesi in un elenco di inizializzatori sono le variabili membro. E tra parentesi valgono le solite regole; le variabili locali nascondono le variabili membro.


Per quanto riguarda se è una buona pratica, beh, considera cosa succede se rimuovi accidentalmente uno o più argomenti dall'elenco degli argomenti del costruttore. Il codice verrà comunque compilato correttamente! Ma si romperà orribilmente in fase di esecuzione. Tuttavia, uso ancora questo modello abbastanza frequentemente.


Alcune risposte al codice


struct MyStruct {    MyStruct(int x, int y, int z) :
x(x),
y(y),
z(z) { }
int x;
int y;
int z;
};
class MyStruct { public:    MyStruct(int x, int y, int z)    :   x(x),
y(y),
z(z)
{ } int x() const;
int y() const;
int z() const;
private: int x;
int y;
int z;
};