Wskaźnik this - kiedy go używać?

0

Witam,
Załóżmy że mamy takie 2 konstruktor:

klasa::klasa(int x, float y)
{
    this->x=x;
    this->y=y;
}

14:27:43
klasa::klasa(int x, float y)
{
    x=x;
    y=y;
}

Teoretycznie program działa tak samo, a tak naprawdę który konstruktor jest bardziej poprawny? kiedy i doczego powinniśmy używać wskaźnika this, kiedy on jest niezbędny?

poprawienie tytułu wątku + dodanie znacznika <code class="cpp"> - fp

0

Tylko pierwszy jest poprawny bo w drugim nastepuje nadpisanie zmiennych obiektu zmiennymi lokalnymi. No bo pomyśl, skąd niby kompilator miałby wiedzieć co rozumiesz przez

x=x;
y=y;

? o_O

1

Te dwa konstruktory nie działają tak samo, ale oba są technicznie poprawne. http://ideone.com/URYBYC

Pierwszy najprawdopodobniej robi to, co miałeś na myśli, drugi nadpisuje wartość x lokalnego dla funkcji (argumenty funkcji to normalne zmienne w tejże funkcji), które przesłania x - obiekt klasy. O przesłanianiu: http://pl.wikipedia.org/wiki/Przes%C5%82anianie http://en.wikipedia.org/wiki/Variable_shadowing

Tak przy okazji, może nie jest to niezbędne w przypadku typów podstawowych, ale dobrym przyzwyczajeniem jest używanie listy inicjalizacyjnej konstruktora do trywialnych inicjalizacji. http://pl.wikipedia.org/wiki/Lista_inicjalizacyjna_konstruktora

struct C
{
    C(int x) : x(x) {}
};

Nie tylko unikasz tym sposobem niepotrzebnych inicjalizacji, ale też unikasz takich niejasności - kompilator nie będzie miał wątpliwości czym jest pierwsze x.
Przykład http://ideone.com/JEJBIs

1

W jednej z konwencji dodaje się przedrostek (może być a jak argument) do nazw parametrów:

klasa::klasa(int ax, float ay)
{
     x=ax;
     y=ay;
}
0
kq napisał(a):

Te dwa konstruktory nie działają tak samo

Właśnie się przekonałem, że nie działają tak samo.
Czyli jedno zastosowanie już wiem jakie jest.

Teraz dwa konstruktory działają tak samo:

klasa::klasa(int x, float y)
 {
     this->x=x;
     this->y=y;
 }

 klasa::klasa(int xx, float yy)
 {
     x=xx;
     y=yy;
 }

Zadam jeszcze dziwne pytanie, który sposób jes lepszy? Mamy takiego dziwnego wykłądowce co lubi się czepaić takich szczegółów.

dodanie znacznika <code class="cpp"> - fp

2

Moim zdaniem kod:

    x=x;
    y=y;

Nie robi absolutnie nic i dowolny kompilator z włączonymi optymalizacjami powinien takie coś całkowicie wyciąć z kodu wynikowego.

Zadam jeszcze dziwne pytanie, który sposób jes lepszy?

Ja zawsze stosuję sposób z wykorzystaniem thisa, w każdym obiektowym języku programowania, w każdym projekcie. I z reguły widzę, że inni robią tak samo.

Edit:
W sumie w C++ są te listy jak napisał kolega poniżej, więc można ich użyć, a jak dbamy o const-correctness to chyba nawet trzeba.

Edit2:
Takie coś przechodzi:

class A {
    const int a;
    A(int a): a(a) {
    }
};

A takie coś nie:

class A {
    const int a;
    A(int a) {
        this->a = a;
    }
};
0
damiannn napisał(a):

Zadam jeszcze dziwne pytanie, który sposób jes lepszy? Mamy takiego dziwnego wykłądowce co lubi się czepaić takich szczegółów.

Żaden z powyższych. Używaj list inicjalizacyjnych konstruktora i staraj się nie nadawać zmiennym takich samych nazw - to bardzo rzadko ma sens.

1 użytkowników online, w tym zalogowanych: 0, gości: 1