Professional Documents
Culture Documents
סיכום הרצאות CPP
סיכום הרצאות CPP
) sizeof(static arrayנותן את גודל כל המערך בניגוד למערך דינאמי ,שם יתקבל גודל המצביע
Explicitלפני הבנאי
למניעת implicit casting
אופרטור ההשמה
לא לשכוח לבדוק שהכתובות לא זהות
לא לשכוח לשחרר את התוכן הקיים אם בוצעה הקצאה דינאמית
האופרטור [ ]:
תקף גם למתודות המחזירות אובייקט שברצוננו לשנות
נעמיס פעמיים ,פעם רגיל ופעם כקונסט
לדוגמא במחלקה String
;)char& operator[](int index
;const char& operator[](int index) const
Consts & statics
אובייקט :const
אסור לשנות באופן ישיר (לדוגמא השמה) .1
אסור להעביר אותו כפרמטר By Referenceאלא אך ורק כconst - .2
אובייקט רגיל:
חשוב ללקוח לדעת באילו פונקציות האובייקט שלו מוגן
מתודה :const
אסור לה לשנות שום שדה dataשל האובייקט המפעיל וגם לא לאפשר לו בעקיפין
כשמגדירים אובייקט קונסטי כגון (עמ' 76שורה )8וכגון (עמ' 78שורה )38אסור לאובייקט
להישתנות לעולם וזה כולל:
הקומפיילר לא יתן לו לעבור כפרמטר לפונקציה שלא מקבלת אותו כקונסט .1
הקומפיילר לא יתן לו להפעיל על עצמו מתודה שלא הוגדרה כקונסט .2
הערה :אסור לעשות castingמקונסט ללא קונסט!
משתנים סטטיים:
משתנים סטטיים וגלובליים חיים כל התוכנית
משתנה סטטי מוכר רק בפונקציה שהוא כתוב בה
שדה סטטי יש אחד בכל classולא אחד בכל אובייקט
חי תמיד ,גם אם לא יצרנו בכלל אובייקטים
למשתנה סטטי יש ערך דיפולטי 0 -
גישה לשדה סטטיMyClass::MyField :
מתודה סטטית רשאית לגשת אך ורק לשדות סטטיים
מתודה רגילה יכולה לגשת גם לשדות רגילים וגם לשדות סטטיים
הערות:
מותר להגדיר classבתוך .classשם הפנימי יהיה OutterClass::InnerClass .1
– Enumשילוב של סטטי וקונסט .2
הורשה ופולימורפיזם
הערות כלליות:
הרשאת friendלא עוברת בהורשה. .1
לא יכול להתבצע זיהוי הקלאס בזמן ריצה אם אין טבלה וירטואלית! .2
שיטה וירטואלית – שיטה שה binding -אליה הוא דינאמי (בזמן ריצה)
מחלקה פולימורפית – מחלקה שהשיטות בה וירטואליות
חשוב -כל פעם שנגדיר מחלקה כזאת נבנה עבורה מפרק וירטואלי
הסיבה – יתכן ובבנים שלה יש הקצאות דינאמיות שצריך לשחרר במפרק
אם יש לנו מצביע לאובייקט אב והוא מצביע על הבן ולאב אין מפרק וירטואלי ,לא יופעל המפרק של
הבן.
השיטה תישאר וירטואלית גם במחלקות היורשות ,אך לא חובה לציין זאת .1
את המילה "וירטואל" נכתוב רק בקובץ H
בהפעלת פונקציה וירטואלית בבנאי של מחלקת בסיס תופעל הפונקציה של הבסיס אפילו .2
אם האובייקט הנוצר הוא יורש (כי עדיין לא הגענו לבנאי שלו!)
בהפעלת פונקציה וירטואלית במפרק של מחלקת הבסיס תופעל הפונקציה של הבסיס כי .3
כבר עברנו במפרק של היורש!
מוסיפות לאובייקט פוינטר לטבלה וירטואלית (נפח האובייקט גדל) .4
ללא טבלה וירטואלית יהיה קישור סטטי בלבד .5
מחלקות ושיטות אבסטרקטיות
הורשת מעויין
במקרה המעויין חובת הנכד להפעיל את הבנאי של הסבא ששני האבות יורשים אותו וירטואלית.
במקרה זה האבות יקראו בשורת האיתחול שלהם לסבא ,קריאה זו לא תתבצע כי הסבא כבר נולד
ואחרי זה הבן יקרא לשני האבות.
מה יקרה אם הנכד לא יקרא לבנאי של הסבא?
יופעל הבנאי הדיפולטי של הסבא
Dynamic-cast
חוקים:
ביצירת אובייקט ממחלקה טמפלט יש לשלוח פרמטר לטמפלט לדוגמה >Array<int .1
בקריאה לפונקציה טמפלט אין לציין את סוג הפרמטר ,הפונקציה מזהה אותו. .2
במימוש member functionמחוץ למחלקה טמפלט צריך לאזכר מחדש את השימוש .3
בטמפלט
כל המימושים בקובץ H .4
הורשה :המחלקה היורשת יכולה להישאר טמפלט אם נציין בראשה .5
>template<class T
>class derived: public base<T
או לא להיות טמפלט ,אם נציין למשל
>Class derived: public base<int
Tידוע בזמן קומפילציה .6
STL
מימוש איטרטור
נממש כ inner classבמחלקה המייצגת את מבנה הנתונים
יתן הרשאת friendלמחלקה של מבנה הנתונים אליו "שייך"
מחלקה שנעמיס בה:
* (ידמה גישה לתוכן מצביע) .1
(++ידמה קידום המצביע לתא הבא במבנה הנתונים תמיד משמאל) .2
=! (כדי להשוות בין איטרטורים) .3
== .4
castingל *T .5
שימוש באיטרטור
דוגמה ליצירת איטרטור על וקטור .1
;vector<T> myVector
;)(vector<T>::iterator iter = myVector.begin
וקטור
בניגוד למערך ,ניתן להגדיר וקטור של אובייקטים גם אם אין להם בנאי דיפולט .1
Object function
מכיוון שלא ניתן לשלוח פונקציה טמפלטית כ"פעולה" שאנו רוצים לבצע על מבנה הנתונים
נעטוף אותה באובייקט ,עליו נעמיס רק אופרטור ()
חשוב:
כשנשלח מצביע לפונקציה נכתוב בלי סוגריים
כשנשלח אובייקט נכתוב עם סוגריים!
דוגמה למימוש:
struct Print
{
>template<class T
void operator()(const T& printable) const
{
;cout << printable << endl
}
;}
קבצים
flags
– ios::appהוספה לסוף הקובץ ,נתונים קיימים לא ידרסו .1
– ios::nocreateדרישה שהקובץ יהיה קיים והפקודה לא תיצור אותו .2
– ios::noreplaceדרישה שהקובץ לא יהיה קיים והפקודה תיצור אותו .3
– ios::trunkפתיחת קובץ ריק ,קובץ בשם זהה ימחק .4
( ios::binaryהדיפולט הוא קובץ טקסט) .5
קובץ טקסט
אובייקט יכתב לקובץ שדה שדה ,ניתן בעזרת האופרטור >> .1
ניתן לקרוא מהקובץ בעזרת האופרטור <<get, getline , .2
כדי לבדוק אם הגענו לסוף נשתמש ב )(eof .3
קובץ בינארי
ניתן לכתוב את האובייקט כיחידה אחת לקובץ אם אין מצביעים .1
נכתוב שיטת saveבמחלקות של אובייקטים שנרצה לשמור ונכתוב להן בנאי שמקבל קובץ .2
פתוח לקריאה (אם אנו קוראים מקובץ)
נעשה שימוש בפונקציות read, write .3
בכתיבה נעשה המרה ל *const char .4
בקריאה נעשה המרה ל *char .5