2011-01-30 9 views
7

Poniższy kod działa na moim komputerze, ale czy jest to dobra praktyka/gwarantowana praca?C++: Listy inicjalizacji/Konwencje nazewnictwa

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

    int x; 
    int y; 
    int z; 
}; 

W szczególności, czy x (x) gwarantuje wykonanie tego, co chcę? (to znaczy, czy zmienna na liście inicjalizacyjnej zawsze patrzy na członka struktury/klasy?)

Nie chcę używać wyprzedzających lub końcowych podkreśleń, ponieważ x jest publicznym członkiem struktury.

Dzięki!

+0

Podczas kompilacji robi to dobrze, każdy człowiek patrząc na kod będzie zdziwiony. A jeśli ten typ jest bardziej złożony niż to, co pokazujesz, a dodasz do tego dekadę i trzy generacje programistyczne konserwacji, prawie na pewno skończy się to bałaganem. – sbi

+1

Co byś zamiast tego polecił? – FrankMN

Odpowiedz

11

Tak, to gwarantuje wykonanie tego, czego się spodziewasz.

Jedyne, co może istnieć "poza" nawiasami na liście inicjalizatora, to zmienne składowe. W nawiasach obowiązują zwykłe reguły; zmienne lokalne ukrywają zmienne składowe.

Co do tego, czy to dobra praktyka, cóż, rozważ, co się stanie, jeśli przypadkowo usuniesz jeden lub więcej argumentów z listy argumentów konstruktora. Kod nadal będzie się dobrze kompilować! Ale przerwie to strasznie podczas uruchamiania. Niemniej jednak wciąż używam tego wzoru dość często.

0

Tak, x (x) robi dokładnie to, co chcesz. x (x) to nazwa członka, a x (x) jest formalnym argumentem.

2

Chociaż oczekuje co robisz, wyobraź sobie taką sytuację za tym idzie:

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

Które nie będzie działać. Dlatego przedkładam swoim członkom klasy m_. Pozwala to na bardzo czytelny kod z podpowiedzią dla czytnika, że ​​dany identyfikator jest częścią klasy. Nieprefiksowane identyfikatory są argumentami funkcji (jak na liście inicjatora konstruktora: m_x(x) lub zmiennymi lokalnymi funkcji).