Konsturktor w konstuktorze
Ostatnio zmodyfikowano 2019-07-12 17:58
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 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 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; } };
|
|
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: 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. |
|
pekfos |
» 2019-07-12 17:58:43 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 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. |
|
« 1 » |