2011-01-30 5 views
7

Il seguente codice funziona sulla mia macchina, ma è buona pratica/è garantito che funzioni?C++: elenchi di inizializzazione/convenzioni di denominazione

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) garantisce di fare ciò che voglio? (cioè, la variabile in una lista di inizializzazione guarda sempre a quella struct/class 'member?)

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

Grazie!

+0

Mentre il compilatore fa la cosa giusta, qualsiasi persona che guarda il codice sarà sconcertata. E se questo tipo è più complesso di quello che mostri, e aggiungi a questo un decennio e tre generazioni di manutenzione del programmatore, sarà quasi certamente un casino. – sbi

+1

Cosa consiglieresti di fare invece? – FrankMN

risposta

11

Sì, è garantito fare ciò che ci si aspetta.

L'unica cosa che può esistere "fuori" tra parentesi in un elenco di inizializzazione sono variabili membro. E tra parentesi, si applicano le solite regole; le variabili locali nascondono le variabili membro.

Per quanto riguarda la buona pratica, si consideri cosa succede se si rimuovono accidentalmente uno o più argomenti dalla lista degli argomenti del costruttore. Il codice verrà comunque compilato correttamente! Ma si romperà orribilmente in fase di runtime. Tuttavia, uso ancora questo schema abbastanza frequentemente.

0

Sì, x (x) fa esattamente quello che vuoi. x (x) è un nome del membro e x (x) è un argomento formale.

2

Mentre si aspetta che ciò che si fa, immaginare questa situazione per estensione:

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; 
}; 

che non funziona. Ecco perché prefisso i membri della mia classe con m_. Ciò consente al codice molto leggibile di suggerire al lettore che l'identificatore in questione fa parte della classe. Gli identificatori non prefissati sono argomenti della funzione (come nella lista di inizializzazione del costruttore: m_x(x) o variabili locali della funzione).