שאלה קטנה בcpp

vinney

Well-known member
כמו ההבדל בין כוס לברז

בשניהם יש מים, רק שבאחד הם נוזלים, ואילו השני עומד על השולחן... const לא מאפשר (ברמת הקומפיילר) לשנות את המשתנה. אם מדובר בפונקציה, אז זה אומר שהיא לא עושה שינויים, אלא רק חישובים וערך מוחזר. static אומר שהמשתנה הוא גלובלי לכל האובייקטים של המחלקה, ושינוי באובייקט אחד יגרור שינוי גם בכל שאר האובייקטים. משתנה כזה מחוץ למחלקה הוא גלובלי בזכרון (עם טווח ההגדרה כמו של כל משתנה), ונשמר בין עדכון לעדכון, גם אם בכניסות שונות לאותה פונקציה.
 

Mapisto

New member
לפי מה שכתבת

אני לא ממש מוצא את ההבדל בין static לprivate
 

Mapisto

New member
בעעעעעעע

אם אני שולח משתנה static לפונקציה והיא משנה אותו, הוא משתנה לפי מה שכתבת. טווח ההכרה שלו הוא ברמת המחלקה (או ברמה גלובלית אם אני מצהיר אותו בחוץ). אז מה ההבדל בינו לבין משתנה רגיל?
 

nirtheking

New member
אז הנה ההבדל

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

nirtheking

New member
עוד הבדל

משתנה סטטי חייב להיות לא הרשאת גישה public לעומת משתנה רגיל שיכול להיות עם איזה הרשאת גישה שהמפתח רוצה
 

vinney

Well-known member
זה דווקא לא נכון

הרי לך דוגמא שלקחתי הרגע מMSDN:
class SavingsAccount { public: static void setInterest( float newValue ) // Member function { currentRate = newValue; } // that accesses // only static // members private: char name[30]; float total; static float currentRate; // One copy of this member is // shared among all instances // of SavingsAccount };​
 

nirtheking

New member
אז כדאי שאני אלמד לפני שאני מדבר

 

vinney

Well-known member
ההבדל מתבטא בכך ש...

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

Mapisto

New member
ועוד בעיה מאוד מוזרה

HC5011: Error: showstring.hpj : Cannot open the file "ShowStringx.hm."​
מישהו אולי יכול להבין למה הוא לא יכול לפתוח את הקובץ הזה?
 

אוריקס

New member
ככה:

const הוא קבוע שלא ניתן לשינוי ברמת הקומפיילר. עכשיו ל static... משתנה סטאטי הוא משתנה ששייך למחלקה כולה ולא ל instance שלה. מה שאומר, שאתה משנה אותו פעם אחת - משמע שינית אותו "בשביל כל המחלקות". דוגמא קטנה (JAVA, אבל הרעיון דומה בכל השפות):
public Class MapistoIsTheMan{ public static int x; } MapistoIsTheMan y = new MapistoIsTheMan; MapistoIsTheMan z = new MapistoIsTheMan; y.x = 5; System.out.println(y.x) //Prints 5 z.x = 7; System.out.println(y.x) //Prints 7​
 

אוריקס

New member
תיקון קטן:

public Class MapistoIsTheMan{ public static int x; } MapistoIsTheMan y = new MapistoIsTheMan(); MapistoIsTheMan z = new MapistoIsTheMan(); y.x = 5; System.out.println(y.x) //Prints 5 z.x = 7; System.out.println(y.x) //Prints 7​
 

selalerer

New member
תוספות: (אך.. "תלמדו ישר ++C")

לconst ו static יש שימושים גם בפונקציות רגילות (בתכנות פרוצדורלי) אשר כמובן ניתן לשימוש גם בשיטות של מחלקה. כאשר אתה מכריז על משתנה static בפונקציה אז הוא ישמור על הערך שלו כל פעם שתיכנס לפונקציה. למשל נסה את הפונקציה הזאת ותבין על מה מדובר:
void printNum(void) { static int num=0; std::cout << num << std::endl; }​
(הרץ אותה כמה פעמים. לconst יש מספר שימושים בהתאם לעל יד מה שמים אותו. באופן כללי הוא לא נותן לשנות את המשתנה/פרמטר/ערך מוחזר שעל ידו שמים אותו, עם פויינטרים זה קצת יותר מורכב, בגלל שאתה יכול לעשות את הפויינטר עצמו קבוע (לא יכול להצביע על משהו אחר) או את הערך המוצבע על ידי הפויינטר לא ניתן לשינוי בעזרת שימוש בפויינטר הזה, יש על זה פרק שלם ב++Thinking in C .
 

selalerer

New member
סליחה, טעות בקוד.

הקוד הנכון:
void printNum(void) { static int num=0; std::cout << num << std::endl; num++; }​
 
למעלה