كيفية تحويل أنواع البيانات في C++
في لغة C++، هناك طريقتان لتغيير أنواع البيانات:
تحويل النوع الضمني
وفقًا للقواعد المحددة مسبقًا بواسطة مترجم كود C++، فإن تحويل النوع الضمني هو تحويل النوع الذي ينفذه المترجم تلقائيًا دون الحاجة إلى أي مشغل خارجي من المستخدم. يحدث هذا النوع من التحويل عادةً في البرنامج عندما يكون هناك أكثر من نوع بيانات واحد، ولا يتطابق نوع بيانات التعبير مع نوع بيانات المتغير المتضمن في هذا التعبير.
لتجنب فقدان البيانات أثناء التحويل، يقوم المحول البرمجي افتراضيًا بتغيير نوع البيانات منخفض الدقة بنوع البيانات ذي الدقة الأعلى. على سبيل المثال، سيتم تحويل عدد صحيح إلى عدد عشري بدلاً من تغيير العدد إلى عدد صحيح لمنع فقدان البيانات. وهذا ما يسمى الترويج. فيما يلي مخطط الأسبقية لأنواع البيانات المختلفة.
طلب تحويل النوع
يتم إعطاء الترتيب الصحيح لتحويل النوع على النحو التالي:
منطقي -- > شار -- > كثافة العمليات قصيرة - > كثافة العمليات -- > كثافة العمليات غير الموقعة - > طويل -- > طويلة غير موقعة -- > طويل طويل -- > يطفو -- > مزدوج -- > مزدوج طويل
يتم تحويل متغير النوع منخفض الدقة إلى نوع بيانات عالي الدقة لمنع فقدان البيانات.
مثال 1
في هذا المثال، يتم إجراء عملية الجمع على متغير أنواع البيانات المختلفة باستخدام تحويل النوع الضمني.
#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
كثافة العمليات رئيسي ( ) {
كثافة العمليات رقم = 100 ;
شار شخصية = 'ج' ;
cout << '100 + 'ج' = ' << رقم + شخصية << endl ;
يطفو فال = رقم + 'ج' ;
cout << 'القيمة العائمة (100 + 'c') = ' << فال << endl ;
كثافة العمليات كان = 7890 ;
طويل لم يكن = كان ;
cout << 'فار_int = ' << لم يكن ;
يعود 0 ;
}
هنا تتم إضافة عدد صحيح وحرف من جدول ASCII، بالإضافة إلى رقم عائم وحرف 'c'. يتم الاحتفاظ بالعدد الصحيح في الجزء الثالث كنوع بيانات طويل ويتم تغيير أنواع البيانات بواسطة المترجم نفسه بناءً على قواعده المحددة مسبقًا.
مجموع 100 و'C' يُرجع 167 لأن 'C' يساوي 67 في الأرقام و100+'c' يُرجع 199 لأن الحرف الصغير 'c' يساوي 99. يتم تخزين المتغير int في نوع بيانات طويل.
مثال 2
في هذا المثال، يتم تحويل الحرف D إلى عدد عشري لإجراء عملية القسمة.
#تشملاستخدام مساحة الاسم الأمراض المنقولة جنسيا ;
كثافة العمليات رئيسي ( ) {
شار س = 'د' ;
يطفو float_var ;
float_var = يطفو ( س ) / 'ج' ;
// تحويل int إلى عدد عائم بشكل صريح.
cout << 'قيمة float_var هي:' << float_var << endl ;
يعود 0 ;
}
تكون قيمة الإدخال على شكل الحرف D الذي يتم تخزينه في نوع البيانات العائمة ويتم تقسيمه أيضًا بواسطة الحرف C. ويتم تغيير هذه الأحرف إلى قيم رقمية ويتم تنفيذ عملية القسمة عليها، مما يؤدي إلى إرجاع القيمة في العائمة.
تحويل النوع الصريح
يجب على المستخدم تغيير نوع البيانات يدويًا باستخدام تحويل النوع الصريح في C++، والذي يُعرف غالبًا باسم تحويل النوع. يتم إجراء هذا النوع من الصب لتجنب تحويل النوع الضمني. هناك طريقتان لتنفيذ نوع Explicit Type Casting في لغة C++:
- التحويل باستخدام عامل التعيين
- التحويل باستخدام Cast Operator
اكتب التحويل باستخدام عامل التعيين في C++
يتم إجراء تحويل النوع باستخدام عامل التعيين بقوة، أي أنه يتم تحويل نوع بيانات إلى نوع آخر يدويًا. ويتم تحقيق ذلك باستخدام عامل التعيين '='، الذي يعين قيمة المعامل الأيمن للمتغير الموجود على جانبه الأيسر.
مثال
يقوم هذا البرنامج بحساب مساحة الدائرة باستخدام طريقة الصب.
#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
كثافة العمليات رئيسي ( )
{
كثافة العمليات نصف القطر ;
cout <> نصف القطر ;
يطفو منطقة = M_PI * نصف القطر * نصف القطر ;
cout << 'مساحة الدائرة مع نصف القطر' << نصف القطر << ' = ' << منطقة ;
}
يتم استخدام عامل التعيين لتعيين القيمة العائمة للمنطقة، والتي تتكون من قيمة نصف القطر في نوع البيانات الصحيح.
يتم إرجاع مساحة الدائرة في نوع البيانات العائمة، بينما يتم إدخال نصف القطر في نوع البيانات الصحيح. وبالتالي، يتم تغيير نوع بيانات المتغير عن طريق صب النوع باستخدام عامل التعيين.
اكتب التحويل باستخدام عامل الإرسال في C++
يتم تحويل النوع باستخدام عامل الإرسال، الذي يفرض تغيير نوع بيانات واحد إلى نوع آخر وفقًا لاحتياجات البرنامج.
هناك أربعة مشغلي Cast مختلفين:
- static_cast
- const_cast
- Dynamic_cast
- reinterpret_cast
1: static_cast
static_cast هو عامل الإرسال الذي يتم استخدامه لتحويل العوامات والأحرف بشكل صريح إلى أعداد صحيحة وما إلى ذلك. هذا هو المشغل الأساسي. يمكنه إرسال أنواع البيانات المتشابهة في الطبيعة. يمكنه تحويل المؤشرات من نموذج إلى آخر، لذلك يمكن استخدامه أيضًا لإدارة الذاكرة.
بناء الجملة
static_cast ( تعبير ) مثال
تم تصميم هذا البرنامج لتحويل متغير مزدوج إلى نوع بيانات int باستخدام static_cast. سيتم قطع أي جزء عشري في الإخراج.
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
كثافة العمليات رئيسي ( )
{
// أعلن عن متغير
مزدوج ص ;
ص = 2,905 * 1,235 * 24,675 ;
يطفو نتيجة ;
cout << 'قبل استخدام طاقم الممثلين الثابت:' << endl ;
cout << 'قيمة ع =' << ص << endl ;
// استخدم static_cast لتحويل نوع البيانات
نتيجة = static_cast ( ص ) ;
cout << ' بعد استخدام طاقم الممثلين الثابت: ' << endl ;
cout << 'قيمة النتيجة =' << نتيجة << endl ;
يعود 0 ;
}
في البداية، يتم تحميل المتغير المزدوج p بالقيم التي يتم ضربها في بعضها البعض وتخزينها في النتيجة. تحتوي النتيجة على النتيجة قبل وبعد عامل التشغيل static_cast:
قبل استخدام عامل التشغيل static_cast، يتم عرض النتيجة بالنقاط العشرية، بينما بعد استخدام هذا العامل يتم عرضها بنوع بيانات عدد صحيح.
2: const_cast
يتم استخدام عامل التشغيل const_cast لتحويل قيمة ثابتة لكائن إلى نوع غير ثابت. يتم استخدامه عندما يتم الإعلان عن كائن ثابت، ونحتاج إلى تغيير قيمته من حين لآخر.
بناء الجملة
const_cast ( تعبير ) مثال
في هذا المثال، يتم استخدام عامل التشغيل const_cast لإزالة المؤهل الثابت مؤقتًا ويسمح بإجراء تغييرات في المتغير وفقًا للحاجة:
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
كثافة العمليات رئيسي ( ) {
مقدار ثابت كثافة العمليات س = 70 ;
مقدار ثابت كثافة العمليات * و = & س ;
cout << 'القيمة القديمة هي' << * و << ' \ن ' ;
كثافة العمليات * مع = const_cast ( و ) ;
* مع = 90 ;
cout << 'القيمة الجديدة هي' << * و ;
يعود 0 ;
}
يتم تعيين المؤهل الثابت لمتغير int x مما يعني أنه لا يمكن تعديل هذا المتغير مباشرة. بعد ذلك، يتم استخدام int *y وهو مؤشر للوصول إلى x، ولكن لا يزال من غير الممكن تغييره، ويتم عرض قيمته الأصلية باستخدام cout. باستخدام عامل التشغيل const_cast، يتم إنشاء مؤشر z وهو غير ثابت، ويتم استخدامه للوصول إلى قيمة x مما يجعلها قابلة للتحرير. يغير القيمة المخصصة لـ z بـ 90 مما يغير القيمة في x بشكل غير مباشر.
في البداية، قيمة المتغير الثابت x هي 70 والتي يتم تعديلها باستخدام عامل التشغيل const_cast، مما يجعلها 90.
3:dynamic_cast
مع التسلسل الهرمي للميراث، والذي يشار إليه أيضًا باسم النوع الآمن. عملية الصب هي عملية تحويل مرجع أو مؤشر إلى فئة مشتقة من مرجع أو مؤشر فئة أساسية.
بناء الجملة
Dynamic_cast ( تعبير ) مثال
في هذا المثال، يتم استخدام عامل التشغيلdynamic_cast للتحقق من نوع الفئة متعددة الأشكال، وهو يسمح بالوصول إلى كل من أعضاء الفئة الأساسية والمشتقة.
#تشمل <استثناء>
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل تيبيس
{
عام :
يطفو base_g = 9.81 ;
افتراضي فارغ غبي ( )
{
} ;
} ;
فصل مشتق : عام تيبيس
{
عام :
كثافة العمليات local_g = 9.78 ;
} ;
كثافة العمليات رئيسي ( )
{
تيبيس * قاعدة = جديد مشتق ;
مشتق * مشتق ;
مشتق = Dynamic_cast ( قاعدة ) ;
cout < base_g << endl ;
cout < local_g << endl ;
com.getchar ( ) ;
يعود 0 ;
}
يتم تعريف فئتين على أنها فئات أساسية ومشتقة. يتم إنشاء قاعدة مؤشر من النوع TBase* وتعيينها لكائن مخصص ديناميكيًا من النوع TDerived. يمكن تعيين كائن فئة مشتقة لمؤشر فئة أساسية في هذه الحالة من تعدد الأشكال. يتحقق Dynamic_cast مما إذا كان المؤشر يصل إلى كائن صالح من TDerived، إذا حصل الإرسال على نتيجة ناجحة، فستحصل الفئة المشتقة على نتيجة صالحة وإلا فإنها سترجع قيمة فارغة.
4: إعادة تفسير_cast
يقوم reinterpret_cast بتحويل مؤشر نوع بيانات واحد إلى مؤشر نوع بيانات مختلف. ولا يتحقق مما إذا كانت أنواع بيانات المؤشرات متماثلة أم لا. يجب استخدام مشغل الصب هذا والتعامل معه بعناية.
مثال
في هذا الرسم التوضيحي، تتم إعادة تفسير مؤشر نوع بيانات واحد إلى مؤشر نوع بيانات آخر باستخدام reinterpret_cast:
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
كثافة العمليات رئيسي ( )
{
كثافة العمليات * س = جديد كثافة العمليات ( 70 ) ;
شار * الفصل = reinterpret_cast ( س ) ;
cout << * س << endl ;
cout << * الفصل << endl ;
cout << س << endl ;
cout << الفصل << endl ;
يعود 0 ;
}
في البداية، يتم تعيين عدد صحيح بالقيمة 70. يشير المؤشر q إلى هذا العدد الصحيح المخصص ديناميكيًا. يتم استخدام reinterpret_cast لإعادة تفسير المؤشر q كمؤشر حرف ch، مما يعني أن الذاكرة المخصصة أصلاً لـ q يتم التعامل معها الآن كما لو كانت حرفًا. باستخدام الأمر cout، فإنه يطبع القيمة المخصصة لـ q وch. نظرًا لأنه يتم التعامل مع ch كمؤشر للأحرف، فسوف يُرجع قيمة للأحرف.
يقوم بطباعة القيمة المشار إليها بـ ch باستخدام *ch. ومع ذلك، نظرًا لأنه يتم التعامل مع ch كمؤشر للأحرف، فإن هذا السطر سوف يفسر الذاكرة كحرف. يقوم بطباعة عنوان الذاكرة المخزن في المؤشر ch باستخدام ch. هذا هو نفس عنوان الذاكرة مثل q لأنه مجرد إعادة تفسير لنفس الذاكرة.
في البداية، يخزن العدد الصحيح 70. لاحقًا، يتم التلاعب بهذا بين المؤشر q والمؤشر ch. المخرجات 2 و4 هي نفسها لأنه تتم إعادة تفسير القيمة الثانية باستخدام reinterpret_cast.
ملحوظة : يُقترح عدم استخدام مشغل الزهر هذا إلا إذا كانت هناك حاجة إليه بشدة لأنه يجعل الكائن منتجًا غير محمول
خاتمة
تُعرف عملية تغيير نوع البيانات من متغير إلى آخر باسم تحويل النوع أو صب النوع في لغة C++. ويتم ذلك لإجراء عمليات حسابية على متغيرات أنواع البيانات المختلفة، من خلال جعل أنواع البيانات الخاصة بها متوافقة مع بعضها البعض. يؤدي تحويل النوع إلى تحسين الكود. هناك تحويلات نوع ضمنية وصريحة في C++. يتم إجراء تحويل النوع الضمني بواسطة المترجم نفسه باستخدام مجموعة محددة مسبقًا من القواعد، بينما يتم إجراء تحويل النوع الصريح بواسطة المبرمج باستخدام عوامل التعيين ومشغلي الإرسال.