Pytanie odnośnie konstruktorów i this.

0

Witam, chciałbym się spytać o następującą rzecz a mianowicie o zastosowanie słowa kluczowego this.

Napisałem taki kawałek kodu ("zwykła" klasa), który działa ale nie wiem czy przypadkowo, czy faktycznie tak można zrobić:

 
Ship::Ship(string id, string owner) {
    this -> id = id;
    this -> owner = owner;
    this -> attack = 0;
    this -> defense = 0;
}

Sporo pisałem w Javie i nie wiem czy to nie zła praktyka używać this (o ile w ogóle można?!) w takiej sytuacji. Czy po prostu nie lepiej zrobić:

Ship::Ship(string id_, string owner_) {
    id = id_;
    owner = owner_;
    attack = 0;
    defense = 0;
}

Dodam, że składnię taką podpowiedział mi Netbeans (żeby nie było, że z kosmosu:D ).

Pozdrawiam,

0

Można używać chyba, ale po co tak komplikować(i kompilować) sobie życie? Druga wersja jest lepsza o wiele.

0

Najlepszą metodą jest używanie listy konstruktora.

0

Druga wersja jest lepsza o wiele.

Uzasadnienie? Ja zawsze korzystam z this (w C#, Javie i C++) i jestem zadowolony a i kod bardziej kolorowy.
To że ty wolisz drugą to nie znaczy że jest lepsza, przejedziesz się kiedyś na tym ;).

Ofc w C++ pewnie najlepszą metodą jest lista konstruktora.

1

Czy po prostu nie lepiej zrobić:

Ship::Ship(string id_, string owner_) {
    id = id_;
    owner = owner_;
    attack = 0;
    defense = 0;
}

w stylu C++ będzie lista inicjalizacyjna:

Ship::Ship(string id_, string owner_)
          : id(id_),
            owner(owner_),
            attack(0),
            defense(0)
{}

jeśli klasa po czymś dziedziczy, trzeba pamiętać, by w liście wymienić konstruktor klasy nadrzędnej, np.

Ship::Ship(string id_, string owner_)  // Ship dziedziczy po Vehicle
          : Vehicle(owner_),
            id(id_),
            attack(0),
            defense(0)
{}

składnia wydaje się dziwna (skąd te nawiasy zamiast znaku równości?) ale to po prostu jest wywołanie konstruktorów poszczególnych pól (z intami włącznie).
Na dowód że nawet int

 ma konstruktor, dwie poprawne linijki:

```cpp
int i(4);             // to samo co 'int i = 4'
int *i = new int(4);  // int równy 4, nie cztery inty!

C++ zachowuje się tak, jakby int miał konstruktor:

int::int(const int &a)
{
  *this = a;
}

nie oznacza to, że jest on rzeczywiście wołany, bo to by powodowało zupełnie niepotrzebną utratę wydajności: kompilator powinien go zastąpić normalnym przypisaniem wartości.

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