2016-12-07 31 views
44

Właśnie widziałem tej czarnej magii w folly/ManualExecutor.hRecursive deklaracja zmiennej

TimePoint now_ = now_.min(); 

Po grep'ed cały kod źródłowy biblioteki, nie widziałem definicję zmiennej now_ nigdzie indziej niż tutaj. Co tu się dzieje? Czy jest to faktycznie rodzaj rekursywnej deklaracji zmiennej?

+3

myślę tę pytanie można poprawić, jeśli podasz link do dokumentacji 'TimePoint' (jeśli jest dostępny w sieci) lub dodana deklaracja' TimePoint :: min() '(skopiuj i wklej odpowiednie linie z pliku .h, które musi mieć, jeśli się kompiluje). – hyde

+0

Zobacz także: http://stackoverflow.com/questions/325555/c-static-member-method-call-on-class-instance –

+9

jeszcze jeden sposób zaciemniania kodu ... –

Odpowiedz

62

Ten kod jest najprawdopodobniej równa:

TimePoint now_ = TimePoint::min(); 

Oznacza to, min() jest metoda statyczna, a nazywając ją przy użyciu instancji jest taki sam jak nazywając go tak, instancja jest używana tylko do określania Typ. Nie ma w tym żadnej czarnej magii, to tylko dwie składnie do robienia tego samego.

Co do tego, dlaczego dany kod kompiluje: now_ jest już zadeklarowany po lewej stronie linii, więc gdy jest używany do inicjalizacji po prawej stronie, kompilator zna już jego typ i jest w stanie wywołać metodę statyczną. Próba wywołania metody niestatycznej powinna spowodować błąd (patrz komentarz @BenVoigt poniżej).

Jak wynika z faktu, że trzeba było napisać to pytanie, składnia pytania nie jest najbardziej jasna. Może to być kuszące, jeśli nazwa typu jest długa i może być uzasadniona w deklaracjach zmiennych członkowskich z inicjatorem (którym jest kod zapytania). W funkcjach wewnętrznych kodu lepszym sposobem na zmniejszenie liczby powtórzeń jest auto.

+21

Z punktu widzenia kompilatora dwa sposoby zapisu to: równowartość. W przeglądzie kodu tylko jedna z nich byłaby do przyjęcia. Zostawiam to jako ćwiczenie dla czytelnika, aby odgadnąć, który z nich. –

+12

@CodyGray Tak, każdy zna twoją nienawiść do czterech kropek zła. Bądź rozsądny Cody: czasami '::' jest najlepszym wyborem! – Yakk

+1

http://dilbert.com/strip/1994-06-08 –