const ב CLASS

g u y c o h e n

New member
const ב CLASS

האם ניתן להגדיר חבר במחלקה כ CONST ? אם כן? לאתחל אותו ? מה נוצר בזיכרון , האם לכל אובייקט יש משתנה או שיש אחד לכולם כמו סטטי? אם לא: אפשר להשתמש ב ENUM אך מה אז נוצר בזיכרון ?
 

cyberia2ooo

New member
אמממ

אפשר להגדיר משתנה const במחלקה והאיתחול שלו נעשה בקונסרטקטור כמו איתחול של מחלקת אב (שכחתי מה השם של איתחול בצורה של קונסטרקטור) בקיצור זה נראה כך:
class A { public: A(); A(int _var); private: const int var; }; A::A():var(0) { } A::A(int _var):var(_var) { }​
 

cyberia2ooo

New member
ונוצר עותק של המשתנה לכל

אירוע של המחלקה מפני שכפי שאתה רואה בדוגמא שלי, אפשר להכניס לו ערך בצורה דינמית כפרמטר לקונסטרקטור.
 

gmorphus

New member
הוא חבר במחלקה

הוא לא סטטי. בדיוק בשביל המציאו את הstatic. מה שמיוחד בקבוע הזה שמהרגע שיצרת את האובייקט שלך אתה לא יוכל לשנות אותו יותר.
 

g u y c o h e n

New member
מה קורה

ב ENUM מבחינת הזיכרון. הם לא משוכפלים לכל אובייקט, הם כמו קבועים של המחלקה ( לא של האובייקט ) ?
 

cyberia2ooo

New member
מבחינת זכרון אם אני לא טועה

ENUM עובד כמו מאקרו... אבל ממש ממש לא סגור על זה
 
לדעתי

ENUM עובד כמו קבוע סטטי נגיד
enum {var=3}; זה כמו static const int var=3;​
(אם אני לא טועה)
 

IdanR

New member
לא לגמרי....

הרי טיפוס מסוג enum לא יכול לקבל ערכים שאינם חלק מרשימת הקבועים השייכת לו, אלא אם כן משתמשים בהסבה מפורשת. הערכים עצמם הם, קבועים.
 
אני לא בטוח על מה אתה מדבר

אני מדבר על enum בלי שם ובלי מופע. ככה לפחות היו מגדירים פעם static const לפני שהשפה תמכה בזה (מתוך ticpp פרק 10):
static const int size = 100; would be instead: enum { size = 100 }; Although you’ll often see the enum technique in legacy code, the static const feature was added to the language to solve just this problem. However, there is no overwhelming reason that you must choose static const over the enum hack, and in this book the enum hack is used because it is supported by more compilers at the time this book was written.​
 

gmorphus

New member
enum זה שום דבר

זה נועד רק בשבילך ובשביל הקומפיילר. כשאתה מגדיר enum, למשל
enum DAY { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };​
אז למעשה זה כמעט כאילו יש לך שבעה define-ים מאחד עד 7. הDAY זהו הטיפוס שלך, שנועד בשביל הקומפיילר, כדי שיוכל להגיד לך אם אתה מנסה להכניס לתוך משתנה מטיפוס DAY ערך שהוא לא מתוך הרשימה, אבל למעשה, כאשר את מצהיר על משתנה מטיפוס DAY זה שקול לint מבחינת המקום שהוא תופס בזיכרון וגם מכל שאר הבחינות כשהוא נמצא בתוך אובייקט. כמו שאמרת הטיפוס החדש הזה שיצרת מגדיר לך עוד define, שכמובן שלא משוכפלים לכל אובייקט במחלקה. אבל הם לא קבועים של המחלקה - אולי התכוונת לסטטיים, אבל גם זה לא מדויק. קבועים, כמו שהסברתי הם בסה"כ משתנים בתוך האובייקט שאחרי שהוא נוצר אתה לא יכול לשנות אותם. יש מבין?
 

g u y c o h e n

New member
תודה על ההסבר ו..

האם ניתן לאמר בעצם שזה יוצר תת קבוצה של int (במקרה הזה) , מעין טיפוס חדש?
 

gmorphus

New member
תת קבוצה של int?

אני לא יודע בדיוק למה אתה מתכוון, אבל בהחלט אפשר להגיד שזה יותר טיפוס נתונים חדש - אבל זה נכון רק מבחינת נקודת המבט של הקומפיילר (והמתכנת כמובן). למעשה כל enum הוא בסה"כ מספר בזיכרון. בכל מקרה, טיפוס הנתונים עצמו לא תופס כמובן מקום בזיכרון. רק משתנים מהטיפוס החדש שהגדרנו תופסים מקום בזיכרון (של int).
 

IdanR

New member
זה נקרא MIL

Member Initialization List אפשר להתחל בצורה זו כל data member, בין אם זה אובייקט מוכל, משתנה קבוע, מצביע, או מחלקת אב, שממנה נורשת המחלקה. יוצא דופן הוא כמובן משתנה סטטי.
 
למעלה