2012-03-06 17 views
12

W ramach funkcji składowej klasy w C++, czy robi to różnicę, jeśli używam this->dataMember lub tylko dataMember? Co uważa się za lepszy styl? Czy jest jakaś różnica w wydajności?Czy powinienem używać `this` w klasie?

(nie mówię o przypadku, gdy zmienna lokalna ma taką samą nazwę jak członka danych, w takim przypadku należy, według mojej wiedzy, wykorzystać this-> ich odróżnić.)

Odpowiedz

4

to po prostu zbędny używać this-> do wywoływania członków, chyba że chcesz szybko odróżnić miejscowych i członków od semantyki. Wiele osób używa prefiksu m_ dla członków klasy, aby cały czas unikać pisania this->.

1

użycie tego gdy masz ukryty/Private Member =) w każdym innym przypadku to nie robi różnicy =)

od centrum informacyjnym IBM cytuję następujący

Unless a class member name is hidden, using the class member name is equivalent to using 
the class member name with the this pointer and the class member access operator (->). 
1

używając " to-> "jest lepsze (masz pewność, że to członkowie), ale to nie robi różnicy.

0

Jeśli funkcja szablonu wywołuje funkcję członka w taki sposób, że wywołanie nie zależy od parametrów szablonu, this-> może być użyty do pomocy kompilator jako alternatywa dla MyUtopicClass<int, double, double>::vin().

+2

Ostrożnie: jeśli 'vin' jest funkcją wirtualną, wtedy' this-> vin() 'oraz' MyUtopicClass :: vin() 'są różne. – aschepler

6

Jest to kwestia stylu. Niektórzy ludzie podoba się dodatkowe this->, aby było bardziej oczywiste, że masz dostęp do członka klasy. Ale jeśli czujesz, że bez tego jest wystarczająco oczywiste, nie będzie różnicy w wygenerowanym kodzie ani wydajności.

(Oprócz przypadku wymienionym z nakładających się zakresów, this-> może być również obowiązkowe w szablonie, gdy próbuje nazwać członkiem klasy bazowej typu zależne).

19

Zgodnie z ogólną zasadą, że to kwestia lokalne konwencje. Większość z miejsc, w których widziałem, nie używa this->, chyba że jest to konieczne, i to jest konwencja, którą również lubię, ale słyszałem o ludziach, którzy wolą korzystać z nich systematycznie.

Istnieją dwa przypadki, gdy jest to konieczne. Po pierwsze, jeśli ukryłeś nazwę o tej samej nazwie w zasięgu lokalnym; jeśli np. masz członka o nazwie toto, a także nazwiesz swój argument funkcji toto. Wiele konwencji kodowania oznacza albo element, albo argines, aby uniknąć tego przypadku, na przykład, , np. wszystkie nazwy elementów zaczynają się od my lub m_ lub nazwa parametru rozpocznie się od the.

Innym przypadkiem jest to, że this-> może być użyty w szablonie, aby nazwa zależała od nazwy . Jest to istotne, jeśli klasa szablonu dziedziczy po typie zależnym od i chcesz uzyskać dostęp do elementu bazy, np.:

template <typename T> 
class Toto : public T 
{ 
public: 
    int f() 
    { 
     return this->g(); 
    } 
}; 

Bez this-> tu g() byłaby nazwa non-zależne, a kompilator będzie szukać go w kontekście definicji szablonu, nie biorąc pod uwagę klasę bazową.

+0

To jest świetna odpowiedź, nie brałem pod uwagę szablonu. – MadPumpkin

5

Zawsze używam podczas dzwonienia do członków funkcji.

  1. Zmienia nazwę funkcji na nazwę zależną, dzięki czemu funkcje klasy podstawowej zostaną znalezione w szablonie klasy.
  2. Pomija on wyszukiwanie zależne od argumentów. ADL ma swoje zalety, ale może prowadzić do zaskakujących zachowań i podoba mi się, jeśli nie wchodzi mi to w drogę.
  3. Nie ma prawdziwych wad, więc używam go do wszystkich wywołań funkcji członkowskich ze względu na spójność.
  4. Bardzo często programuję w Pythonie, gdzie jednoznaczna self jest obowiązkowa, więc nie jest to dla mnie dużym obciążeniem.

Ale dla członków danych używam go tylko wtedy, gdy jest to konieczne, ponieważ nie ma miejsca ADL. Aby odpowiedzieć na twoje pytania:

Czy w ramach funkcji składowej klasy w C++ robi to różnicę, jeśli użyję tego-> dataMember lub po prostu dataMember?

Tak, jeśli znajduje się w szablonie klasy. Następnie dataMember jest uważane za niezależną nazwę, co może prowadzić do różnic semantycznych. Na przykład:

#include <iostream> 

int i = 1; 

struct R { 
    int i; 
    R(): i(2) { } 
}; 

template<typename T> 
struct S: T { 
    void f() { 
    std::cout << i << ' '  // selects ::i 
       << this->i  // selects R::i 
       << std::endl; 
    } 
}; 

int main() { 
    S<R>().f(); 
} 

Co jest uważane za lepsze styl?

Nie sądzę, że w tej społeczności istnieje silna opinia na ten temat. Użyj dowolnego stylu, ale bądź konsekwentny.

Czy występują różnice w wydajności?

Jestem prawie pewien, że nie ma.

Powiązane problemy