Típuskonverzió a C++ nyelvben Miskolci Egyetem Általános Informatikai Tanszék Típus konverzió a C++ nyelvben CPP3 / 1 Lehetséges konverziók A C++ szigorúbban kezeli a típuseltéréseket, mint a C nyelv Lehetséges típuskonverziók: Standard típuskonverzió az alaptípusokra (a C-bol örökölve) Standard típuskonverzió osztálytípusok között Programozó által definiált típuskonverziók Típus konverzió a C++ nyelvben CPP3 / 2 Automatikus konverzió osztálytípusokra Osztálytípusok között az alábbi automatikus konverziók lehetségesek: származtatott osztály => public bázisosztály származtatott osztály& => public bázisosztály& származtatott osztály* => public bázisosztály* bármilyen osztály* => void* Típus konverzió a C++ nyelvben CPP3 / 3
Felhasználó által definiált konverziók 1. Tetszoleges típusról osztálytípusra Az egy argumentumú konstruktor az argumentuma típusáról történo konverziót definiál és engedélyez! Osztálytípusról tetszoleges típusra Speciális tagfüggvény (konverziós operátor) operator <típus> () ahol típus tetszoleges típusnév Sem visszatérési érték, sem argumentum nem adható meg. A konverziós operátorok öröklodnek. Típus konverzió a C++ nyelvben CPP3 / 4 A konverziók alkalmazása A fordítóprogram mindig jogosult az automatikus konverziók alkalmazására A fordítóprogram jogosult a programozó által definiált konverziók alkalmazására Ez nem tiltható meg! Az egyparaméteres konstruktor mindig konverziót is lehetové tesz! (Akkor is, ha csak inicializáció miatt írtuk.) Kivétel: explicit konstruktor! A fordítóprogram többlépcsos konverziót is alkalmaz, ha azzal típusegyezést tud elérni. Típus konverzió a C++ nyelvben CPP3 / 5 Az explicit konstruktor Az explicit kulcssszóval minosített konstruktor nem definiál konverziót Csak az inicializálást igénylo esetekben hívódik meg. Típus konverzió a C++ nyelvben CPP3 / 6
cppex24.c // Konstruktor mint konverziós operátor class CString { int m_nhossz; char* m_pchszoveg; public: CString (char* st) {m_nhossz = strlen(st); m_pchszoveg = new char [m_nhossz+1]; strcpy (m_pchszoveg,st); }; Típus konverzió a C++ nyelvben CPP3 / 7 CString (int szam) {// Konvertalas egesz szamról stringre }; int milyenhosszu (void)const { return m_nhossz; }; void kiir (void) const { cout << "\n" << m_pchszoveg; }; }; int hossz (CString st) { return st.milyenhosszu(); }; Típus konverzió a C++ nyelvben CPP3 / 8 void main(void) { CString lakcim = "Kiss Aladár u. 3"; lakcim.kiir(); int i = hossz ("Hello"); cout << "\nhossz=" << i; Típus konverzió a C++ nyelvben CPP3 / 9
// int => CString konverziót hajt végre CString szam = 123; szam.kiir(); // float => int standard konverzió után // int => CString konverzió CString pi = 3.1415; pi.kiir(); Típus konverzió a C++ nyelvben CPP3 / 10 // int => CString konverziót hajt végre i = hossz (1234); cout << "\nhossz=" << i; // Nincs olyan konverzió, amivel // típusegyezoség hozható létre // Az alábbi két sor tehát hibajelzést // eredményezne //int *p; //i = hossz (p); Típus konverzió a C++ nyelvben CPP3 / 11 // char => int konverzió után // int => CString konverzió. // Biztosan ezt vártuk? CString betu = a ; //A fenti sor hibajelzést generál az // explicit CString (int szam) // deklarációt használva. // Ekkor írható az alábbi: CString betu = String( a ); } Típus konverzió a C++ nyelvben CPP3 / 12
// Példaprogram konverziós operátorokra class CString { int m_nhossz; char* m_pchszoveg; public: CString (char* st) {... }; operator char* () { return m_pchszoveg; }; void kiir (void) { cout << "\n" << szoveg; }; Típus konverzió a C++ nyelvben CPP3 / 13 (folyt.) void main(void) { CString lakcim = "Kiss Aladar u. 3"; lakcim.kiir(); // CString => char* konverziót hajt végre, // explicit kérés miatt cout << "\n" << (char*) lakcim; Típus konverzió a C++ nyelvben CPP3 / 14 (folyt.) // Implicit CString => char* konverziót // hajt végre az strcpy fgv. prototípusa // miatt char szoveg[50]; strcpy(szoveg,lakcim); cout << "\n" << szoveg; } Típus konverzió a C++ nyelvben CPP3 / 15