01
של 09
החל משיעורי C ++
חפצים הם ההבדל הגדול ביותר בין C ++ ו- C. אחד השמות המוקדמים ביותר ל- C ++ היה C עם כיתות.
חוגים ואובייקטים
כיתה היא הגדרה של אובייקט. זה סוג בדיוק כמו int. כיתה דומה א מבנה עם הבדל אחד בלבד: כל חברי ה- struct הם ציבוריים כברירת מחדל. כל חברי הכיתות הם פרטיים.
זכרו - כיתה היא סוג, והאובייקט של הכיתה הזו הוא רק א משתנה.
לפני שנוכל להשתמש באובייקט, עליו ליצור. ההגדרה הפשוטה ביותר לשיעור היא:
שם כיתה {
// חברים
}
דוגמה זו למטה מדגמנת ספר פשוט. השימוש ב- OOP מאפשר לך להמעיר את הבעיה ולחשוב עליה ולא רק על משתנים שרירותיים.
// דוגמה אחת
# כלול
# כלול
ספר כיתה
{
int PageCount;
int CurrentPage;
ציבורי:
ספר (int Numpages); // בנאי
~ ספר () {}; // הרס
SetPage בטל (int PageNumber);
int GetCurrentPage (בטל);
};
ספר:: ספר (int NumPages) {
PageCount = NumPages;
}
ספר בטל:: SetPage (int PageNumber) {
CurrentPage = PageNumber;
}
int ספר:: GetCurrentPage (בטל) {
להחזיר את CurrentPage;
}
int main () {
ספר ABook (128);
ספר. SetPage (56);
std:: cout << "עמוד נוכחי" << הסתכל. GetCurrentPage () << std:: endl;
להחזיר 0;
}
כל הקוד מ- ספר כיתה עד ל int ספר:: GetCurrentPage (בטל) { הפונקציה היא חלק מהכיתה. ה עיקרי () הפונקציה שם כדי להפוך את זה ליישום הניתן להפעלה.
02
של 09
הבנת כיתת הספרים
בתוך ה עיקרי () פונקציה משתנה מסוג ספר נוצר עם הערך 128. ברגע שהביצוע מגיע לנקודה זו, נבנה האובייקט ABook. בשורה הבאה השיטה ספר. SetPage () נקרא והערך 56 המוקצה למשתנה האובייקט ספר. העמוד הנוכחי. לאחר מכן קוט מוציא ערך זה על ידי חיוג ל- ספר. GetCurrentPage () שיטה.
כאשר ההוצאה להורג מגיעה ל להחזיר 0; האפליקציה אינה זקוקה עוד לאובייקט ABook. המהדר מפיק קריאה להרס.
שיעורי הכרזה
הכל בין ספר כיתה וה } היא הצהרת הכיתה. בכיתה זו יש שני חברים פרטיים, שניהם מהסוג int. אלה הם פרטיים מכיוון שברירת המחדל לגישה לחברי הכיתה היא פרטית.
ה ציבורי: ההנחיה אומרת מהדר הגישה מכאן והלאה היא ציבורית. בלי זה, זה עדיין יהיה פרטי וימנע משלוש השורות בפונקציה העיקרית () לגשת לחברי Abook. נסה להגיב על ציבורי: ליישר מחדש ולדרג מחדש כדי לראות את שגיאות ההרכבה שבעקבותיהן.
שורה זו למטה מכריזה על בנאי. זוהי הפונקציה הנקראת כאשר האובייקט נוצר לראשונה.
ספר (int Numpages); // בנאי
זה נקרא מהקו
ספר ABook (128);
זה יוצר אובייקט שנקרא ABook מהסוג Book וקורא לפונקציה Book () עם ה- פרמטר 128.
03
של 09
עוד על כיתת הספרים
ב- C ++, לבנאי תמיד יש שם זהה לזה. הקבלן נקרא כאשר האובייקט נוצר ובמקום זה עליך להציב את הקוד שלך כדי לאתחל את האובייקט.
בספר השורה הבאה אחרי הבנאי ההורס. לזה יש שם זהה לזה של הקבלן אך לפניו ~ (tilde). במהלך השמדת חפץ נקרא ההרס להשמיד את האובייקט ולהבטיח שמשוחררים משאבים כמו זיכרון וידית קבצים המשמשים את האובייקט.
זכור—כיתה xyz יש פונקציית קונסטרוקטור xyz () ופונקציית הרס ~ xyz (). גם אם לא תצהיר, המהדר יוסיף אותם בשקט.
ההרס תמיד נקרא כאשר החפץ מסתיים. בדוגמה זו, האובייקט נהרס במרומז כאשר הוא יוצא מהיקפו. כדי לראות זאת, שנה את הצהרת ההרס למטרה זו:
~ ספר () {std:: cout << "הרס קרא";}; // הרס
זוהי פונקציה מוטבעת עם קוד בהצהרה. דרך נוספת להטמעה היא הוספת המילה inline
inline ~ ספר (); // הרס
ולהוסיף את ההרס כ פונקציה כזו.
inline Book:: ~ ספר (בטל) {
std:: cout << "הרס קרא";
}
פונקציות מוטבעות הן רמזים למהדר כדי ליצור קוד יעיל יותר. יש להשתמש בהם רק לפונקציות קטנות, אך אם משתמשים במקומות מתאימים - כמו בפנים לולאות—יכול לעשות הבדל ניכר בביצועים.
04
של 09
כתיבת שיטות כיתות
התרגול הטוב ביותר עבור אובייקטים זה להפוך את כל הנתונים לפרטיים ולגשת אליהם באמצעות פונקציות המכונות פונקציות accessor. SetPage () ו GetCurrentPage () הן שתי הפונקציות המשמשות לגישה למשתנה האובייקט העמוד הנוכחי.
לשנות את ה מעמד הצהרה לבנות מחדש. זה עדיין צריך להרכיב ולהפעל כראוי. עכשיו שני המשתנים דף ו העמוד הנוכחי נגישים לציבור. הוסף שורה זו אחרי ה- Book ABook (128), והיא תרכיב.
ספר. PageCount = 9;
אם תשנה בחזרה מבנה ל מעמד ולחשב מחדש, השורה החדשה הזו כבר לא תתכנס כמו דף כעת שוב פרטית.
הסימן::
לאחר הצהרת מחלקת הספרים, ישנן ארבע ההגדרות של פונקציות החברים. כל אחד מהם מוגדר עם קידומת הספר:: כדי לזהות אותו כשייך לאותה כיתה.:: נקרא מזהה ההיקף. זה מזהה את הפונקציה כחלק מהכיתה. זה ברור בהצהרת הכיתה אך לא מחוצה לה.
אם הצהרת על תפקיד חבר בכיתה, עליך לספק את גוף הפונקציה בדרך זו. אם רצית ששיעור הספר ישמש קבצים אחרים, ייתכן שתעביר את הצהרת הספר לחלק נפרד כותרת קובץ, אולי נקרא book.h. לאחר מכן כל קובץ אחר יכול לכלול אותו עם
# כלול "book.h"
05
של 09
ירושה ופולימורפיזם
דוגמה זו תמחיש ירושה. זהו יישום דו קלאסי עם כיתה אחת הנגזרת מסוג אחר.
# כלול
# כלול
נקודה בכיתה
{
int x, y;
ציבורי:
נקודה (int atx, int aty); // בנאי
מוטבע וירטואלי ~ נקודה (); // הרס
חלל וירטואלי Draw ();
};
מעגל בכיתה: נקודה ציבורית {
רדיוס int;
ציבורי:
מעגל (int atx, int aty, int the ראדיוס);
inline וירטואלי מעגל ();
חלל וירטואלי Draw ();
};
נקודה:: נקודה (int atx, int aty) {
x = אטקס;
y = aty;
}
נקודה inline:: ~ נקודה (בטלה) {
std:: cout << "הרס נקודה נקרא";
}
נקודה בטלה:: צייר (בטל) {
std:: cout << "נקודה:: צייר נקודה ב" << x << "" << y << std:: endl;
}
מעגל:: מעגל (int atx, int aty, int the radi): נקודה (atx, aty) {
רדיוס = הרדיוס;
}
מעגל מוטבע:: ~ מעגל () {
std:: cout << "משחתת מעגל בשם" << std:: endl;
}
מעגל חלל:: צייר (בטל) {
נקודה:: שרטוט ();
std:: cout << "מעגל:: צייר נקודה" << "רדיוס" << רדיוס << std:: endl;
}
int main () {
מעגל מעגל (10,10,5);
מעגל. לצייר() ;
להחזיר 0;
}
הדוגמה כוללת שתי כיתות, נקודה ומעגל, המדגמנות נקודה ומעגל. לנקודה יש קואורדינטות x ו- y. כיתת המעגל נגזרת משיעור פוינט ומוסיפה רדיוס. שני השיעורים כוללים א לצייר() פונקציית חבר. כדי לקצר את הדוגמא הזו הפלט הוא רק טקסט.
06
של 09
ירושה
הכיתה מעגל נגזר מ- נקודה מעמד. זה נעשה בשורה זו:
מעגל כיתה: נקודה {
מכיוון שהוא נגזר ממעמד בסיס (נקודה), מעגל יורש את כל חברי הכיתה.
נקודה (int atx, int aty); // בנאי
מוטבע וירטואלי ~ נקודה (); // הרס
חלל וירטואלי Draw ();
מעגל (int atx, int aty, int the ראדיוס);
inline וירטואלי מעגל ();
חלל וירטואלי Draw ();
חשוב על כיתת המעגל ככיתת פוינט עם חבר נוסף (רדיוס). זה יורש את הפונקציות של מחלקת הבסיס ומשתנים פרטיים איקס ו y.
זה לא יכול להקצות או להשתמש באלה אלא למרומז מכיוון שהם פרטיים, ולכן עליו לעשות זאת דרך רשימת האתחול של בנאי Circle. זה משהו שעליכם לקבל כפי שהוא לעת עתה. אני אחזור לרשימות האתחול במדריך עתידי.
במבנה המעגלים, לפני הרדיוס מוקצה ל - רדיוס, החלק הנקודה של המעגל נבנה באמצעות קריאה לבנאי של פוינט ברשימת האתחול. רשימה זו היא הכל בין: ל {להלן.
מעגל:: מעגל (int atx, int aty, int the radi): נקודה (atx, aty)
אגב, ניתן להשתמש בהתחלת סוג בנאי לכל הסוגים המובנים.
int a1 (10);
int a2 = 10;
שניהם עושים את אותו הדבר.
07
של 09
מהי פולימורפיזם?
פולימורפיזם הוא מונח גנרי שמשמעותו "צורות רבות". ב- C ++ הצורה הפשוטה ביותר של פולימורפיזם היא עומס יתר של פונקציות. לדוגמה, מספר פונקציות שנקראו SortArray (סוג arraytype) איפה יכול להיות מיון מערך של אינץ או מכפיל.
אבל אנו מעוניינים רק בצורת OOP של פולימורפיזם. זה נעשה על ידי ביצוע פונקציה (למשל Draw ()) וירטואלי במחלקת הבסיס פוינט ואז גוברים עליה בסעיף כיתה נגזרת מעגל.
אם כי הפונקציה לצייר() הוא וירטואלי בכיתה הנגזרת מעגל, זה ממש לא נחוץ - זו רק תזכורת לי שזה וירטואלי. אם הפונקציה בכיתה נגזרת תואמת פונקציה וירטואלית במחלקת הבסיס על סוגי שמות ופרמטרים, היא אוטומטית וירטואלית.
רישום נקודה ושרטוט מעגל הם שתי פעולות שונות מאוד עם רק הקואורדינטות של הנקודה והמעגל משותפות, ולכן חשוב שהתקין יהיה נכון לצייר() נקרא. כיצד המהדר מצליח לייצר קוד המקבל את הפונקציה הווירטואלית הנכונה יכוסה במדריך עתידי.
08
של 09
בוני C ++
בנאים
קונסטרוקטור הוא פונקציה המאתחלת את חברי האובייקט. בנאי יודע רק לבנות חפץ ממעמד משלו.
בנאים אינם עוברים בירושה אוטומטית בין המחלקות הבסיסיות והנגזרות. אם לא תספק אחת מהכיתה הנגזרת, יינתן ברירת מחדל אך יתכן שזה לא יעשה מה שאתה רוצה.
אם לא בנאי מסופק אז המהדק נוצר על ידי המהדר ללא פרמטרים. תמיד חייב להיות בנאי, גם אם הוא ברירת המחדל וריק. אם אתה מספק קונסטרוקטור עם פרמטרים אז ברירת מחדל לא תיווצר.
כמה נקודות על בנאים:
- בנאים הם פשוט פונקציות עם אותו שם כמו הכיתה.
- הקבלנים נועדו לאתחל את חברי הכיתה כאשר נוצר מופע מאותה הכיתה.
- בנאים אינם נקראים ישירות (אלא דרך רשימות אתחול)
- בנאים אינם וירטואליים לעולם.
- ניתן להגדיר בנאים מרובים לאותה כיתה. עליהם להיות פרמטרים שונים כדי להבדיל ביניהם.
יש עוד הרבה דברים ללמוד על בנאים, למשל, קבלני ברירת מחדל, קבלני הקצאה והעתקה. אלה יידונו בשיעור הבא.
09
של 09
לסדר את הרס C ++
הרס הוא פונקציה של חבר כיתה עם אותו שם של הבנאי (והכיתה) אך עם ~ (tilde) מקדימה.
~ מעגל ();
כאשר חפץ יוצא מהיקפו או לעיתים נדירות יותר נהרס באופן מפורש, נקרא ההרס שלו. למשל, אם יש לאובייקט משתנים דינמיים כמו מצביעים, אזי יש לשחרר את ההרס ולהרוס אותו.
שלא כמו בנאים, הרסנים יכולים וצריכים להפוך אותם לווירטואליים אם יש לכם שיעורים נגזרים. בתוך ה נקודה ו מעגל דוגמא לשיעורים, אין צורך בהרס המשנה מכיוון שאין עבודות ניקיון שיש לבצע (זה פשוט משמש כדוגמה). האם היו משתני חבר דינמיים (כמו מצביעים) אז אלה היו צריכים לשחרר כדי למנוע דליפות זיכרון.
כמו כן, כאשר הכיתה הנגזרת מוסיפה חברים הדורשים הסדר, יש צורך בהרס משקל וירטואלי. כאשר הווירטואלי נקרא הראשון משמיד המעמדות הנגזר ביותר, ואז נקרא השמיד המיידי של אבותיו, וכן הלאה עד למעמד הבסיס.
בדוגמה שלנו,
~ מעגל ();
לאחר מכן
~ נקודה ();
משחתת שיעורי הבסיס נקראת אחרונה.
זה מסיים את השיעור הזה. בשיעור הבא, למד על בוני ברירת מחדל, קבלני בנייה והעתקה.