שאלה ב - C++

Panther

New member
שאלה ב - C++

שלום אני לומד עכשיו Visual C++ מהספר של Sams שנקרא: Teach Yourself Visual C++ 6 in 21 days אני עדיין מתחיל, ואני בפרק שלומדים C++ ועדיין לא נכנסים לויז´ואל. בספר יש הגדרת קלאס, שכתובה ככה: (מומלץ לשנות את הדף הזה למסמך Left-to-right document ----------------------------------- class Mammal { public: //constructors Mammal():itsAge(35), itsWeight(180){} ~Mammal(){} int GetAge()const { return itsAge; } ... }; ------------------------------------ itsAge and itsWeight הם משתנים שמוגדרים בהמשך, והם פרטיים של הקלאס הזה. חשוב לציין שהם לא פונקציות. שאלתי היא, למה בקונסטרקטור, כדי לאתחל את המשתנים itsAge and itsWeight נכתב כפי שנכתב, כאילו משתנים אלו הם פונקציות, ולא נכתב ככה: Mammal() {itsAge = 25; itsWeight = 180; } ובשורה של הגדרת הפונקציה GetAge למה יש את המילה Const? מה זה נותן? תודה רבה, ומקווה שתוכלו להבין למה כוונתי. אם לא ויש לכם את הספר הזה, פתחו בעמוד 570 והסתכלו על התוכנית שכתובה שם. בברכה, אורי אלון
 

stac

New member
i think i know what u mean

just our class is not completed the vars are Constant they can be initialze only one time in life! see the file *
 

Panther

New member
לא

המשתנים הם לא קונסטנט. הם מוגדרים רגיל כ protected: int itsAge; int itsWeight; אבל נגיד שהם היו קונס, למה בפונקציה שמחזירה אותם, צריכה להיות המילה קונסט? ולמה בקונסטרקטור זה נראה כאילו הם פונקציה?
 

stac

New member
הם לא פונקציה והם גם לא נראים

כמו פונקציה! למשל אתה מגדיר מחלקה בשם משחק ורוצה לקבוע בזמן הגדרה כמה משתתפים היו במשחק,
 

eric_adler

New member
אז ככה ->

כאשר אתה מאתחל משתנים ב c++ בדר"כ אתה מאתחל אותם בעזרת סוגריים ולא בעזרת שווה. זה נובע מטעמי חיסכון ויעילות.בגלל זה הם ניראים כמו פונקציה! עכשיו ב קונסטרקטור הם מאותחלים לא בתוך הסוגריים המסולסלים של הפונקציה אלא מיד אחרי הכותרת של הפונקציה גם כן מטעמי חיסכון ויעילות! בפונקציות get אנו לא רוצים לתת אפשרות לשנות את המשתנים הפרטיים כי אז הם לא יהיו פרטיים!!! לכן מופיעה המילה const שמבטיחה לנו שלא יעשו כל שינויים במשתנים שלנו. ואז הפונקציה בסה"כ (ככל הנראה..) מחזירה את הערך של המשתנה אבל לא את המשתנה עצמו! מקווה שעזרתי. אריק.
 

WarLord

New member
הרחבה ותיקון

לגבי ה CONST: משתנים פרטיים הם תמיד פרטיים. הכוונה שפונקציה שאינה שייכת ל CLASS אינה יכולה לשנותם בכל מקרה. המשמעות של ה CONST הוא שהפונקציה מתחייבת שלא לשנות את המשתנים של ה CLASS. למה זה טוב ? בדוגמה שלך כל מה שרוצים זה שיחזור הגיל. אין סיבה שהגיל ישונה ע"י הפונקציה ולכן ה CONST מופיע בהגדרת הפונקציה. לגבי הנושא של השווה: מדובר על שדה האיתחול של הבנאיוזה הsyntax שבו משתמשים. במידה והגדרת במחלקה A בנאי שמקבל פרמטרים הבנאי הdefaultי נעלם. במידה ותגדיר מחלקה נוספת B שמכילה אובייקט ממחלקה A לא מוכל ליצור את B בגלל שאי אפשר ליצר A ללא פרמטרים. כתבתי על זה לפני כמה ימים פה בפורום בתור טיפים למבחן של eric_adler.
 

Panther

New member
עדיין לא הבנתי בקשר לConst

תודה רבה לכולם על העזרה. עדיין לא הבנתי משהו בקשר לשאלה עם הConst: למה אז בדוגמא מופיעה המילה Const בפונקציה שמחזירה את המשתנה, ולא המשתנים מלכתחילה מוגדרים כמשתנים קבועים Const? למה זה לא מופיע כך: const int itsAge; int getAge() {return itsAge;} אז מה שאתה מתכוון, זה שאם שמים את המילה קונסט בפונקציה, היא לא תשנה אף אחד מהמשתנים שבתוכה, אבל עדיין המשתנים עצמם לא יהיו קונסט, ופונקציות אחרות יוכלו לשנות אותם? תודה!
 

WarLord

New member
האופציה השניה היא הנכונה

אם המשתנה לא הוגדר כ CONST אז הוא לא CONST. כששמים את המילה CONST בפונקציה זה אומר שהפונקציה הספציפית הזו לא תשנה את המשתנים של האובייקט. פונקציות אחרות של ה CLASS יכולות לשנות אותם. תנסה לכתוב בתוך הפונקציה getAge() את המשפט itsAge=8; ותראה שאתה מקבל שגיאת קומפילציה ... אם יש לך שאלות נוספות אני אשמח לענות. נ.ב. יש סיבות שבגללן רצוי לשם את המילה CONST, אבל קודם תשתפשף טיפה בשפה ואז אוכל לענות לך יותר בקלות (זה פשוט הרבה להקליד )
 

stac

New member
למה יותר מומלץ להגדיר משתנים

שלא משנים את ערכם בקונסט? אני זוכר קראתי משהו על זה בספר של סטראופ אבל אין לי כח לדפדף 999 עמודים
 

WarLord

New member
הסיבה: ../images/Emo15.gif ../images/Emo15.gif ../images/Emo15.gif

אם משהו לא אמור לשנות את ערכו אז תגדיר אותו כ CONST ואז אם בטעות תפקשש הקומפיילר יעצור אותך. סיבה נוספת. הקומפיילר בודק גם התאמה של ה TYPE כאשר אתה משתמש במשתנה שמוגדר כקבוע (שזה יתרון על פני שימוש ב define# למשל ...)
 

eyall

New member
שורת איתחול

זאת לא פונקציה זאת שורת אתחול והיא חלק מהתחביר של C++. ישנם יתרונות לשימוש בשורת האיתחול למשל קריאות (אתה יודע, ברגע שנכנסת לתוך המקים שהאובייקטים המוכלים כבר מאותחלים) וחשוב מזה חיסכון בקריאות לפונקציה: נניח שיש לך אובייקט (לא טיפוס POD ) שמוכל בתוך האובייקט שלך. אם תשתמש בשורת האיתחול תתבצע קריאה למקים ההעתקה בלבד (קריאה אחת), אם תאתחל אותו בתוך קוד המקים יתבצעו שתי קריאות: 1. מקים של האובייקט המוכל 2. הקריאה לאיתחול לפעמים השימוש בשורת האיתחול הוא לא רק יתרון אלא חובה (למשל איתחול קבוע או משתנה התייחסות) איל לופו
 
למעלה