Jump to content

[C++] Conversii


Cdorsu
 Share

Recommended Posts

Pe langa metoda clasica de conversii:

#include <iostream>
int main()
{
    void* pvValoare = new int(3);
    int iValoare = *(int*)(pvValoare);
}

exista si unele metode de conversii care se axeaza destul de mult pe pointer: dynamic_cast, static_cast, const_cast si reinterpret_cast. Toate avand acelasi tip de argument si aceeasi metoda de folosire.

dynamic_cast<tip_in_care_dorim_sa_facem_conversia>(argument);
static_cast<tip_in_care_dorim_sa_facem_conversia>(argument);
reinterpret_cast<tip_in_care_dorim_sa_facem_conversia>(argument);
const_cast<tip_in_care_dorim_sa_facem_conversia>(argument);

O sa vorbesc putin despre fiecare. O sa incep cu cel mai usor: const_cast

Face conversii intre tipuri de date constante si neconstante.

#include <iostream>
int main()
{
    const char* pcText = "Text";
    char* pcText1 = pcText;
}

Codul de mai sus va produce o eroare, pe cand codul de mai jos nu.

#include <iostream>
int main()
{
    const char* pcText = "Text";
    char* pcText1 = const_cast<char*>(pcText);
}

reinterpret_cast

Converteste un pointer catre orice alt tip de pointer.

#include <iostream>
class clasa_mea
{
private:
    int m_iValoare;
public:
    clasa_mea(int arg):m_iValoare(arg)
    {};
};
class clasa_mea1
{
private:
    int m_iValoare;
public:
    clasa_mea1(int arg):m_iValoare(arg)
    {};
    void print()
    {
        std::cout<<m_iValoare;
    };
};

int main()
{
    clasa_mea* pcmPointer = new clasa_mea(3);
    clasa_mea1* pcm1Pointer = pcmPointer;
    pcm1Pointer->print();
}

Codul de mai sus produce o eroare, codul de mai jos nu produce o eroare.

#include <iostream>

class clasa_mea
{
private:
    int m_iValoare;
public:
    clasa_mea(int arg):m_iValoare(arg)
    {};
};
class clasa_mea1
{
private:
    int m_iValoare;
public:
    clasa_mea1(int arg):m_iValoare(arg)
    {};
    void print()
    {
        std::cout<<m_iValoare;
    };
};

int main()
{
    clasa_mea* pcmPointer = new clasa_mea(3);
    clasa_mea1* pcm1Pointer = reinterpret_cast<clasa_mea1*>(pcmPointer);
    pcm1Pointer->print();
}

static_cast

Converteste un pointer catre o clasa familiara (mostenitoare sau mostenita)

#include <iostream>

class clasa_mea
{
public:
    int m_iValoare;
    clasa_mea(int arg):m_iValoare(arg)
    {};
};

class clasa_mea1:public clasa_mea
{
private:
    int m_iValoare1;
public:
    void print()
    {
        std::cout<<m_iValoare<<' '<<m_iValoare1;
    };
};

int main()
{
    clasa_mea* pcmPointer = new clasa_mea(3);
    clasa_mea1* pcm1Pointer = pcmPointer;
    pcm1Pointer->print();
}

Acest cod produce eroare si, cred ca deja v-ati prins, codul de mai jos nu.

#include <iostream>

class clasa_mea
{
public:
    int m_iValoare;
    clasa_mea(int arg):m_iValoare(arg)
    {};
};

class clasa_mea1:public clasa_mea
{
private:
    int m_iValoare1;
public:
    void print()
    {
        std::cout<<m_iValoare<<' '<<m_iValoare1;
    };
};

int main()
{
    clasa_mea* pcmPointer = new clasa_mea(3);
    clasa_mea1* pcm1Pointer = static_cast<clasa_mea1*>(pcmPointer);
    pcm1Pointer->print();
}

static_cast va apela constructorul care are un singur parametru.

static_cast poate face conversii intre tipuri numerice. Exemplu: int->float, float->int

static_cast poate face conversii catre o referinta rvalue.

static_cast poate face conversii intre o enumeratie si un int.

dynamic_cast

Poate face conversii doar cu pointeri si referinte (sau void*) intre clase familiare

#include <iostream>
class clasa_baza
{
private:
    int m_iValoare;
public:
    clasa_baza(int arg):m_iValoare(arg)
    {};
    virtual void Ceva()
    {
    };
    void Print()
    {
        std::cout<<m_iValoare;
    };
    int GetValoare()
    {
        return m_iValoare;
    };
};
class clasa_derivata:public clasa_baza
{
    int m_iValoare;
public:
    clasa_derivata(int arg, int arg1):clasa_baza(arg1),
        m_iValoare(arg)
    {};
    void print()
    {
        std::cout<<m_iValoare<<' '<<GetValoare();
    };
};
int main()
{
    clasa_baza* pcbPointer = new clasa_derivata(5,3);
    clasa_derivata* pcdObiect1 = pcbPointer;
    pcdObiect1->print();
}

Codul de mai sus eroare, codul de mai jos succes.

#include <iostream>
class clasa_baza
{
private:
    int m_iValoare;
public:
    clasa_baza(int arg):m_iValoare(arg)
    {};
    virtual void Ceva()
    {
    };
    void Print()
    {
        std::cout<<m_iValoare;
    };
    int GetValoare()
    {
        return m_iValoare;
    };
};
class clasa_derivata:public clasa_baza
{
    int m_iValoare;
public:
    clasa_derivata(int arg, int arg1):clasa_baza(arg1),
        m_iValoare(arg)
    {};
    void print()
    {
        std::cout<<m_iValoare<<' '<<GetValoare();
    };
};
int main()
{
    clasa_baza* pcbPointer = new clasa_derivata(5,3);
    clasa_derivata* pcdObiect1 = dynamic_cast<clasa_derivata*>(pvPointer);
    pcdObiect1->print();
}

Sper ca ati inteles ceva din ce am incercat eu sa explic.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.