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

konstruktor z lekcji o przeciążaniu operatorów

Ostatnio zmodyfikowano 2016-05-11 11:53
Autor Wiadomość
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

C/C++
#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ę:
C/C++
INT( const INT & x )
    : i( x.i * 10 )
{
}
Dlaczego:
C/C++
INT z2( const INT y2 );
//lub
INT z2( const INT y2 = 99 );
//nie jest tym samym co:
const INT y( liczba );
INT z( y );

// a z kolei to poniżej się nie kompiluje w ogóle:
INT z2( const INT y2( 99 ) );

Powoduje to błąd kompilacji w linii.
C/C++
z2.wyswietl();
P-148088
michal11
» 2016-05-10 20:45:02
może to ci trochę rozjaśni sytuację: http://cpp0x.pl/forum/temat/​?id=22847
P-148090
pekfos
» 2016-05-10 20:52:06
Dlaczego:
C/C++
INT z2( const INT y2 );
//lub
INT z2( const INT y2 = 99 );
//nie jest tym samym co:
const INT y( liczba );
INT z( y );
https://en.wikipedia.org/wiki​/Most_vexing_parse

C/C++
// a z kolei to poniżej się nie kompiluje w ogóle:
INT z2( const INT y2( 99 ) );
Bo nie ma takiej składni. Chciałeś pewnie zrobić INT z2(INT(99)).
P-148091
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.


C/C++
INT z2( INT( 99 ) )
Nie wiedziałem, że tak można.

Ps. Jak zrobić cytowanie na forum?

Dzięki.
P-148093
carlosmay
» 2016-05-10 21:48:32
Ps. Jak zrobić cytowanie na forum?
Tutaj masz wszystko - Kurs STC
P-148094
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)?

C/C++
#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; //pierwszy konstruktor
   
    int liczba = 99;
    const INT y( liczba ); //drugi konstruktor
    INT z( y ); //trzeci konstruktor
   
    INT a1(( const INT )( 99 ) ); //drugi?
    INT a2( INT( 99 ) ); //drugi?
    INT a3( int( 99 ) ); //drugi konstruktor
    const INT a4(( const int ) 99 ); //drugi ?
   
    int testInterpretacji =( INT ) 99; //blad kompilacji
    cout << testInterpretacji;
   
    return 0;
}

Dlaczego:
C/C++
INT a1(( const INT )( 99 ) ); //drugi?
INT a2( INT( 99 ) ); //drugi?
const INT a4(( const int ) 99 ); //drugi?

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:
C/C++
int testInterpretacji =( INT ) 99; //blad kompilacji
cout << testInterpretacji;
P-148106
carlosmay
» 2016-05-11 10:53:49
C/C++
int testInterpretacji =( INT ) 99; //blad kompilacji
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 - C2440
Przynajmniej taki wywala VS.

C/C++
INT a1(( const INT )( 99 ) ); // niejawne rzutowanie na typ int (argumentem jest konstruktor)
INT a2( INT( 99 ) ); // to samo
const INT a4(( const int ) 99 ); // argumentem jest typ int
P-148107
pozdro600
Temat założony przez niniejszego użytkownika
» 2016-05-11 11:50:47

C/C++
INT a1(( const INT )( 99 ) ); // niejawne rzutowanie na typ int (argumentem jest konstruktor)
INT a2( INT( 99 ) ); // to samo
const INT a4(( const int ) 99 ); // argumentem jest typ int

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:
C/C++
#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; //pierwszy konstruktor
   
    int liczba = 99;
    const INT y( liczba ); //drugi konstruktor
    INT z( y ); //trzeci konstruktor
   
    INT a1(( const INT )( 99 ) ); //2 - niejawne(?) rzutowanie na tym int, argumentem jest konstruktor
    INT a2( INT( 99 ) ); //2 - jw.(?)
    INT a3( int( 99 ) ); //2 - argumentem jest int
    const INT a4(( const int ) 99 ); //2 - jw.
   
    return 0;
}
P-148110
« 1 » 2
  Strona 1 z 2 Następna strona