78 / 90

C++ Type Conversion

C++ tur o'zgartirish (Type Conversion)

C++ bir turdagi maʼlumotlarni boshqasiga oʻzgartirish imkonini beradi. Bu turdagi konvertatsiya sifatida tanilgan.

C++ da konvertatsiya qilishning ikki turi mavjud:

  1. Yashirin konvertatsiya
  2. Aniq konvertatsiya (shuningdek, Type Casting sifatida ham tanilgan)

Yashirin turdagi konvertatsiya

Kompilyator tomonidan avtomatik ravishda amalga oshiriladigan turdagi konvertatsiya yopiq turdagi konvertatsiya deb nomlanadi. Ushbu turdagi konvertatsiya avtomatik konvertatsiya sifatida ham tanilgan.

1-misol: int dan double ga aylantirish

example.cpp
// Yashirin turdagi konversiyaning ishlashi

#include <iostream>
using namespace std;

int main() {
   // num_int ga int qiymatini belgilash
   int num_int = 9;

   // ikki turdagi o'zgaruvchini e'lon qilish
   double num_double;
 
   // yashirin konvertatsiya
   // qo'sh o'zgaruvchiga int qiymatini belgilash
   num_double = num_int;

   cout << "num_int = " << num_int << endl;
   cout << "num_double = " << num_double << endl;

   return 0;
}

Chiqish

kod
num_int = 9
num_double = 9

Dasturda biz int ma'lumotlarini double o'zgaruvchisiga tayinladik.

example.cpp
num_double = num_int;

Bu erda int qiymati num_double o'zgaruvchisiga tayinlanishidan oldin kompilyator tomonidan avtomatik ravishda double ga aylantiriladi. Bu yashirin turdagi konvertatsiyaga misol.

2-misol: double dan int ga avtomatik konvertatsiya

example.cpp
#include <iostream>
using namespace std;

int main() {

   int num_int;
   double num_double = 9.99;

   // yashirin konvertatsiya
   // int o'zgaruvchisiga qo'sh qiymat berish
   num_int = num_double;

   cout << "num_int = " << num_int << endl;
   cout << "num_double = " << num_double << endl;

   return 0;
}

Chiqish

kod
num_int = 9
num_double = 9.99

Dasturda biz double ma'lumotlarini int o'zgaruvchisiga tayinladik.

example.cpp
num_int = num_double;

Bu erda double qiymati num_int o'zgaruvchisiga tayinlanishidan oldin kompilyator tomonidan avtomatik ravishda int ga aylantiriladi. Bu, shuningdek, yashirin turdagi konvertatsiyaga misoldir.

[!NOTE] int o'nli qismga ega bo'lmasligi sababli, yuqoridagi misolda kasrdan keyingi raqamlar qisqartiriladi.

Konvertatsiya paytida ma'lumotlarni yo'qotish (konversiyani toraytirish)

Yuqoridagi misoldan ko'rganimizdek, bir data type dan boshqasiga o'tkazish ma'lumotlar yo'qolishiga moyil. Bu kattaroq turdagi ma'lumotlar kichikroq turdagi ma'lumotlarga aylantirilganda sodir bo'ladi.

Keling, butun sonli ma'lumotlar turlarida turdagi konvertatsiya paytida ma'lumotlar yo'qolishini ko'rib chiqaylik.

Possible Data Loss During Type Conversion in Integer Data Type

Possible Data Loss During Type Conversion in Integer Data Type

Keling, suzuvchi nuqtali ma'lumotlar turlarida turdagi konvertatsiya paytida ma'lumotlar yo'qolishini ko'rib chiqaylik.

Possible Data Loss During Type Conversion in Floating Point Data Type

Possible Data Loss During Type Conversion in Floating Point Data Type

[!NOTE] Butun son va suzuvchi nuqta ma'lumotlar turlari o'rtasida konvertatsiya qilish paytida ma'lumotlar yo'qolishi mumkin.

C++ aniq konversiyasi

Agar dasturchi ma'lumotlarni bir turdan ikkinchisiga qo'lda o'zgartirsa, bu aniq konvertatsiya deb nomlanadi. Ushbu turdagi konvertatsiya, shuningdek, turdagi quyma sifatida ham tanilgan.

C++ da aniq konversiyadan foydalanishning uchta asosiy usuli mavjud:

  1. C++ nomli translatsiyalar
  2. C uslubidagi kasting (shuningdek, cast notation sifatida ham tanilgan)
  3. Funksiya belgilari (shuningdek, eski C++ uslubidagi kasting sifatida ham tanilgan)

[!NOTE] C-style and function-style casting should not be used in modern C++ code.

C++ nomli Castlar

C++ da aniq turdagi konvertatsiya qilish uchun to'rtta ifoda mavjud. Ular C++ nomli castlar sifatida tanilgan. Ular:

  • static_cast
  • dynamic_cast
  • const_cast
  • reinterpret_cast

Har bir operator haqida bilish uchun C++ Named Casts ga tashrif buyuring.

C tipidagi quyma

Nomidan ko'rinib turibdiki, bu turdagi kasting C dasturlash tili tomonidan ma'qullanadi. U cast notation sifatida ham tanilgan.

Sintaksis

example.cpp
(data_type)expression;

Masalan,

example.cpp
// int o'zgaruvchini ishga tushirish
int num_int = 26;

// qo'sh o'zgaruvchini e'lon qilish
double num_double;

// int dan double ga aylantirish
num_double = (double)num_int;

Funksiya uslubidagi kasting

Shuningdek, biz ma'lumotlarni bir turdan ikkinchisiga o'tkazish uchun funksiyaga o'xshash belgilardan foydalanishimiz mumkin.

Sintaksis

example.cpp
data_type(expression);

Masalan,

example.cpp
// int o'zgaruvchini ishga tushirish
int num_int = 26;

// qo'sh o'zgaruvchini e'lon qilish
double num_double;

// int dan double ga aylantirish
num_double = double(num_int);

3-misol: Casting turi

example.cpp
#include <iostream>

using namespace std;

int main() {
    // qo'sh o'zgaruvchini ishga tushirish
    double num_double = 3.56;
    cout << "num_double = " << num_double << endl;

    // Double dan int ga C uslubidagi konvertatsiya
    int num_int1 = (int)num_double;
    cout << "num_int1   = " << num_int1 << endl;

    // funksiya uslubida double dan int ga o'zgartirish
    int num_int2 = int(num_double);
    cout << "num_int2   = " << num_int2 << endl;

    return 0;
}

Chiqish

kod
num_double = 3.56
num_int1   = 3
num_int2   = 3

Biz C uslubi turini konvertatsiya qilishdan va turni o'zgartirish uchun funksiya uslubidagi kastingdan foydalandik va natijalarni ko'rsatdik. Ular bir xil vazifani bajarganligi sababli, ikkalasi ham bizga bir xil natija beradi.

Zamonaviy C++ kodida C-uslubi va funksiya uslubidagi kastingdan qochish kerak. Ushbu translatsiya usullari xavfli deb hisoblanadi, chunki ular C++ nomli cast ifodalari bajaradigan turni tekshirish va cheklovlarni ta'minlamaydi. Ushbu xavfsizlikning etishmasligi dasturlaringizda topish qiyin bo'lgan xatolar va aniqlanmagan xatti-harakatlarga olib kelishi mumkin. Buning o'rniga, turdagi konvertatsiya qilish uchun aniqroq va xavfsizroq variantlarni taklif qiluvchi C++ nomli translatsiyalardan foydalanish tavsiya etiladi.

Shuningdek o'qing: