2009-10-19 18 views
5

OK Nie jestem bardzo doświadczonym programistą C++, ale zastanawiałem się, jakie jest znaczenie podkreśleń w argumentach następującego konstruktora?Jakie jest znaczenie wiodących podkreśleń w konstruktorze C++?

class floatCoords 
{ 
public: 
    floatCoords(float _x, float _y, float _width, float _height) 
    : x(_x), y(_y), width(_width), height(_height) 
    { 

    } 
    float x, y, width, height; 
    ... 

Odpowiedz

8

To tylko wygodna konwencja nazewnictwa, to nic nie znaczy dla tego języka. Po prostu upewnij się, że nie podążasz za nim wielkimi literami: What does double underscore (__const) mean in C?

+2

Zobacz również: http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 –

+0

@Martin: Dzięki, podoba mi się twój link jeszcze lepiej. –

+1

Unikam napotkanych znaków podkreślenia, więc nie muszę wyjaśniać/pamiętać, że "nie podążaj za dużą literą". –

1

Są to tylko nazwy przekazanych parametrów. Zdarza się, że dopasowują zmienne składowe i są używane do inicjalizacji.

Nie ma specjalnego znaczenia - jest to konwencja, z której mogą korzystać niektórzy ludzie.

9

Nic specjalnego. Właśnie tak to nazwał, aby odróżnić zmienne składowe i nazwy parametrów.

Podkreślenie to poprawna postać w identyfikatorach C++.

+1

Ponadto, zwykle zmienne składowe mają undersco res według konwencji, a argumenty konstruktora nie. To wszystko zależy od lokalnej konwencji kodowania. Niektóre sklepy wymagają "m_" przed członkami. Trzymaj się z dala od podwójnych podkreśleń (zarezerwowane tylko dla użycia kompilatora). zobacz: http://stackoverflow.com/questions/1228161/why-use-prefixes-on-member-variables-in-c-classes – bluehavana

+3

Widziałem wystarczająco dużo kodu, by powiedzieć, że nic w imionach prywatnych członków, znacznie mniej podkreśleń, są konwencjonalne. – coppro

+2

Należy również zauważyć, że to rozróżnienie nie jest bezwzględnie konieczne w inicjatorze ctor - wyszukiwanie nazwy dla członków znajduje tylko członków, a wyszukiwanie nazw wewnątrz inicjalizatora znajdzie nazwę parametru jako pierwszą. – coppro

0

Nie mają one znaczenia syntaktycznego. Jednak jeśli masz kilka pól (na przykład x, y, width i height), popularną konwencją jest nadawanie nazw parametrom konstruktora, które inicjalizują je nazwą pola oraz wiodącym podkreśleniem.

0

Celem tych podkreśleń jest wyróżnienie zmiennej parametru float _x oraz zmiennej składowej float x. Składnie, nie ma specjalnego znaczenia dodanego ze względu na podkreślenia. Osobiście wolę prefikować wszystkie parametry za pomocą a_ i poprzedzić wszystkie zmienne składowe za pomocą m_, kiedy będę musiał kodować C++.

Kiedy dochodzę do sytuacji, w której muszę wymieszać i dopasować zmienne lokalne, składowe i parametry, wiem, z którymi mam do czynienia.

int y = a_x * 2; 
m_x = y + 3; 
8

Najprawdopodobniej autor kodu próbował uniknąć potencjalnego konfliktu między nazwami członków danych i nazwami parametrów konstruktora na liście inicjalizatora. Całkiem prawdopodobne, że autor nie był świadomy faktu, że zasady wyszukiwania C++ upewniają się, że konflikt i tak nie wystąpi. To znaczy. poniższy kod będzie także dawał oczekiwane wyniki:

class floatCoords { 
    public: 
     floatCoords(float x, float y, float width, float height) 
       : x(x), y(y), width(width), height(height) 
     { 
     } 
     float x, y, width, height; 
     ... 

, chociaż może to okazać się mylące dla nieprzygotowanego czytelnika.

Oczywiście w treści konstruktora nazwy parametrów będą ukrywać nazwy elementów, przez co konieczne będzie użycie this->... lub nazw kwalifikowanych w celu uzyskania dostępu do elementów danych. Prawdopodobnie autor kodu próbował tego również uniknąć.

+0

Interesujące, nie znałem tego kąska. Jednak w moim umyśle byłoby jeszcze lepiej używać nazw parametrów, które nie pasują do nazw zmiennych składowych. W tym przypadku możesz użyć x i y jako parametrów w ctor, ale gdybyś napisał metody setX i setY, musiałbyś użyć innych nazw parametrów. Wolę zachować spójność nazw parametrów w całej klasie. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot: Niekoniecznie. Składnia 'this-> member 'pozwala ci implementować metody' setX' i 'setY', nawet jeśli nazwy parametrów ukrywają nazwy elementów. Niektóre standardy kodowania rzeczywiście wymagają od członków klasy dostępu zawsze poprzez składnię 'this-> member' (jest w tym pewna wartość, muszę przyznać). – AnT

+0

@AndreyT: Dobrze trafiłeś. Jeśli jest używana konsekwentnie, składnia this-> member jest bardzo wyraźna (widziałem ten format w wielu klasach Javy). Co jednak dzieje się, gdy zapomnisz części "this->"? Nie jestem pewien, co to za zachowanie, ale wyobrażam sobie, że dzieje się tak często w dużych projektach. Nawet jeśli nic strasznego się nie dzieje, niekonsekwencja w kodzie przeszkadzałaby mi (wybieram tu nitkę). – ThisSuitIsBlackNot

0

ponieważ jeśli nazwałbyś den float x, float y itp., Nie miałbyś dostępu do rzeczywistych pól klasy, ponieważ mają one takie same nazwy.

to nie ma nic wspólnego z językiem, to tylko konwencja o rzeczywistej programatora (aby kod bardziej oczywiste, jak sądzę)

2

Są to tylko konwencja nazywania zmiennych, że różne osoby/instytucje zakładają. Może się to wydawać niepotrzebne na pierwszy rzut oka, ale jest bardzo przydatne przy czytaniu i pisaniu kodu, szczególnie gdy masz parametry i zmienne składowe o tej samej nazwie. Na przykład.można zwykle mają te trzy przypadki:

class A { 
    void foo(int age_) { //parameter 
    int age = 18; //local scope 
    if (age_ > age) cout << legal << endl; 
    } 
    int _age; //member 
}; 

w powyższym przykładzie:

  • _variable - oznacza, że ​​jest to zmienna członka klasy
  • variable_ - oznacza, że ​​jest to parametr do funkcji
  • zmienna - oznacza, że ​​jest to zwykła zmienna lokalna dla zakresu funkcji
+0

i _Variable tresspasses na przestrzeń nazw executor. –