שאלות לגבי מחלקות:

שאלות לגבי מחלקות:

1) לגבי פונקציה חברה- האם פונקציה כזאת יכולה לבצע כל פעולה על תכונות המוגדרות כ-private של המחלקה בו היא חברה,כולל למשל לשנות את אתחול התכונות הללו לאחר שאותחלו כבר ע"י הבנאי?
2) לגבי שיטות סטטיות ותכונות סטטיות - מה שונה אופי השימוש בהן לעומת כאלה שאינן סטטיות?
3) לגבי מחלקה שמוכלת בתוך מחלקה אחרת - נניח שהמחלקה המוכלת כוללת משתנה יחיד int x, והגדרתי בתוכה בנאי שמאתחל אותה. מדוע את אותו אתחול עליי להגדיר גם בתוך המחלקה המכילה? מדוע לא ניתן להסתפק באתחול שנעשה כבר במחלקה המוכלת?
4) לגבי תכונה שמוקצית דינאמית במחלקה - מדוע ביישום של אופרטור השמה חייבים לשחרר תכונה כזאת?
5) האם default constructor יכול גם להיות ריק?
6) נניח שיש לי מחלקה B שיורשת את מחלקה A, ונניח שאני רוצה ליישם אופרטור השמה במחלקה B. האם במקרה זה דרוש ליישם אופרטור השמה גם במחלקה A?

תודה :)
 

BravoMan

Active member
ממש שאלות של מבחן יש לך פה...

טוב, נו, הפורום חלש בזמן האחרון, אז לא אשלח אותך לקרוא עוד חומר

&nbsp
1) כן.
אין דבר כזה "שינוי אתחול", כל הצבה באיבר "תכונה" מחלקה היא פשוט הצבה, כמו במשתנה רגיל.
&nbsp
2) שהן אינן שייכות לאובייקט מסוים אלא למחלקה.
"תכונה" (איבר סטטי) קיימת פעם אחת במחלקה, ויכולה להחזיק ערך אחד.
לא משנה כמה אובייקטים מהמחלקה תיצור, הם כולם יראו את אותו הערך.
&nbsp
פונקציה (מתודה) סטטית היא מתודה שניתן לקרוא לה ללא אובייקט, ישירות על המחלקה.
מסיבה זו היא לא יכולה לגעת בתכונות (משתנים) שאינם סטטיים או להפעיל מתודות אחרות שאינן סטטיות.
למעט כמובן בנאי - ניתן לבנות מופע של מחלקה בתוך מתודה סטטית שלה, משתמשים בזה למשהו שנקרא "singleton".
&nbsp
אם תרצה, ארחיב בנושא.
&nbsp
3) השאלה לא ברורה. תן דוגמת קוד.
&nbsp
4) מי אמר שחייבים לשחרר?
אופרטור השמה מחליף את התוכן של האובייקט.
כיצד הוא מתמודד עם תוכן מוקצה דינמית, תלוי בצרכים שלך.
&nbsp
למשל, אם כבר מוקצה זיכרון מספיק לתכונה, אתה יכול רק להחליף את התוכן.
מצד שני, אם התכונה היא מערך, ואתה צריך אחד גדול יותר, תשחרר את הישן ותקצה חדש בגודל הדרוש.
&nbsp
ייתכן אפילו, שתרצה להעביר רק את המצביע, ואז עליך לשחרר את המצביע הקודם שאתה עומד לאבד.
&nbsp
5) כן. למעשה, אם לא תגדיר במפורש בנאי, הקומפיילר יצור אחד ריק עבורך.
&nbsp
6) לא.
 
דוגמא של קוד לשאלה 3 (שלא הבנת):

קוד:
class A
{
int x;
public:
A(int x = 0) { cout << "In A::A x=" << x << endl; }
void foo() const { cout << "In A::foo\n"; }
};

class B : public A
{
public:
B() { cout << "In B::B(ver 1)\n"; }
B(int x) : A(x) { cout << "In B::B(ver 2)\n"; }

void foo()
{
A::foo();
cout << "In B::foo\n";
}
};
מחלקה B יורשת את מחלקה A.
השאלה היא למה גם מחלקה B צריכה להכיל בתוכה אתחול של A
ׁ(השורה
B(int x) : A(x)
)

?
 

computer helper

New member
אחרת איזה ארגומנט יהיה לך בבנאי?

תמיד יש אתחול של מחלקת ההורה, בין אם כתבת ובין אם לא, רק כשיש לך בנאי ברירת מחדל הקומפיילר מוסיף לך אותו "מאחורי הקלעים"
 

BravoMan

Active member
שים לב שמה שכתבת אינו "מחלקה מוכלת"

מחלקת אב אינה מחלקה מוכלת, ואין לבלבל בין השניים.
&nbsp
computer helper כבר נתן לך את התשובה.
&nbsp
ספציפית בדוגמת קוד שהבאת, במחלקה היורשת B אין שום איבר שנקרא x ולכן גם אין שום אתחול שלו.
x הוא איבר פרטי של A, ולכן ל-B אין גישה אליו, למרות ש-B יורשת מ-A.
&nbsp
 
למעלה