Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Konsturktor w konstuktorze

Ostatnio zmodyfikowano 2019-07-12 17:58
Autor Wiadomość
Anim
Temat założony przez niniejszego użytkownika
Konsturktor w konstuktorze
» 2019-07-12 14:09:34
Cześć, ostatnio zacząłem uczyć się Javy  i napotkałem w kursie, który przerabiam, że używanie "this->atrybut" w każdym konstruktorze jest niepoprawne i powinno się wywoływać konstruktor w konstruktorze poprzez wykorzystanie "this(atrybuty)". Jak to wygląda w C++? Czy to ma znaczenie czy wykorzystam sposób 1 (w c++ wiem, że nie ma this(atrybuty), ale za to jest Kontruktor(atrybuty)), czy sposób2 (niewłaściwy z punktu widzenia Javy)? :)


SPOSÓB_1
C/C++
class First
{
private:
    int a;
    int b;
    int c;
    int d;
   
public:
    First()
    {
        First( 0, 0 );
    }
    First( int c, int d )
    {
        First( 0, 0, c, d );
    }
   
    First( int a, int b, int c, int d )
    {
        this->a = a;
        this->b = b;
        this->c = c;
        this->d = d;
    }
   
    void write()
    {
        cout << a << " " << b << " " << c << "  " << d << endl;
    }
};

SPOSÓB_2

C/C++
class First
{
private:
    int a;
    int b;
    int c;
    int d;
   
public:
    First()
    {
        this->a = 0;
        this->b = 0;
        this->c = 0;
        this->d = 0;
    }
    First( int c, int d )
    {
        this->a = 0;
        this->b = 0;
        this->c = c;
        this->d = d;
    }
   
    First( int a, int b, int c, int d )
    {
        this->a = a;
        this->b = b;
        this->c = c;
        this->d = d;
    }
   
    void write()
    {
        cout << a << " " << b << " " << c << "  " << d << endl;
    }
};
P-174914
jankowalski25
» 2019-07-12 15:00:28
W tym przypadku najprościej jest użyć listy inicjalizacyjnej konstruktora oraz argumentów domyślnych. Czyli jakoś tak:
C++ (formatowanie coś nie bangla, więc wstawiam to we własnej ramce bez kolorowania)
Konstruktor(typ1 argument1=default1,typ2 argument2=default2,...,typN argumentN=defaultN)
:
    arg1(argument1),
    arg2(argument2),
    ...,
    argN(argumentN)
{}
W takim przypadku nazwa składowej może być taka sama, jak nazwa argumentu, w niczym to nie przeszkadza i zapis
liczba( liczba )
 będzie równoznaczny z napisaniem
this->liczba = liczba;
 wewnątrz konstruktora. A argumenty domyślne są po to, aby nie trzeba było tworzyć wielu konstruktorów, jeśli nie różnią się w zasadzie niczym i wszystko sprowadza się do wywołania jednego konstruktora wewnątrz innego.
P-174915
pekfos
» 2019-07-12 17:58:43
C/C++
First()
{
    First( 0, 0 );
}
First( int c, int d )
{
    First( 0, 0, c, d );
}
Te konstruktory niczego nie inicjalizują. Poprawnie jest tak, przy czym delegowanie konstruktorów jest od C++11
C/C++
First()
    : First( 0, 0 )
{
}
First( int c, int d )
    : First( 0, 0, c, d )
{
}
Zapis this->a = 0; to nie jest to samo co użycie listy inicjalizacyjnej. To zwykłe przypisanie i pole w klasie już było wcześniej skonstruowane. Jeżeli pole jest typu którego nie da się domyślnie skonstruować, to musisz użyć listy inicjalizacyjnej, inaczej dostaniesz błąd kompilacji.
P-174917
« 1 »
  Strona 1 z 1