تبدیل‌ ضمنی

یک تبدیل ضمنی به صورت خودکار توسط کامپایلر انجام می‌شود. برای مثال تمام تبدیل‌ها بین انواع داده اولیه (مانند int ،double ،long و …) می‌تواند به صورت ضمنی توسط کامپایلر انجام شود.

long   number1 = 5;        // int implicitly converted to long
double number2 = number1 ; // long implicitly converted to double

تبدیل‌های ضمنی به دو دسته تقسیم می‌شوند:

  • تبدیل ضمنی به نوع بالاتر (promotion)
  • تبدیل ضمنی به نوع پایین‌تر (demotion)

تبدیل Promotion زمانی اتفاق می افتد که نوع داده ما به صورت ضمنی به یک نوع داده بزرگتر تبدیل شود و تبدیل demotion زمانی اتفاق می افتد که نوع داده ما به صورت ضمنی به یک نوع داده کوچکتر تبدیل شود. تبدیل به یک نوع پایین‌تر می‌تواند باعث از بین رفتن بخشی از داده ما شود و این نوع تبدیل‌ها در بیشتر کامپایلرها به عنوان یک هشدار نمایش داده می‌شود. اگر هدف واقعی شما از بین رفتن بخشی از داده است، برای برطرف شدن هشدارها می‌توانید این تبدیل به نوع پایین‌تر را به صورت صریح انجام دهید.

  1: #include <iostream>
  2: using namespace std;
  3: 
  4: int main()
  5: {
  6:     // Promotion
  7:     long   longVar   = 5;      
  8:     double doubleVar = longVar;
  9:                                
 10:     // Demotion                
 11:     int    intVar    = 10.5;   
 12:     bool   boolVar   = intVar; 
 13: 
 14:     cout << longVar   << endl;
 15:     cout << doubleVar << endl;
 16:                       
 17:     cout << intVar    << endl;
 18:     cout << boolVar   << endl; 
 19: }
5
5
10
1

همانطور که در خطوط 8-7 کد بالا مشاهده می کنید، در این خطوط تبدیل ضمنی از نوع Promotion اتفاق افتاده در نتیجه اصلاعات از بین نمی روند. ولی چون در خطوط 12-11 ما یک مقدار از یک نوع بزرگتر را در یک نوع کوچکتر قرار داده ایم، بخشی از اطلاعات از بین می روند.