konstruktor z lekcji o przeciążaniu operatorów
Ostatnio zmodyfikowano 2016-05-11 11:53
pozdro600 Temat założony przez niniejszego użytkownika |
konstruktor z lekcji o przeciążaniu operatorów » 2016-05-10 18:56:28 Cześć, Przykład z lekcji z http://cpp0x.pl/kursy/Programowanie-obiektowe-C++/Podstawy/Operatory/498 #include <iostream>
using namespace std;
class INT { int i; public: INT() : i( 5 ) { } INT( int x ) : i( x + 1 ) { } INT( const INT & x ) : i( x.i * 10 ) { } void wyswietl() const { cout << i << endl; } };
int main() { INT x; int liczba = 99; const INT y( liczba ); INT z( y ); INT z2( const INT y2 ); x.wyswietl(); y.wyswietl(); z.wyswietl(); z2.wyswietl(); return 0; }
Nie do końca rozumiem linijkę: INT( const INT & x ) : i( x.i * 10 ) { }
Dlaczego: INT z2( const INT y2 );
INT z2( const INT y2 = 99 );
const INT y( liczba ); INT z( y );
INT z2( const INT y2( 99 ) );
Powoduje to błąd kompilacji w linii. |
|
michal11 |
» 2016-05-10 20:45:02 |
|
pekfos |
» 2016-05-10 20:52:06 |
|
pozdro600 Temat założony przez niniejszego użytkownika |
» 2016-05-10 21:32:48 michal11 (uczestnik, 2016-05-10 20:45:02) może to ci trochę rozjaśni sytuację: [link: http://cpp0x.pl/forum/temat/?id=22847]
Kajam się. Odesłałeś mnie do mojego poprzedniego tematu. Mam nadzieję następnym razem sam wpaść na to. @pekfos Myślałem że skoro: int i1 = 5; int i2(5);
to tutaj też mogę wykorzystać, ale już widzę, że to definicja funkcji mi wyszła. Nie wiedziałem, że tak można. Ps. Jak zrobić cytowanie na forum? Dzięki. |
|
carlosmay |
» 2016-05-10 21:48:32 |
|
pozdro600 Temat założony przez niniejszego użytkownika |
» 2016-05-11 09:17:20 Bo nie ma takiej składni. Chciałeś pewnie zrobić INT z2(INT(99)). |
Jednak tego nie rozumiem. Kluczem jest chyba zrozumienie dlaczego kompilator interpretuje moje INT(99) jako normalne int(99)? #include <iostream> using namespace std;
class INT { int i; public: INT() : i( 5 ) { cout << " jeden "; } INT( int x ) : i( x + 3 ) { cout << " dwa "; } INT( const INT & x ) : i( x.i * 10 ) { cout << " trzy "; } };
int main() { INT x; int liczba = 99; const INT y( liczba ); INT z( y ); INT a1(( const INT )( 99 ) ); INT a2( INT( 99 ) ); INT a3( int( 99 ) ); const INT a4(( const int ) 99 ); int testInterpretacji =( INT ) 99; cout << testInterpretacji; return 0; }
Dlaczego: INT a1(( const INT )( 99 ) ); INT a2( INT( 99 ) ); const INT a4(( const int ) 99 );
Jest wywołane jako drugi konstruktor, skoro moja definicja argumentu dla tego konstruktora wygląda inaczej? I skoro INT(99) interpretuje jako argument intowy, to czemu to przez analogie nie działa: int testInterpretacji =( INT ) 99; cout << testInterpretacji;
|
|
carlosmay |
» 2016-05-11 10:53:49 int testInterpretacji =( INT ) 99;
|
int jest typem wbudowanym, a INT typem obiektowym (nazwa klasy). Nie ma znaczenia jaki typ zmiennych przechowuje klasa. Może to być int , a równie dobrze może to być std::string . Kompilator nie wie jak dokonać konwersji (bo nie wie o co nam chodzi), więc wypluwa błąd, error C2440: 'initializing' : cannot convert from 'INT' to 'int' . A tutaj są wskazówki, co oznacza błąd - C2440Przynajmniej taki wywala VS. INT a1(( const INT )( 99 ) ); INT a2( INT( 99 ) ); const INT a4(( const int ) 99 );
|
|
|
pozdro600 Temat założony przez niniejszego użytkownika |
» 2016-05-11 11:50:47
INT a1(( const INT )( 99 ) ); INT a2( INT( 99 ) ); const INT a4(( const int ) 99 );
|
Na pewno jest to niejawne rzutowanie? Przeszedłem do następnej lekcji właśnie o konstruktorach niejawnych i jak dam explitic przy konstruktorach, to i tak się wszystko ładnie kompiluje: #include <iostream> using namespace std;
class INT { int i; public: explicit INT() : i( 5 ) { cout << "pierwszy konstruktor" << endl; } explicit INT( int x ) : i( x ) { cout << "drugi konstruktor" << endl; } explicit INT( const INT & x ) : i( x.i ) { cout << "trzeci konstruktor" << endl; } };
int main() { INT x; int liczba = 99; const INT y( liczba ); INT z( y ); INT a1(( const INT )( 99 ) ); INT a2( INT( 99 ) ); INT a3( int( 99 ) ); const INT a4(( const int ) 99 ); return 0; }
|
|
« 1 » 2 |