reinterpret_cast amali
reinterpret_cast amali bir-biri bog’lanmagan tiplarni, masalan, ko’rsatgichlarni butunlarga va aksincha void tipida ko’rsatgichlarni konkret tipga almashtirish uchun qo’llaniladi. Bunda ma’lumotlarni ichki tasviri o’zgarmay qoladi, faqat kompilyatorning ma’lumotlarga nuqtai nazari (qarashi) o’zgaradi.
Amal formati
reinterpret_cast (ifoda)
Amal natijasi murojaat, ko’rsatgich butun yoki haqiqiy tipdan iborat ko’rsatgich tipga ega.
Misol:
char *р = reinterpret_cast (malloc(100));
long l = reinterpret_cast (p);
static_cast va reinterpret_cast orasidagi farq kompilyatorga static_cast dan foydalanganda minimal tekshirishga, dasturchiga – reinterpret_cast yordamida xavfli almashtirish belgilashga imkon beradi. Almashtirish natijasi dasturchi vijdoniga havola.
Tipning dinamik ta’rifi
Tipni identifikatsiyalash mexanizmi dasturni bajarish vaqtida (RTTI) hozirgi paytda ko’rsatgich qanday tipga murojaat qilayotganini hamda obyektlar tiplarini taqqoslashga imkon beradi. RTTI ga kirish uchun til standartiga typeid va type_info sinfi kiritilgan.
typeid amali formati:
typeid (tip)
typeid (ifoda)
Amal parameter sifatida tip nomi yoki ifodani qabul qiladi va tip haqida ma’lumotni o’z ichiga olgan type_info sinf obyektga murojaatni qaytaradi. Agar amal operand tipini aniqlay olmasa bad_typeid favqulotda holat hosil bo’ladi. Operand polimorf tipga ko’rsatgich yoki murojaatdan iborat bo’lganda natija tip haqida dinamik ma’lumotdan iborat (ya’ni type_info obyekt berilgan paytda ko’rsatgich murojaat qilayotgan obyekt tipi haqida ma’lumotni o’z ichiga oladi).
Agar operand polimorf bo’lgan tipga ko’rsatgichdan iborat ifoda bo’lsa, type_info obyekt u murojaat qilayotgan obyekt tipi haqida emas, ifoda tipi haqidagi ma’lumotni o’z ichiga oladi.
typeid amali ham asosiy, ham hosila ma’lumotlar tiplari bilan ishlashi mumkin.
type_info sinfi sarlavha faylida quyidagicha tavsiflanadi:
class type_info{
public:
virtual ~type_info();
bool operator==(const type_info& rhs) const;
bool operator!=(const type_info& rhs) const;
bool before(const type_info& rhs) const;
const char* name() const;
private:
type_info(const type_info& rhs);
type_info& operator=(const type_info& rhs);
};
name usuli type_info tipidagi obyekt bilan tavsiflanadigan tip nomidan iborat satrga ko’rsatgichni qaytaradi.
Vertual destruktor type_info sinfni polimorf qiladi.
Nusxalash konstruktori va qiymat berish amali sinfning obyektlari tasodifan nusxalash va qiymat berish imkoniyatini bartaraf etish uchun private kabi e’lon qilingan.
== va != amallar ikkita obyektni tenglik va tengsizlikka taqqoslashga imkon beradi, before funksiya esa ikki tipdagi nomlarini xarfma-xarf taqqoslashni bajaradi. Taqqoslash uchun
typeid(T1).before(typeid(T2))
ko’rinishdagi konstruktor ishlatiladi.
Agar T1 tip nomi leksikografik T2 nomidan oldin kelsa, natija rost bo’ladi.
Dastur bajarish paytida obyekt tipi haqidagi aniq ma’lumot kerak bo’lishi mumkin, masalan, dasturchi biror kutubxona bazaviy sinf funksionalligini kengaytirganda, bazaviy sinfga virtual funksiyalarni qo’shish mumkin emas yoki ma’nosiz. Masalan:
#include
class В{
public: virtual ~В(){};
};
class С: public В{
public: virtual void some_method(){ ... };
};
void demo(B* р){
if (typeid(*p) == typeid(C))
dynamic_cast(p)->some_method();
}
int main(){
C* с = new C; demo(c);
return 0;
}
Tip haqida ma’lumotni diagnostik (tashhis) maqsadlarida foydalanish mumkin:
void print_type(some_obj *р){
cout << typeid(*p).name();
}
typeid amali vertual funksiya o’rniga va obyekt tipini kompilyatsiya bosqichida aniqlash mumkin bo’lgan hollarda qo’llanilishi mumkin emas.
Do'stlaringiz bilan baham: |