C++/המרות: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Ybungalobill (שיחה | תרומות)
Ybungalobill (שיחה | תרומות)
שורה 43:
אופרטורים אלה נראים בדומה לתבניות (לימדו בהמשך), את הטיפוס אליו אנו ממירים רושמים בין סוגריים משולשים ואת הערך בסוגריים עגולים: {{קוד בשורה|<nowiki>_cast<B>(x)</nowiki>}}. שימוש רב באופרטורים אלה מגעיל את הקוד. ניתן לראות בזה את כוונתו של ממציא השפה להפחית את השימוש בהמרות, ובכן נהוג להמנע מהמרות מיותרות.
 
* '''const_cast''' - משמש להמרה של קבוע ללא קבוע, כלומר "הורדת" ה-const. המרה זו מסוכנת כי אם האובייקט הכן נוצר כקבוע, המשך פעולת התוכנית לא מוגדר (לפעמים שגיאה). להמרה זו יש משמעות כאשר המתכנת בטוח שהאובייקט הוא לא באמת קבוע.
:המרה זו יש לעשות במקרים נדירים למדי, לרוב ניתן להשתמש במקומה ב-mutable או להיוודא שלא הגזמנו בשימוש ב-const בפרמטרי הפונקציות.
* '''reinterpret_cast'''
<source lang="cpp">
* '''static_cast'''
int a = 0x2A;
* '''dynamic_cast'''
const int b = 42;
 
const int *cp1 = &a;
int *p1 = const_cast<int*>(cp1);
++*p1; // בסדר
 
const int *cp2 = &b;
int *p2 = const_cast<int*>(cp2);
++*p2; // רעעע
</source>
 
* '''reinterpret_cast''' - אומר למהדר להתעלם מהטיפוסים, בזה משמש להמרה בין משפחות שונות של טיפוסים, למשל מצביעים לשלמים. לרוב אופרטור זה יצור אובייקט בעל אותן הסיביות כמו האובייקט המקורי. כל האחריות על נכונות הערך החדש היא על המתכנת.
<source lang="cpp">
struct A { /* ... */ };
struct B { /* ... */ };
 
A *x = f();
B *y = '''reinterpret_cast'''<B*>(x);
</source>
 
* '''static_cast''' - משמש להמרה בין טיפוסים דומים, מאותה משפחה. המהדר בודק את נכונות ההמרה. המרה מסוג זה עלולה לגרום לאיבוד מידע (למשל בהמרה של נקודה צפה לשלם), אך לעומת ה-reinterpret_cast היא בעלת הגיון אותו מבין המהדר.
<source lang="cpp">
int y = static_cast<int>(sin(x)*128.0+128.0);
</source>
 
* '''dynamic_cast''' - משמש להמרה בזמן ריצה.
 
== המרות טיפוסים של המתכנת ==